FreeBSD 使用手册
上一页 | 第18章 　存储 | 下一页

# 18.12 备份程序

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

## 18.12.1 Dump 和 Restore

`dump` 和 `restore` 是 UNIX® 传统的备份程序。 它以 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）， 就不能用默认的参数， 而要另外指定参数。 这些默认值必须在命令行被修改以更好地利用当前磁带机的功能。

`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`：

例 18-2. 通过设置 ssh 环境变量 `RSH` 使用 `dump`

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

## 18.12.2 `tar`

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`。

## 18.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`）。

## 18.12.4 `pax`

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

## 18.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 取得，它并非系统默认安装的。

## 18.12.6 Do Nothing 备份策略

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

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

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

## 18.12.7 哪个备份程序最好？

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

## 18.12.8 应急恢复程序

### 18.12.8.1 在出现灾难前

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

第一，打出您的每个磁盘驱动器的磁盘标签 (例如： `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."

### 18.12.8.2 出现灾难后

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

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

如果硬件还能用， 检查一下您的软盘。 如果使用定制的引导软盘， 启动单用户模式 (在 `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>.