19.12. 备份程序

有三个主要的备份程序 dump(8)tar(1)cpio(1)

19.12.1. Dump 和 Restore

dumprestoreUNIX® 传统的备份程序。 它以 block 而不是以文件为单位来备份数据、链接或目录。 dump 备份的是设备上的整个文件系统, 不能只备份一个文件系统的部分或是用到两个以上文件系统的目录树。 与其他备份软件不同的是, dump 不会写文件和目录到磁带机, 而是写入包含文件 和目录的原始数据块。 当需要恢复数据的时候,restore 默认在 /tmp/ 下保存临时数据 ── 如果你正在操作的恢复盘只有比较小的 /tmp 的话, 你可能需要把环境变量 TMPDIR 设置到一个有更多空间的目录, 使得此过程更容易成功。

注意:

如果在您的 root 目录使用 dump, 将不需要备份 /home/usr 或其他目录, 因为这些是典型的其他文件系统或符号连接到那些文件系统的加载点。

dump 是最早出现于 AT&T UNIX 的 Version 6 (约 1975)。 默认的参数适用于 9-track 磁带(6250 bpi), 所以如果要用高密度的磁带(最高可达 62,182 ftpi), 就不能用默认的参数, 而要另外指定参数。 这些默认值必须在命令行被修改以更好地利用当前磁带机的功能。

rdumprrestore 可以通过网络在另一台计算机的磁带机上备份数据。 这两个程序都是依靠 rcmd(3)ruserok(3) 来访问远程的磁带机。 因此,运行备份的用户必须要有远程主机的 .rhosts 访问权。 rdumprrestore 的参数必须适用于远程主机 例如,当您从 FreeBSD 连到一台 SUN 工作站 knomodo 去使用磁带机时,使用:

# /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1

要注意的是:必须检查您在使用 .rhosts 时的安全情况。

也可以通过使用 ssh 用一个更安全的方式来使用 dumprestore

例 19.1. 通过 ssh 使用 dump
# /sbin/dump -0uan -f - /usr | gzip -2 | ssh -c blowfish \
          targetuser@targetmachine.example.com dd of=/mybigfiles/dump-usr-l0.gz

或使用 dump 的 built-in 方法, 设置环境变量 RSH

例 19.2. 通过设置 ssh 环境变量 RSH 使用 dump
# RSH=/usr/bin/ssh /sbin/dump -0uan -f targetuser@targetmachine.example.com:/dev/sa0 /usr

19.12.2. tar

tar(1) 也同样是在第 6 版 AT&T UNIX (大约是 1975 前后) 出现的。 tar 对文件系统直接操作; 其作用是把文件和目录写入磁带。 tar 并不支持 cpio(1) 所提供的全部功能, 但也不需要 cpio 所需要使用的诡异的命令行管道。

tar 到连接在名为 komodo 的 Sun 机器上的 Exabyte 磁带机, 可以使用:

# tar cf - . | rsh komodo dd of=tape-device obs=20b

如果您担心通过网络备份会有安全问题,应当使用 ssh , 而不是 rsh

19.12.3. cpio

cpio(1)UNIX® 最早用来作文件交换的磁带机程序。它有执行字节 交换的选项,可以用几种不同的格式写入,并且可以将数据用管道传给其他程序。 cpio 没办法自动查找目录树内的文件列表,必须通过标准 输入 stdin 来指定。

cpio 不支持通过网络的备份方式。可以使用 pipeline 和 rsh 来传送数据给远程的磁带机。

# for f in directory_list; do
find $f >> backup.list
done
# cpio -v -o --format=newc < backup.list | ssh user@host "cat > backup_device"

这里的 directory_list 是要备份的目录列表, user@host 结合了将 要执行备份的用户名和主机名,backup_device 是写 入备份的设备(如 /dev/nsa0)。

19.12.4. pax

pax(1) 是符合 IEEE/POSIX® 标准的程序。多年来各种不同版本 的 tarcpio 间有些不兼容。 为了防止这种情况,并使其标准化,POSIX® 出了这套新的工具程序。 pax 尝试可以读写各种 cpiotar 的格式,并可以自己增加新的格式。它的命令 集比 tar 更接近 cpio

19.12.5. Amanda

Amanda (Advanced Maryland Network Disk Archiver) 并非单一的程序,而是一个客户机/服务器模式的备份系统 。一台 Amanda 服务器可以备份任意数量执行 Amanda 的客户机或是将连上 Amanda 服务器的计算机上的数据备份到一台磁带机上。一个常见的问题是,数据写入磁带机的时间将超 过取行数据的时间,而 Amanda 解决了这个问题。它使用一个 holding disk 来同时备份几个文件系统。 Amanda 建立 archive sets 的一组磁带,用来备份在 Amanda 的配置文件中所列出的完整的文件系统。

