> For the complete documentation index, see [llms.txt](https://handbook.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://handbook.bsdcn.org/di-21-zhang-cun-chu/21.8.-bei-fen-de-ji-chu-zhi-shi.md).

# 21.8.备份的基础知识

实现备份计划对于从磁盘故障、意外文件删除、随机文件损坏或整台机器销毁（包括现场备份遭到销毁的情况）中恢复数据至关重要。

备份类型和计划将根据数据的重要性、文件恢复所需的粒度以及可接受的停机时间而有所不同。一些可能的备份技术包括：

* 将整个系统的档案备份到永久的异地存储媒介。这可防止上述所有问题，但恢复过程较慢且不便，尤其对于非特权用户来说。
* 文件系统快照，对于恢复已删除的文件或文件的先前版本非常有用。
* 将整个文件系统或磁盘的副本与网络上的另一个系统同步，使用计划任务来执行 [net/rsync](https://cgit.freebsd.org/ports/tree/net/rsync/)。
* 硬件或软件 RAID，可在磁盘故障时最小化或避免停机。

通常，使用多种备份技术的组合。例如，可创建计划，自动完成每周的完整系统备份，并将备份异地存储，此外，使用每小时的 ZFS 快照来补充此备份。另外，在文件编辑或删除之前，也可手动备份单个目录或文件。

本节说明了可用于在 FreeBSD 系统上创建和管理备份的一些工具。

## 21.8.1. 文件系统备份

传统的 UNIX® 文件系统备份程序是 [dump(8)](https://man.freebsd.org/cgi/man.cgi?query=dump\&sektion=8\&format=html)，它用于创建备份，和 [restore(8)](https://man.freebsd.org/cgi/man.cgi?query=restore\&sektion=8\&format=html)，它用于恢复备份。这些工具在磁盘块级别工作，位于文件系统所创建的文件、链接和目录的抽象层之下。与其他备份软件不同，`dump` 会备份整个文件系统，并无法只备份文件系统的一部分或跨多个文件系统的目录树。`dump` 不是写入文件和目录，而是写入组成文件和目录的原始数据块。

> **注意**
>
> 如果在根目录上使用 `dump`，它将不会备份 **/home**、**/usr** 或许多其他目录，因为这些通常是其他文件系统的挂载点或指向那些文件系统的符号链接。

在用于恢复数据时，`restore` 默认会将临时文件存储在 **/tmp/** 中。如果使用的是带有小 **/tmp** 的恢复磁盘，请将 `TMPDIR` 设置为具有更多可用空间的目录，以便恢复成功。

使用 `dump` 时，需要注意一些从 AT\&T UNIX® 第 6 版（大约 1975 年）开始的遗留问题。默认参数假定备份到 9 轨磁带，而不是其他类型的存储设备或今天可用的高密度磁带。必须在命令行上覆盖这些默认设置。

可将文件系统备份到网络上的另一个系统或连接到另一台计算机的磁带驱动器。虽然可使用 [rdump(8)](https://man.freebsd.org/cgi/man.cgi?query=rdump\&sektion=8\&format=html) 和 [rrestore(8)](https://man.freebsd.org/cgi/man.cgi?query=rrestore\&sektion=8\&format=html) 工具来实现这一目的，但它们并不视为安全。

相反，可通过 SSH 连接更安全地使用 `dump` 和 `restore`。以下示例创建了 **/usr** 的完整压缩备份，并通过 SSH 连接将备份文件发送到指定的主机。

**示例 1. 使用 `dump` 通过 ssh**

```sh
# /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \
          targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz
```

以下示例设置了 `RSH` 以便通过 SSH 连接将备份写入远程系统上的磁带驱动器：

**示例 2. 使用 `dump` 通过 ssh 并设置 `RSH`**

```sh
# env RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0 /usr
```

> **技巧**
>
> 使用 [Z 文件系统（ZFS）](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.1.-shi-shi-mo-shi-zfs-yu-zhong-bu-tong.md)的系统可使用 [zfs(8)](https://man.freebsd.org/cgi/man.cgi?query=zfs\&sektion=8\&format=html) 创建快照，并使用 [发送和接收](/di-23-zhang-z-wen-jian-xi-tong-zfs/23.4.-zfs-guan-li.md)功能向远程系统发送快照或从远程系统接收快照。

## 21.8.2. 目录备份

有几个内置工具可用于根据需要备份和恢复指定的文件和目录。

备份目录中所有文件的好选择是 [tar(1)](https://man.freebsd.org/cgi/man.cgi?query=tar\&sektion=1\&format=html)。这个工具自 AT\&T UNIX® 第 6 版以来便存在，默认情况下假定备份是递归地写入本地磁带设备。可使用选项指定备份文件的名称。

以下示例创建了当前目录的压缩备份，并将其保存到 **/tmp/mybackup.tgz**。创建备份文件时，确保备份文件不会保存到正在备份的同一目录中。

**示例 3. 使用 `tar` 备份当前目录**

```sh
# tar czvf /tmp/mybackup.tgz .
```

要恢复整个备份，`cd` 到目标目录并指定备份文件的名称。请注意，这将覆盖恢复目录中任何更新的文件版本。如果不确定，建议恢复到临时目录，或者指定备份中的文件名称恢复。

**示例 4. 使用 `tar` 恢复当前目录**

```sh
# tar xzvf /tmp/mybackup.tgz
```

有许多可用的选项，详见 [tar(1)](https://man.freebsd.org/cgi/man.cgi?query=tar\&sektion=1\&format=html)。该工具还支持使用排除模式来指定在备份指定目录或从备份中恢复文件时，哪些文件不应包含在内。

要使用指定的文件和目录列表创建备份，[cpio(1)](https://man.freebsd.org/cgi/man.cgi?query=cpio\&sektion=1\&format=html) 是不错的选择。与 `tar` 不同，`cpio` 并不知道如何遍历目录树，必须提供要备份的文件列表。

例如，可使用 `ls` 或 `find` 创建文件列表。以下示例创建了当前目录的递归列表，并将其传递给 `cpio`，以便创建名为 **/tmp/mybackup.cpio** 的输出备份文件。

**示例 5. 使用 `ls` 和 `cpio` 创建当前目录的递归备份**

```sh
# ls -R | cpio -ovF /tmp/mybackup.cpio
```

尝试结合 `tar` 和 `cpio` 提供的功能的备份工具是 [pax(1)](https://man.freebsd.org/cgi/man.cgi?query=pax\&sektion=1\&format=html)。多年来，`tar` 和 `cpio` 的各个版本变得有些不兼容。POSIX® 创建了 `pax`，它试图读取和写入许多不同的 `cpio` 和 `tar` 格式，以及其自身的新格式。

`pax` 相当于前面示例的操作如下：

**示例 6. 使用 `pax` 备份当前目录**

```sh
# pax -wf /tmp/mybackup.pax .
```

## 21.8.3. 使用数据磁带进行备份

虽然磁带技术不断发展，但现代备份系统往往将离线备份与本地可移动存储设备相结合。FreeBSD 支持任何使用 SCSI 的磁带驱动器，如 LTO 或 DAT。对 SATA 和 USB 磁带驱动器的支持有限。

对于 SCSI 磁带设备，FreeBSD 使用 [sa(4)](https://man.freebsd.org/cgi/man.cgi?query=sa\&sektion=4\&format=html) 驱动程序和 **/dev/sa0**、**/dev/nsa0**、**/dev/esa0** 设备。物理设备名称是 **/dev/sa0**。当使用 **/dev/nsa0** 时，备份应用程序在写入文件后不会回绕磁带，这能将多个文件写入磁带。使用 **/dev/esa0** 会在设备关闭后弹出磁带。

在 FreeBSD 中，`mt` 用于控制磁带驱动器的操作，如在磁带上查找文件或写入磁带控制标记。例如，可在写入新文件之前跳过磁带上的前三个文件，从而保留这些文件：

```sh
# mt -f /dev/nsa0 fsf 3
```

该工具支持许多操作。有关详细信息，请参见 [mt(1)](https://man.freebsd.org/cgi/man.cgi?query=mt\&sektion=1\&format=html)。

要使用 `tar` 向磁带写入单个文件，请指定磁带设备的名称和要备份的文件：

```sh
# tar cvf /dev/sa0 file
```

要从磁带上的 `tar` 存档恢复文件到当前目录：

```sh
# tar xvf /dev/sa0
```

要备份 UFS 文件系统，使用 `dump`。以下示例备份 **/usr**，并在完成后不回绕磁带：

```sh
# dump -0aL -b64 -f /dev/nsa0 /usr
```

要从磁带上的 `dump` 文件交互式恢复文件到当前目录：

```sh
# restore -i -f /dev/nsa0
```

## 21.8.4. 第三方备份工具

FreeBSD Ports 提供了许多第三方工具，可用于调度备份的创建、简化磁带备份，并使备份变得更加方便和便捷。许多这些应用程序基于客户端/服务器架构，可用于自动化单一系统或网络中所有计算机的备份。

一些流行的工具包括：

* Amanda ([misc/amanda-server](https://cgit.freebsd.org/ports/tree/misc/amanda-server/) 和 [misc/amanda-client](https://cgit.freebsd.org/ports/tree/misc/amanda-client/))，
* Bacula ([sysutils/bacula13-server](https://cgit.freebsd.org/ports/tree/sysutils/bacula13-server/) 和 [sysutils/bacula13-client](https://cgit.freebsd.org/ports/tree/sysutils/bacula13-client/))，
* Bareos ([sysutils/bareos-server](https://cgit.freebsd.org/ports/tree/sysutils/bareos-server/) 和 [sysutils/bareos-client](https://cgit.freebsd.org/ports/tree/sysutils/bareos-client/))，
* [net/rsync](https://cgit.freebsd.org/ports/tree/net/rsync/)，
* [sysutils/duply](https://cgit.freebsd.org/ports/tree/sysutils/duply/)，以及
* [sysutils/duplicity](https://cgit.freebsd.org/ports/tree/sysutils/duplicity/)。

## 21.8.5. 紧急恢复

除了常规备份外，建议将以下步骤作为紧急准备计划的一部分来执行。

创建以下命令输出的打印副本：

* `gpart show`
* `more /etc/fstab`
* `pkg prime-list`
* `dmesg`

将这些打印副本和安装盘的副本存储在安全的位置。如果需要紧急恢复，请引导进入安装盘并选择 `Live CD` 以访问恢复 shell。此恢复模式可用于查看系统的当前状态，如果需要，可重新格式化磁盘并从备份中恢复数据。

接下来，测试恢复 shell 和备份。记录下操作流程，并将这些笔记与安装盘、打印副本和备份一起存储。这些笔记可在紧急恢复时避免因压力过大而不小心销毁备份。

为了增加安全性，建议将最新的备份存储在与计算机和磁盘驱动器物理分隔较远的远程位置。
