# 20.8.备份的基础知识

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

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

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

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

本节描述了可以用来在 FreeBSD 系统上创建和管理备份的一些工具。

## 20.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）](https://docs.freebsd.org/en/books/handbook/zfs/#)的系统可以使用[zfs(8)](https://man.freebsd.org/cgi/man.cgi?query=zfs\&sektion=8\&format=html)来创建快照，并使用[发送和接收](https://docs.freebsd.org/en/books/handbook/zfs/#zfs-zfs-send)功能在远程系统之间进行传输。

## 20.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 .
```

## 20.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
```

## 20.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/).

## 20.8.5. 紧急恢复

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

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

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

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

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

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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://handbook.bsdcn.org/di-20-zhang-cun-chu/20.8.-shi-yong-ntfs-ci-pan.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
