当前位置:Linux教程 - Linux - Linux机器备份(二)

Linux机器备份(二)



        
    第四章 配置工具


    下载 star 源代码

    无论您用什么介质备份(磁带或者别的),您都需要 star 程序。您可以在 ftp://ftp.fokus.gmd.de/pub/unix/star/alpha/ 找到最新的 star 源代码(目前最新版本是 star-1.3a8.tar.gz)。下载了这个程序以后,请按照以下步骤安装……

    star 编译...

    # tar xzvf star-1.3a8.tar.gz
    # cd star-1.3
    # make

    在所有内容编译好后,我们就要安装 star 了。千万不要运行“make install”;它会安装几个我们并不想安装的附加组件。请您依据下一屏内容进行安装。

    ...和安装

    # install -m0755 star/OBJ/*/star /usr/bin
    # cd ../..

    现在请您到“star”源目录下。然后,如果您的系统 FHS 2.1 兼容并且手册页存在 /usr/share/man 目录下,请把最后一行正确地修改为:


    # gzip -9 star.1
    # install -m0644 star.1.gz /usr/man/man1


    mt

    现在,轮到 mt 命令了。mt 用于执行各种各样的磁带功能,如回卷、弹出、前进到下一文件标记等。由于 mt 与磁带相关,只有在要把数据直接备份到磁带上的时候您才会用到这个命令。可能您已经安装了某一版本的 mt;请确认它支持“setblk”命令(输入“man mt”试试看)。如果不支持,或者您只是想确保运行的是可用的最新最好的 mt 版本,您可以在下面的指导下从源码开始安装 mt-st-0.6。

    下载 mt

    首先,从 http://www.ibiblio.org/pub/linux/system/backup/ 下载 mt-st 源码(最新版本是 mt-st-0.6.tar.gz)。然后,按照下一屏上的步骤解压缩、编译和安装……

    mt 的编译和安装

    # tar xzvf mt-st-0.6
    # cd mt-st-0.6
    # make
    # install -m0755 mt /usr/sbin
    # install -m0755 stinit /usr/sbin
    # gzip -9 mt.1 stinit.8
    # install -m0644 mt.1.gz /usr/man/man1
    # install -m0644 stinit.8.gz /usr/man/man8

    现在,mt(和 stinit)就会被安装了。我建议您看一下 /usr/bin、/bin 以及 /sbin 目录下是否仍有旧的 mt 文件副本,如果有的话,一定要重命名为 mt.old。安装好了以后,接下来我们要把备份工具汇总一下。


    第五章 磁带驱动器技术

    块大小

    在开始动手写备份脚本之前,了解磁带上的数据存储格式是很重要的。Linux 把数据以相同大小的块(也叫做记录)的格式写到磁带上。每两个记录之间都会有一个叫做记录间空白(inter-record gap)的特殊标记被写到磁带上。因此,当磁带上存储了 300Mb 的备份数据时,这些数据就被转换成一些大小相同的记录,每两条记录之间由记录间空白隔开。


    Linux 块大小

    Linux 系统的记录/块大小缺省为 1kb。现在磁带驱动器和磁带每秒钟能处理数兆字节的数据流,1kb 大小的块绝不是最佳选择,原因有以下两点。第一,每一条记录间空白都要占用磁带空间,因此文件块越小,“实际的”磁带容量越小。而且,现在大多数磁带驱动器都针对较大的块做了优化。

    优化配置块大小

    例如,我的 Ecrix VXA-1 磁带驱动器是对 64kb 的块作了优化的,使用这么大的块备份比用缺省大小(1kb)的块速度快了大约50%。要想知道您的磁带驱动器的最佳的块大小,最好是去访问 http://www.linuxtapecert.org。如果在那里找不到所要的资料,可以向制造商核查 — 或者只需对不同大小的块做一些试验。我马上就告诉您怎样设置块大小。

    文件标记


    到目前为止,我们已经知道如何把单堆的数据写到磁带上 — 分解成许多小的块,这些块被记录间空白分隔开来。但是您怎么才能把多堆的数据写到磁带上呢?比如说,您想把两个存档文件依次写到磁带驱动器上。事实上,这个过程非常简单,它依赖于一个特殊的磁带标识,叫做文件标记。

    两种设备

    要想理解文件标记,先明白磁带设备的两种不同类型,即回卷设备和非回卷设备之间的区别是非常重要的。在示例中,我们使用的是 SCSI 磁带,因此回卷设备和非回卷设备分别为 /dev/st0 和 /dev/nst0。


    回卷设备


    下面是关于回卷设备(/dev/st0)是如何工作的。我们假定在驱动器里有一盘回卷磁带,那么您就可以象下面这样进行一次完整的系统备份:


    # cd /
    # star -cv -f /dev/st0 .

    大量的记录以及记录间空白被写到磁带上。备份完成以后,在磁带上写上文件标记,并且磁带被回卷。

    非回卷设备

    但是如果我们用的是 /dev/nst0,磁带就不会回卷 — 而会刚好停在文件标记的后面,这样我们就可以把多个文件存在一盘磁带上了。假定磁带驱动器里有一盘回卷过的磁带,执行以下命令:


    # cd /
    # star -cv -V pat=home/\* -V pat=tmp/\* -V pat=proc/\* -f /dev/nst0 .
    # cd /home
    # star -cv -f /dev/nst0 .

    第一个 star 命令会把除了 /home、/tmp 和 /proc 目录下的文件之外的所有文件的备份 dump 到磁带上。备份完成以后,文件标记会被写到磁带上。然后,开始进行包括 /home 目录树下所有内容在内的另一份备份。在这份备份完成之后,也会写上一个文件标记。


    回卷


    关于这一点,您可以键入以下内容回卷磁带:


    # mt -f /dev/nst0 rewind

    ……或者,您可以键入以下内容回卷并弹出磁带:


    # mt -f /dev/nst0 offline

    多存档文件备份的优点

    那么,前面的示例中所采用的双存档文件备份究竟有哪些优点呢?当然有。我们在第一份备份中包括了除 /tmp、/proc 和 /home 之外的所有内容,说明这份备份包括系统恢复和重新运行需要的所有文件。这样,如果硬盘驱动器出了故障的话,您可以用第一份存档文件在新的硬盘驱动器上恢复系统。然后,您可以在恢复后的 OS 上重新引导,并从另外一份存档文件恢复用户数据。而且,如果只需要恢复被用户偶然删除的一个文件,您可以把它从第二份存档文件上解压缩,并且 tar 命令并不一定要读取所有的系统文件。


    第六章 MT的功能

    访问磁带上的存档文件

    正如您所看到的,在一盘磁带上同时存两份存档文件简单易行。但是,怎样才能访问这些数据呢?幸好,“mt”命令来帮忙了。要输出磁带上的第二份存档文件,您可以键入:


    # mt -f /dev/nst0 asf 1
    # star -tv -f /dev/nst0

    “mt asf”命令先回卷磁带,然后前进到您指定的文件标记号。您会发现,当这两份存档文件在同一磁盘文件系统时,它们没有相应的文件名 — 相反的,mt 使用从零开始的数字访问它们。

    mt fsf

    您也可以象下面这样,通过两次 mt 命令来实现:


    # mt -f /dev/nst0 rewind
    # mt -f /dev/nst0 fsf 1
    # star -tv -f /dev/nst0

    这一次,我们利用“fsf”命令前进到磁带当前位置以后的第一个文件标记。

    磁带定位

    如果您想列出第一份存档文件的内容,接着是第二份存档文件,您可以键入以下内容:


    # mt -f /dev/nst0 rewind
    # star -tv -f /dev/nst0
    # star -tv -f /dev/nst0

    在这个例子中,第一个 star 命令输出 0 号存档文件的内容,然后前进到第一个文件标记的后面,正好在下一存档文件的前面。接着,第二个 star 命令准备开始读取第二份存档文件的内容。


    这里有另外一种方法,完成相同的事情但效率比较低(由于它执行了附加的回卷和搜索)。


    # mt -f /dev/nst0 asf 0
    # star -tv -f /dev/nst0
    # mt -f /dev/nst0 asf 1
    # star -tv -f /dev/nst0

    现在您应该掌握了文件标记是如何工作的。接下来,我将告诉您如何设置磁带块大小,然后我们准备开始学习磁带备份脚本。


    设定块大小

    现在,该学习如何设定和检测磁带块大小了。正如我早先所提到的,Linux 缺省磁带块大小为 1kb。同时,mt 有一个专门的“setblk”命令用来设定缺省的块大小。因此,您可能会想当然的认为可以用 setblk 设定您想要用的块大小,然后就打算付诸实践了。事实上,事情并非如此简单。


    使块大小可变


    如果您想要使用不同大小的块,着手解决的最好办法是把驱动器设成块大小“可变”模式。您可以用 setblk 命令指定一个大小为 0 字节的块:


    # mt -f /dev/nst0 setblk 0


    用 star 指定块大小

    在块大小可变模式下,您就可以使用 star 控制块的大小了。因此,以前您要键入的是:


    # star -cv -f /dev/nst0 .

    ……可现在,您得象下面这样指定块的大小:


    # star -cv bs=64k -f /dev/nst0 .

    ……现在您的记录长度是 64k,对于我的磁带驱动器来说,这就是最佳的块大小了。

    关于块大小的怪事

    这里是您需要知道的一些有关磁带块大小的有趣而又奇怪的事情。首先,当您读取磁带的时候,您必须指定适当的块大小。备份程序无法自动确定块大小。因此,如果您想列出一份块大小为 64k 的存档文件的内容,您就需要保证磁带驱动器处于块大小可变模式,然后在 star 命令行中加以说明:


    # star -tv bs=64k -f /dev/nst0

    一桩怪事


    还有一件怪事。比方说您正试图读取磁带,可是使用了错误的块大小。如果读取的块的大小小于写入时块的大小,您会遇到 IO 错误。但是,如果读取的块的大小刚好是写入时的整数倍 ,那么就没问题了。而如果读取的块的大小大于写入时的块,却又不是整数倍,那么同样会发生 IO 错误。这是因为磁带驱动器一次可以读取一个或多个块,可当它读取的是部分的块时,就有些混乱了。因此,在磁带的标签上写清楚所用的块的大小以便于将来参考是个不错的主意。

    我忘记块的大小了

    开个玩笑,比方说您忘记了您使用的块的大小,或者您正试图从一盘旧磁带上恢复数据,而您并不知道数据是以多大的块存储的。有什么方法可以确定磁带上数据块的大小呢?您很幸运,确实有办法。首先,把磁带插入驱动器并键入以下内容:


    # dd if=/dev/nst0 of=/tmp/testblock bs=128k count=1

    现在,键入“ls -l /tmp/testblock”后看看文件的大小 — 它就等于磁带块的大小。

    这是怎么一回事呢


    这里要说明的是这个技巧的工作原理。既然 dd 包含了关于块大小和记录间隔空白(inter-record gaps)的所有信息,那么如果我们指定“bs=128k count=1”,它就知道我们想要读取的是单个的数据块。dd 将会试图一直读到 128k,但是如果它在 128k 之前遇到了记录间隔空白(inter-record gap),它就明白块已经结束了并停止读取操作。相当不错,是吧?

    “剥取”磁带上的数据


    在讨论 dd 的时候,我就想快点教会您怎样从磁带上“剥取”一个文件。比方说,您的一盘磁带里有两份 star 存档文件(每个文件结尾处有一个文件标记),而且您用的块大小为 64k。这里是关于如何把数据从磁带上第一份文件中复制并转存到一个名为 filezero.tar 的文件里:


    # mt -f /dev/nst0 rewind
    # dd if=/dev/nst0 of=/tmp/filezero.tar bs=64k

    如果没有“count=”选项,dd 就会一直读到文件的末尾(或者如果是磁带的话,会一直读到文件标记)。


    dd 的其它多种用法

    dd 是一个功能强大的磁带工具,同样也能用于把存档文件写到磁带上去,还能把存档文件从一盘磁带直接复制到另一盘磁带。警告 — 确保您复制到磁带上去的存档文件不是使用 gzip 或者 bzip2 压缩的;而应当是纯粹的“.tar”格式的文件。否则,一个磁带读取错误就会让您不能从磁带上恢复任何数据。还是依赖您的磁带驱动器的硬件压缩功能(通常是缺省设置的)吧。














    发布人:netbull 来自:IBM Develop 中国