有三个主要的备份程序 dump(8)、tar(1) 和 cpio(1)。
dump 和 restore 是 UNIX® 传统的备份程序。它以 block 而不是以文件为单位来备份数据、链接或目录。 dump 备份的是设备上的整个文件系统,不能只备份一 一个文件系统的部分或是用到两个以上文件系统的目录树。 dump 不会写文件和目录到磁带机,而是写入包含文件 和目录的原始数据块。
注意: 如果在您的 root 目录使用 dump ,将不需要 备份 /home、/usr 或其他目录, 因为这些是典型的其他文件系统或符号连接到那些文件系统的加载点。
dump 是最早出现于 AT&T UNIX 的 Version 6 (约 1975)。 默认的参数适用于 9-track 磁带(6250 bpi),所以如果要用高密度的磁带(最高可达 62,182 ftpi),就不能用默认的参数,而要另外指定参数。这些默认值必须在命令行被 修改以更好地利用当前磁带机的功能。
rdump 和 rrestore 可以通过网络在另一 台计算机的磁带机上备份数据。这两个程序都是依靠 rcmd(3) 和 ruserok(3) 来访问远程的磁带机。因此,运行备份的用户必须要有远程 主机的 .rhosts 访问权。rdump 和 rrestore 的参数必须适用于远程主机(例如,当您从 FreeBSD 连到 一台 SUN 工作站 knomodo 去使用磁带机时,使用:
# /sbin/rdump 0dsbfu 54000 13000 126 komodo:/dev/nsa8 /dev/da0a 2>&1
要注意的是:必须检查您在使用 .rhosts 时的安全情况。
也可以通过使用 ssh 用一个更安全的方式来使用 dump 和 restore 。
例 18-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:
tar(1) 也同样是在第 6 版 AT&T UNIX (大约是 1975 前后) 出现的。 tar 对文件系统直接操作; 其作用是把文件和目录写入磁带。 tar 并不支持 cpio(1) 所提供的全部功能, 但也不需要 cpio 所需要使用的诡异的命令行管道。
在 FreeBSD 5.3 和更高版本中, 同时提供了 GNU tar 和默认的 bsdtar。 GNU 的版本可以通过 gtar 来使用。 它通过与 rdump 一样的语法来支持远程设备。 要 tar 到连接在名为 komodo 的 Sun 机器上的 Exabyte 磁带机, 可以使用:
# /usr/bin/gtar cf komodo:/dev/nsa8 . 2>&1
您也可以让 bsdtar 通过管道和 rsh 将数据发送到远程的磁带机上。
# tar cf - . | rsh hostname dd of=tape-device obs=20b
如果您担心通过网络备份会有安全问题,应当使用 ssh , 而不是 rsh。
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)。
pax(1) 是符合 IEEE/POSIX® 标准的程序。多年来各种不同版本 的 tar 和 cpio 间有些不兼容。 为了防止这种情况,并使其标准化,POSIX 出了这套新的工具程序。 pax 尝试可以读写各种 cpio 和 tar 的格式,并可以自己增加新的格式。它的命令 集比 tar 更接近 cpio。
Amanda (Advanced Maryland Network Disk Archiver) 并非单一的程序,而是一个客户机/服务器模式的备份系统 。一台 Amanda 服务器可以备份任意数量执行 Amanda 的客户机或是将连上 Amanda 服务器的计算机上的数据备份到一台磁带机上。一个常见的问题是,数据写入磁带机的时间将超 过取行数据的时间,而 Amanda 解决了这个问题。它使用一个 “holding disk” 来同时备份几个文件系统。 Amanda 建立 “archive sets” 的一组磁带,用来备份在 Amanda 的配置文件中所列出的完整的文件系统。
Amanda 配置文件提供完整的备份控制及 Amanda 产生的网络传输。 Amanda 可以使用上述任何一个设备程序来向磁带写入数据。Amanda 可以从 port 或 package 取得,它并非系统默认安装的。
“Do nothing” 不是一个程序,而是被广泛使用的备份策略。 不需要预算,不需要备份的计划表,全部都不用。如果您的数据发生了什么问题, 忽略它!
如果您的时间和数据不值得您做这些事,那么 “Do nothing” 将是最好的备份程序。要注意的是,UNIX 是相当好用的工具,您可能在几个月 内,就发现您已经收集了不少对您来说相当具有价值的文件和程序。
“Do nothing” 对于像 /usr/obj 和其他 可由您的计算机产生的文件来说,是最好的方法。例如这本手册包含有 HTML 或 PostScript® 格式的文件。这些文档格式是从 SGML 输入文件创建的。创建 HTML 或 PostScript 格式的文件的备份就没有必要了。只要经常备份 SGML 文件就够了。
在dump(8) 时期 Elizabeth D. Zwicky 测试了所有以上列出的备份程序。在各种各样怪异的文件系统中, dump 是您明智的选择。Elizabeth 建立起各种各样、 奇怪或常见的文件系统,并用各种备份程序,测试在各种文件系统上备份 及恢复数据。这些怪异之处包括:具有 holes 和一个 nulls block 的文件, 文件名具有有趣字符,无法读写的文件及设备,在备份时改变文件大小,在 备份时建立或删除的文件。她将结果刑在: LISA V in Oct. 1991. See torture-testing Backup and Archive Programs.
在遇到灾难前,只需要执行以下四个步骤:
第一,打出您的每个磁盘驱动器的磁盘标签 (例如: bsdlabel da0 | lpr),文件系统表, (/etc/fstab) ,以及所有启动信息, 并将其复制两份。
第二,确定遇到的情况时,用来启动及修复的软盘 (boot.flp 和 fixit.flp) 具有您所有的设备代号。最简单的方法是用软盘启动,然后检查启动信息, 如果设备都被列出,并且可以正常使用,就可以跳到第三步。
否则,必须建立两张传统的可启动软盘,并包含: fdisk, bsdlabel, newfs, mount, 以及所有使用的 备份程序。这些程序必须被静态的连接。如果使用的是 dump, 那么这张软盘就必须包含 restore。
第三,定期将数据备份到磁带。任何在上次备份后的改变都无法恢复。记得将 磁盘写保护。
第四,测试在第二步所建立的软盘及备份的磁带,将过程记录下来,并和这张 可启动的软盘和磁带放在一起。也许您在恢复时会想要,而这份记录将防止您破坏 您的磁带 (怎么说呢?因为您可能将 tar xvf /dev/sa0 打成 tar cvf /dev/sa0 而重写了备份磁带)。
为了安全,您可以每次都做两份备份磁带及一张启动磁盘,并将其中 一份备份磁带存放在其它地方。其它地方不是指同一栋办公大楼的地下室 (世贸中心的一些公司应该学到了一些教训),而是真的要让人的磁带离您 的的计算机远远的。
例 18-3. 一个建立启动磁盘的 shell 脚本例子:
#!/bin/sh # # create a restore floppy # # format the floppy # PATH=/bin:/sbin:/usr/sbin:/usr/bin fdformat -q fd0 if [ $? -ne 0 ] then echo "Bad floppy, please use a new one" exit 1 fi # place boot blocks on the floppy # bsdlabel -w -B /dev/fd0c fd1440 # # newfs the one and only partition # newfs -t 2 -u 18 -l 1 -c 40 -i 5120 -m 5 -o space /dev/fd0a # # mount the new floppy # mount /dev/fd0a /mnt # # create required directories # mkdir /mnt/dev mkdir /mnt/bin mkdir /mnt/sbin mkdir /mnt/etc mkdir /mnt/root mkdir /mnt/mnt # for the root partition mkdir /mnt/tmp mkdir /mnt/var # # populate the directories # if [ ! -x /sys/compile/MINI/kernel ] then cat << EOM The MINI kernel does not exist, please create one. Here is an example config file: # # MINI -- A kernel to get FreeBSD onto a disk. # machine "i386" cpu "I486_CPU" ident MINI maxusers 5 options INET # needed for _tcp _icmpstat _ipstat # _udpstat _tcpstat _udb options FFS #Berkeley Fast File System options FAT_CURSOR #block cursor in syscons or pccons options SCSI_DELAY=15 #Be pessimistic about Joe SCSI device options NCONS=2 #1 virtual consoles options USERCONFIG #Allow user configuration with -c XXX config kernel root on da0 swap on da0 and da1 dumps on da0 device isa0 device pci0 device fdc0 at isa? port "IO_FD1" bio irq 6 drq 2 vector fdintr device fd0 at fdc0 drive 0 device ncr0 device scbus0 device sc0 at isa? port "IO_KBD" tty irq 1 vector scintr device npx0 at isa? port "IO_NPX" irq 13 vector npxintr device da0 device da1 device da2 device sa0 pseudo-device loop # required by INET pseudo-device gzip # Exec gzipped a.out's EOM exit 1 fi cp -f /sys/compile/MINI/kernel /mnt gzip -c -best /sbin/init > /mnt/sbin/init gzip -c -best /sbin/fsck > /mnt/sbin/fsck gzip -c -best /sbin/mount > /mnt/sbin/mount gzip -c -best /sbin/halt > /mnt/sbin/halt gzip -c -best /sbin/restore > /mnt/sbin/restore gzip -c -best /bin/sh > /mnt/bin/sh gzip -c -best /bin/sync > /mnt/bin/sync cp /root/.profile /mnt/root chmod 500 /mnt/sbin/init chmod 555 /mnt/sbin/fsck /mnt/sbin/mount /mnt/sbin/halt chmod 555 /mnt/bin/sh /mnt/bin/sync chmod 6555 /mnt/sbin/restore # # create minimum file system table # cat > /mnt/etc/fstab <<EOM /dev/fd0a / ufs rw 1 1 EOM # # create minimum passwd file # cat > /mnt/etc/passwd <<EOM root:*:0:0:Charlie &:/root:/bin/sh EOM cat > /mnt/etc/master.passwd <<EOM root::0:0::0:0:Charlie &:/root:/bin/sh EOM chmod 600 /mnt/etc/master.passwd chmod 644 /mnt/etc/passwd /usr/sbin/pwd_mkdb -d/mnt/etc /mnt/etc/master.passwd # # umount the floppy and inform the user # /sbin/umount /mnt echo "The floppy has been unmounted and is now ready."
关键问题是: 您的硬件是否幸免于难? 由于已经做好了定期的备份工作, 因此并不需要担心软件的问题。
如果硬件已经损毁, 这些部分应该在尝试使用计算机之前换掉。
如果硬件还能用, 检查一下您的软盘。 如果使用定制的引导软盘, 启动单用户模式 (在 boot: 提示后输入 -s)。 跳过下面一段。
如果您使用 boot.flp 和 fixit.flp 软盘, 请继续阅读。 将 boot.flp 软盘插到计算机的第一个软驱并启动机器。 此时, 最初的安装菜单将显示在屏幕上。 选择 Fixit--Repair mode with CDROM or floppy. 选项。 在得到提示后插入 fixit.flp 。 restore 以及其他需要的程序, 可以在 /mnt2/rescue (对于 FreeBSD 5.2 之前的版本, 则是 /mnt2/stand)。
分别恢复每一个文件系统
试着 mount 上您的第一个磁盘的 root 分区(例如: mount /dev/da0a /mnt)。假如这个磁盘标签已经损坏,使用 bsdlabel 来重新分割并分配磁盘标签(利用您以前保留下来的数据)。使用 newfs 来建立文件系统,并重新挂上软盘读写的 root 分区 (mount -u -o rw /mnt)。然后使用备份程序及备份磁带来修复文件系统 (例如: restore vrf /dev/sa0)。最后 Unmount 这个文件系统 (例如: umount /mnt)。对于每个损坏的文件系统都重复一次。
当您的系统正常启动后,将您的数据备份到新的磁带。任何造成数据丢失的 的灾难都可能再次发生。现在花一些时间,也许可以使您免于下次的灾难。
本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.