Amanda 配置文件提供完整的备份控制及 Amanda 产生的网络传输。 Amanda 可以使用上述任何一个设备程序来向磁带写入数据。Amanda 可以从 port 或 package 取得,它并非系统默认安装的。

19.12.6. Do Nothing 备份策略

Do nothing 不是一个程序,而是被广泛使用的备份策略。 不需要预算,不需要备份的计划表,全部都不用。如果您的数据发生了什么问题, 忽略它!

如果您的时间和数据不值得您做这些事,那么 Do nothing 将是最好的备份程序。要注意的是,UNIX® 是相当好用的工具,您可能在几个月 内,就发现您已经收集了不少对您来说相当具有价值的文件和程序。

Do nothing 对于像 /usr/obj 和其他 可由您的计算机产生的文件来说,是最好的方法。例如这本手册包含有 HTML 或 PostScript® 格式的文件。这些文档格式是从 SGML 输入文件创建的。创建 HTML 或 PostScript® 格式的文件的备份就没有必要了。只要经常备份 SGML 文件就够了。

19.12.7. 哪个备份程序最好?

dump(8) 时期 Elizabeth D. Zwicky 测试了所有以上列出的备份程序。在各种各样怪异的文件系统中, dump 是您明智的选择。Elizabeth 建立起各种各样、 奇怪或常见的文件系统,并用各种备份程序,测试在各种文件系统上备份 及恢复数据。这些怪异之处包括:具有 holes 和一个 nulls block 的文件, 文件名具有有趣字符,无法读写的文件及设备,在备份时改变文件大小,在 备份时建立或删除的文件。她将结果写在: LISA V in Oct. 1991. 参阅 torture-testing Backup and Archive Programs.

19.12.8. 应急恢复程序

19.12.8.1. 在出现灾难前

在遇到灾难前,只需要执行以下四个步骤:

第一,打出您的每个磁盘驱动器的磁盘标签 (例如: bsdlabel da0 | lpr),文件系统表, (/etc/fstab) ,以及所有启动信息, 并将其复制两份。

第二, 刻录一张 livefs CDROM。 这个 CDROM 包含了用于引导进入 FreeBSD livefs 修复模式的支持, 这种模式允许用户执行许多任务, 例如执行 dump(8)restore(8)fdisk(8)bsdlabel(8)newfs(8)mount(8), 等等。 Livefs CD 映像文件随 FreeBSD/i386 11.2-RELEASE 提供, 可以从 ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/ISO-IMAGES/11.2/FreeBSD-11.2-RELEASE-i386-livefs.iso 获得。

第三,定期将数据备份到磁带。任何在上次备份后的改变都无法恢复。记得将 磁盘写保护。

第四, 测试在第二步所建立的 livefs CDROM 及备份的磁带。 写下笔记, 并和这张 CDROM、 打印副本以及磁带放在一起。 您在需要恢复数据时可能正心慌意乱, 而这些记录可能会帮助您避免毁掉备份磁带 (怎么会发生这种情况呢? 举例来说, 本应执行 tar xvf /dev/sa0 命令时, 您可能会不小心输入 tar cvf /dev/sa0, 从而覆盖备份磁带)。

保险起见, 您可以制作两份 livefs CDROM 和备份磁带。 其中一份应放到其它地方, 这里说的其他地方当然不是指同一栋办公楼的地下室, 世贸中心的一大批公司已经学到了血的教训。 保存这份备份的位置应该与您的计算机和磁盘驱动器越远越好。

19.12.8.2. 出现灾难后

关键问题是: 您的硬件是否幸免于难? 由于已经做好了定期的备份工作, 因此并不需要担心软件的问题。

如果硬件已经损坏, 这些部分应该在尝试使用计算机之前换掉。

如果硬件还能用, 将 livefs CDROM 插入 CDROM 驱动器并引导系统。 您将看到最初安装系统时的菜单。 选择正确的国家之后, 选择 Fixit -- Repair mode with CDROM/DVD/floppy or start a shell 选项, 然后再选择 CDROM/DVD -- Use the live filesystem CDROM/DVD 这项。 您可以使用 restore 以及其他位于 /mnt2/rescue 的工具。

分别恢复每一个文件系统

试着 mount (例如: mount /dev/da0a /mnt) 第一个磁盘上的 root 分区。 如果 bsdlabel 已经毁坏, 则需要使用 bsdlabel 根据您先前打印存档的记录来重新分区并分配磁盘标签。 接着使用 newfs 重建文件系统。 以读写方式重新挂载磁盘的根分区 (mount -u -o rw /mnt)。 使用您的备份程序以及备份磁带恢复文件系统数据 (例如 restore vrf /dev/sa0)。 最后卸下文件系统 (例如 umount /mnt)。 对于毁掉的其他文件系统, 重复执行前面这些操作。

当您的系统正常启动后, 将您的数据备份到新的磁带。 任何造成数据丢失的的灾难都可能再次发生。 现在花一些时间, 也许可以在下次发生灾难时救您一把。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.