20.9.备份的基础知识 =================== 为了有能力从磁盘故障、意外文件删除、随机文件损坏或机器完全毁坏(包括在线备份的毁坏)中恢复,实施备份计划是至关重要的。 备份类型和计划表将有所不同,这取决于数据的重要性、文件恢复所需的粒度以及可接受的停机时间长短。一些可采用的备份技术包括: - 对整个系统的存档,备份到永久的、离线的介质上。这提供了对上述所有问题的保护,但恢复起来很慢而且不方便,特别是对非特权用户而言。 - 文件系统快照,这对恢复已删除的文件或以前的文件版本很有用。 - 整个文件系统或磁盘的副本,使用周期性的 `net/rsync `__ 与网络上的另一个系统进行同步。 - 硬件或软件 RAID,当一个磁盘发生故障时,可以最大限度地减少或避免停机。 通常情况下,各种备份技术要混合使用。例如,人们可以创建一个计划表,自动进行每周一次的全量备份,并将其离线存放,同时用每小时的 ZFS 快照来补充这一备份。此外,在进行文件编辑或删除之前,可以对个别目录或文件进行手动备份。 这一节介绍了一些可以用来创建和管理 FreeBSD 系统上的备份的工具。 20.9.1.备份文件系统 ------------------- 用于备份文件系统的传统 UNIX® 程序是 `dump(8) `__ 和 `restore(8) `__\ ,前者用于创建备份,后者用于恢复备份。这些工具在磁盘块级工作,低于文件系统所创建的文件、链接和目录的抽象。与其他备份软件不同,\ ``dump`` 备份的是整个文件系统,不能只备份某个文件系统的一部分或跨越多个文件系统的目录。\ ``dump`` 不写文件和目录,而是写构成文件和目录的原始数据块。 **注意** 如果在根目录上使用 ``dump``\ ,它将不会备份 **/home** 、\ **/usr** 或许多其他目录,因为这些目录通常是其他文件系统的挂载点或是这些文件系统的符号链接。 当用于恢复数据时,\ ``restore`` 默认在 **/tmp/** 中存储临时文件。当使用较小的 **/tmp** 做恢复盘时,请将 ``TMPDIR`` 设置为一个有更多空闲空间的目录,以便成功恢复。 当使用 ``dump`` 时,请注意它在 1975 年左右的第 6 版 AT&T UNIX® 中的一些问题仍然存在。默认参数假定备份到九轨磁带,而非其他类型的介质或今天可用的高密度磁带。必须在命令行中覆盖这些默认值。 可以通过网络将一个文件系统备份到另一个系统或连接到另一台计算机的磁带驱动器。虽然 `rdump(8) `__ 和 `rrestore(8) `__ 工具可以用于这个目的,但它们被认为是不安全的。 但是,我们可以通过 SSH 连接,以更安全的方式使用 ``dump`` 和 ``restore``\ 。这个例子创建了一个 **/usr** 的完整压缩备份,并通过 SSH 连接将备份文件发送到指定的主机上。 **例 35. 通过 SSH 使用 ``dump``** .. code:: shell-session # /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz 这个例子设置了 ``RSH``\ ,以便通过 ``SSH`` 连接将备份写到远程系统的磁带机上: **例 36. 通过 RSH 设置 ssh 使用 dump** .. code:: shell-session # env RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0 /usr 20.9.2.备份目录 --------------- 有几个内置的工具可用于根据需要备份和恢复指定的文件和目录。 `tar(1) `__ 是对一个目录中所有文件进行备份的好选择。这个工具可以追溯到第 6 版的 AT&T UNIX®,默认情况下,它假定递归备份到本地磁带设备。可以用参数来代替指定备份文件的名称。 这个例子创建了一个当前目录的压缩备份,并将其保存到 **/tmp/mybackup.tgz**\ 。当创建一个备份文件时,要确保备份不保存在被备份的同一目录下: **例 37. 用 ``tar`` 备份当前目录** .. code:: shell-session # tar czvf /tmp/mybackup.tgz . 要恢复整个备份,\ ``cd`` 进入要恢复的目录并指定备份的名称。注意,这将覆盖还原目录中任何较新版本的文件。如有疑问,可将其还原到一个临时目录或指定要还原的备份中的文件名称。 **例 38. 用 ``tar`` 恢复当前目录** .. code:: shell-session # tar xzvf /tmp/mybackup.tgz 在 `tar(1) `__ 中有几十个可用的参数。这个工具还支持使用排除模式来指定在备份指定目录或从备份中恢复文件时不应该包括哪些文件。 要使用指定的文件和目录列表来创建备份,\ `cpio(1) `__ 是一个不错的选择。与 ``tar`` 不同,\ ``cpio`` 不知道如何进入目录树,必须提供要备份的文件列表给他。 例如,可以用 ``ls`` 或 ``find`` 创建一个文件列表。这个例子创建了一个当前目录的递归列表,然后被输送到 ``cpio``\ ,以便创建一个名为 **/tmp/mybackup.cpio** 的输出备份文件。 **例 39. 使用 ``ls`` 和 ``cpio`` 对当前目录进行递归备份** .. code:: shell-session # ls -R | cpio -ovF /tmp/mybackup.cpio `pax(1) `__ 是一个试图结合 ``tar`` 和 ``cpio`` 所提供功能的备份工具。多年来,不同版本的 ``tar`` 和 ``cpio`` 变得有些不兼容。POSIX® 创造了 ``pax``\ ,它试图读写许多不同的 ``cpio`` 和 ``tar`` 格式,并加上自己的新格式。 在使用 ``pax`` 时前面的例子等效为: **例 40. 用 ``pax`` 备份当前目录** .. code:: shell-session # pax -wf /tmp/mybackup.pax . 20.9.3.使用数据磁带进行备份 --------------------------- 在磁带技术不断发展的同时,现代的备份系统倾向于将离线备份与本地可移动介质相结合。FreeBSD 支持所有使用 SCSI 的磁带机,如 LTO 或 DAT。对 SATA 和 USB 磁带机则有限支持。 对于 SCSI 磁带设备,FreeBSD 使用驱动程序 `sa(4) `__ 和设备 **/dev/sa0**, **/dev/nsa0**, 和 **/dev/esa0**\ 。物理设备的名字是 **/dev/sa0**\ 。当使用 **/dev/nsa0** 时,备份程序在写完一个文件后不会倒带,这就允许在一盘磁带上写多个文件。使用 **/dev/esa0** 会在设备关闭后弹出磁带。 在 FreeBSD 中,用 ``mt`` 来控制磁带机的操作,例如在磁带上寻找文件或向磁带上写入磁带控制标记。例如,在写一个新的文件之前,可以通过跳过它们来保留磁带上的前三个文件: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # mt -f /dev/nsa0 fsf 3 这个工具支持许多操作。详情请参考 `mt(1) `__\ 。 要用 ``tar`` 写一个文件到磁带,指定磁带设备的名称和要备份的文件: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # tar cvf /dev/sa0 file 要从磁带上的 tar 存档中恢复文件到当前目录: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # tar xvf /dev/sa0 要备份一个 UFS 文件系统,使用 ``dump``\ 。这个例子备份了 **/usr**\ ,完成后没有倒带: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # dump -0aL -b64 -f /dev/nsa0 /usr 以交互方式将文件从磁带上的转储文件恢复到当前目录: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # restore -i -f /dev/nsa0 20.9.4.第三方备份工具 --------------------- FreeBSD ports 提供了许多第三方的工具,它们可以用来安排备份的创建,简化磁带备份,并使备份更容易和更方便。这些应用程序中有许多是基于客户端/服务器的,可以用来自动备份单个系统或网络中的所有计算机。 流行的工具包括 Amanda 、Bacula 、rsync 和 duplicity。 20.9.5.紧急恢复 --------------- 除了定期备份外,建议执行以下步骤作为应急准备计划的一部分。 为以下命令的输出创建一个打印副本: - ``gpart show`` - ``more /etc/fstab`` - ``dmesg`` 把这个打印结果和安装介质的副本保存在一个安全的地方。如果需要紧急恢复,请启动安装设备并选择 ``Live CD`` 来访问救援 shell。这个救援模式可以用来查看系统的当前状态,如果需要,可以重新格式化磁盘并从备份中恢复数据。 **注意** FreeBSD/i386 11.2-RELEASE 的安装镜像不包括救援 shell。对于此版本,请从以下地址下载并刻录 Livefs CD 镜像: `ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/11.2/FreeBSD-11.2-RELEASE-i386-livefs.iso `__. 接下来,测试救援 shell 和备份,并对该过程做记录。将这些笔记与设备、打印件和备份一起保存。这些记录可以防止在执行紧急恢复的压力下不小心破坏了备份。 为了增加安全性,将最新的备份存放在一个与计算机和磁盘驱动器相隔很远的异地。