Backup-With-MSDOS mini-HOWTO <author>Christopher Neufeld, <tt>neufeld@physics.utoronto.ca</tt> <date>v, 5 August 1997 <abstract> 此份 HOWTO 记述如何利用 Linux 相容的磁带机安装在 MS-DOS 的机器,来备份 Linux 机器的档案系统 ( filesystem )。 </abstract> <!-- Table of contents --> <toc> <!-- Begin the document --> <sect>前言 / 介绍 <p> 早先我在网上提出如何用 Colorado Jumbo 250 磁带机[tape drive]在 MS-DOS 的机器上备份 Linux 机器这个问题。从我所回收的电子邮件中显示,这是一个经常被思考的问题。现在我将它整理後,公布作法。如果有任何人想要把这个放入 HOWTO 文件中,请让我知道。 我要感谢 Jim Nance [<htmlurl url="mailto:jlnance@isscad.com" name="jlnance@isscad.com">] 指出 MS-DOS 的机器不一定总是个 MS-DOS 的机器。这个方法应该也可以运用在任何其他被 ftape 模式所支援的磁带机,及由於适当明显改变的 SCSI 磁带机 [例如替换 /dev/st0 for /dev/ftape]。 </p> <p> 我所设定的标准[criteria]是起源於设定应该尽量安全与相当简单,并只占用一点或无须MS-DOS 机器上的硬碟空间。它应该也能复原最糟的系统情况,甚至包括硬碟的遗失,或需要恢复为最原始的 Linux 档案系统。在此记述的方法无须使用 MS-DOS 机器的硬碟空间,可是那机器需要被指定[assigned ]一个 IP#。你将需要三片已格式化的1.44 MB 软式磁碟片。 </p> <sect>方法 <p> 在这份文件的各处,我将会提到两个机器如 ``<tt>msdos</tt>'' 与 ``<tt>linux</tt>''。``<tt>msdos</tt>'' 是机器的名称,它必须拥有一个磁带机,而通常执行 MS-DOS。``<tt>linux</tt>'' 是你□试去藉由磁带机来备份或恢复它的磁碟的 Linux 机器。 为简单起见,我将第一部机器称做 <tt>msdos</tt>'' 即使它在执行 Linux。 此外,所有文件中的路径[path]名称应该加以考虑 Linux 机器与搜寻及救援[Search-And-Rescue (SAR)]的磁片装置於何处,两者在系统上的相对的关系。 那意谓著如果档案 <tt>/etc/passwd</tt> 是一个你的 Linux 机器的硬碟中的加密档案[password file ],此时在这种情况,<tt>/tape144/etc/passwd</tt> 是在软碟机上的相对应档案。 <p> 我使用 Karel Kubat 的备份命令稿[scripts],版本数 1.03,可於此处得到 <tscreen> <url url="ftp://sunsite.enc.edu:/pub/Linux/system/Backup/backup-1.03.tar.gz"> </tscreen> 在文件各处,我将会简单的提及这些``<tt>备份命令稿</tt>''。 你不一定需要使用这个命令稿来备份你的东西到磁带机上。 我喜欢这些命令稿, 因为他们使用 afio 把压缩档解压备份, 而不是把档案压缩备份. 前者比较安全, 因为 restore 时若有一点读取错误, 不会造成所有档案复原失败。我听闻 Karel 不再支援[supporting]档案备份,但现在有产品 'tob' 或磁带导向[tape oriented]的档案备份。 虽然我自己并未□试过新的套装软体,它不可能与此处程序的描述要点有重要的差异。 </p> <p> 所有的起头,获得 ftape 模组[module]。它是所有现代核心的一部份,但如果你使用较旧的核心,你可以在此处找到这个模组: <tscreen> <url url="ftp://sunsite.unc.edu/pub/Linux/kernel/tapes/ftape-2.05.tar.gz"> </tscreen> 接下来,取得 Slackware 开机磁碟 [我使用网路磁碟,但这没什麽不同]与 <tt>tape144</tt> 根磁碟,提供翻版[the images ]有关 3&dquot;1/2 软碟机。 </p> <p> 要用 ftape 这个模组,它的版本一定要和你在编译 ftape 时用的那个核心的版本一样才行。 我不能在 <tt>tape144</tt> 根磁碟[ root disk]使用 <tt>ftape.o</tt> 模组,我想是因为该模组为符号[symbols ]所剥夺[stripped ]而没有安装。所以你现在必须自网路取得支援 ftape 新 <tt>ftape.o</tt> 的新核心[如果你使用旧的核心]。 详读随 <tt>ftape</tt> 档案传送的指引来指导此阶段。 记住,你所编译的核心必须支援 Linux 与 MS-DOS 两台机器的乙太网路卡。 </p> <p> 复制较新的核心副本覆盖网路开机磁碟上的。 使用 <tt>/bin/cp</tt>,而非利用 ``<tt>dd</tt>'' 命令建立一个开机磁碟,如同你建立一个可开机的核心副本[kernel image]。 将开机磁碟写上保护,标示它为 SAR#1。 </p> <p> 现在,装上 <tt>tape144</tt> 根磁碟。 我将假设装设的点在 <tt>/tape144</tt>,来避免档案名称的混淆。 我们需要去释放它的一些空间,所以删除接下来的档案: <tscreen> <verb> /tape144/bin/dialog /tape144/bin/elvis /tape144/bin/vi /tape144/boot/ftape.o </verb> </tscreen> </p> <p> 现在,建立一个新档案: <tscreen> <verb> /tape144/etc/exports </verb> </tscreen> 它将包括接如下的一行: <tscreen> <verb> /mnt msdos(ro) </verb> </tscreen> 此处的 ``<tt>msdos</tt>'' 应该要以有安装磁带机的 MS-DOS 机器的名字或 IP# 来取代。 </p> <p> 然後,如此你不需要去依赖姓名伺服器[name server],加入几行 Linux 与 MS-DOS 机器的名字与 IP 号码到档案 <tt>/tape144/etc/hosts</tt>。 举例来说,我的包括如下的两行: <tscreen> <verb> 128.100.75.114 caliban.physics.utoronto.ca caliban caliban.physics 128.100.75.111 ariel.physics.utoronto.ca ariel ariel.physics </verb> </tscreen> </p> <p> 现在,有一些关於 inetd 配置[configuration]这类的问题。我们在它中输入 rsh daemon 完整的路径。 改变 <tt>/tape144/etc/inetd.conf</tt> 中第十九行成为: <tscreen> <verb> shell stream tcp nowait root /usr/etc/tcpd /usr/etc/in.rshd </verb> </tscreen> </p> <p> 加入局部网路[local net ]通讯路径资讯到 <tt>/tape144/etc/rc.d/rc.inet1</tt>,让 MS-DOS 的机器能使用网路。 这格式[format ]依靠你的网路配置而定,你可以自你的 Linux 中 <tt>/etc/rc.d/rc.inet1</tt>复制出适当的格式。 在我的网路,需要被增加一行: <tscreen> <verb> /etc/ifconfig eth0 128.100.75.111 broadcast 128.100.75.0 netmask 255.255.255.0 /etc/route add -net 128.100.75.0 netmask 255.255.255.0 </verb> </tscreen> 在进入 ifconfig 的 IP# 是 MS-DOS 机器的那个。 </p> <p> 现在,复制这个档案到 <tt>/tape144/etc/rc.d/rc.inet1-l</tt>,并且在新的档案改变 IP# 在此档案中可反应此为 Linux 机器而 不是 MSDOS 机器. </p> <p> 再来,剪下 <tt>/tape144/etc/rc.local</tt>中的第 3 到第 11 行。 那是个执行档案 <tt>rc.inet*</tt> 的指令。 我们不希望这事在开机的时候发生。 </p> <p> 建立一个新的档案:<tt>/tape144/root/.rhosts</tt> 包括此行: <tscreen> <verb> linux root </verb> </tscreen> 此处,再一次的, ``<tt>linux</tt>'' 代表替代所有的机器名称[包括领域[domain]]或 Linux 机器的 IP#。 </p> <p> 在 <tt>/tape144/etc/passwd</tt> 的密码区域填入密码给 root login,并且你在做备份时, 避免别人 login 到 MS-DOS 机器。 你可以藉由自你 Linux 机器的 <tt>/etc/passwd file</tt> 复制对应的领域来达成。 </p> <p> 复制 /usr/bin/rsh into /tape144/usr/bin. </p> <p> 复制接下来的档案,由 <tt>/usr/etc</tt> 到 <tt>/tape144/usr/etc</tt>: <tscreen> <verb> in.rshd rpc.mountd rpc.nfsd rpc.portmap services tcpd </verb> </tscreen> </p> <p> 建立一个新的命令稿 —— <tt>/tape144/bin/tapesetup</tt>,它由接下来的所组成: [改变 ``<tt>linux</tt>'' 对应成为你的 Linux 机器的名字]。 <tscreen> <verb> #! /bin/sh /bin/sh /etc/rc.d/rc.inet1 /bin/sh /etc/rc.d/rc.inet2 /bin/mount linux:/nfs /mnt /bin/insmod /mnt/ftape.o </verb> </tscreen> 注意!最近的核心将不需要 insmod 这行。 </p> <p> 接下来,建立另外一个新的命令稿 —— <tt>/tape144/bin/msdosset</tt>,内容如下: [改变 ``<tt>linux</tt>'' 对应成为你的 Linux 机器的名字]。 <tscreen> <verb> #! /bin/sh /bin/sh /etc/rc.d/rc.inet1 /bin/sh /etc/rc.d/rc.inet2 mount linux:/mnt /mnt /bin/insmod /mnt/ftape.o </verb> </tscreen> 如同上述的,新的核心将不需要 insmod 这行。 </p> <p> 建立一个易读的档案 —— <tt>/tape144/root/notes</tt>,它包括用来完全复原时此处所列的有用资讯: <tscreen> <verb> 为了完全复原一个垃圾硬碟,使用 SAR 磁片 #1 与 #2 来将你的 Linux 机器开机,然後如下输入: /bin/sh /etc/rc.d/rc.inet1-l /bin/sh /etc/rc.d/rc.inet2 /usr/etc/rpc.portmap /usr/etc/rpc.mountd /usr/etc/rpc.nfsd 接下来,插入 SAR disk #3 且输入: mount /dev/fd0 /mnt 建立一个新的安装点[mount point],以: mkdir /mnt2 并安装[mount ]你的 Linux 硬碟分割区在这个 点[point]上。 首先你可能需去重新格式化[reformat ]分割区。如果如此,依循记述在 Linux 安装 HOWTO[Linux Installation HOWTO]中的方法。 SAR 磁片包括了所有执行重新格式化时所需的档案。 最後,使用磁片 SAR#1 与 SAR#2 将 MS-DOS 机器开机,并且在那个机器上执行 /bin/msdosset 命令稿。 它可能需要耗费一点时间去执行那个命令稿,因为它必须由软碟机上取得 NSF 档案,所以请忍耐片刻。 现在,在 Linux 机器上由磁带机重建 /mnt2。 </verb> </tscreen> </p> <p> 如果你使用备份命令稿[backup scripts ],你将必须复制 'afio' 到 <tt>/tape144/local/bin</tt> 子目录。 此备份命令稿档案不需要在重建的磁碟上有暂存空间,档案[archive ]可以仅使用 'afio' and 'gzip' 就可以重建。 </p> <p> 当它们送来时,我还不会使用备份命令稿。 这个磁带备份似乎完整无缺 ,但无法复原(救回)。我发现升级区块容量[block size ]与转变指令来修正它。 这里所示的是 ``<tt>netbackup</tt>'' 命令稿的片段。 利用这个修补程式来更改 Linux 机器硬碟上的和 SAR 磁碟上的 netbackup 程式。 <tscreen> <verb> *** netbackup.orig Mon Jan 9 17:22:32 1995 --- netbackup Mon Jan 9 17:23:25 1995 *************** *** 35,41 **** "'mknod", devname, "p'"); exec ("su -", USERNAME, "-c", "'rsh ", REMOTE_HOST, ! "\"dd", "of=" REMOTE_DEVICE, "obs=20k", "conv=sync\"", "<", devname, "'&ero;" ); --- 35,41 ---- "'mknod", devname, "p'"); exec ("su -", USERNAME, "-c", "'rsh ", REMOTE_HOST, ! "\"dd", "of=" REMOTE_DEVICE, "\"", "<", devname, "'&ero;" ); *************** *** 50,56 **** "'mknod", devname, "p'"); exec ("su", USERNAME, "-c", "'rsh ", REMOTE_HOST, ! "\"dd", "if=" REMOTE_DEVICE, "ibs=20k", "conv=sync\"", ">", devname, "'&ero;" ); --- 50,56 ---- "'mknod", devname, "p'"); exec ("su", USERNAME, "-c", "'rsh ", REMOTE_HOST, ! "\"dd", "if=" REMOTE_DEVICE, "\"", ">", devname, "'&ero;" ); </verb> </tscreen> </p> <p> 你现在完成你的 SAR 磁片 #2。 请加上防写保护。 </p> <p> 接下来,插入一个乾净的、格式化完成的磁片[利用 <tt>fdformat</tt> 与 <tt>mkfs</tt> 来建立]。 复制 <tt>ftape.o</tt> 档案到磁片上,并且标示为 SAR#3。 如果你对此磁片采用防写保护,因著某些理由,事情将会变糟。 所以请让它可以写入。 </p> <p> 在 Linux 机器上,为 NFS 档案服务建立一个新的目录。 我建了一个目录: <tscreen> <verb> /nfs </verb> </tscreen> 将 <tt>ftape.o</tt> [unstripped,约 500+ kB],至此子目录。 在你的 Linux 的输出档案 <tt>/etc/exports</tt> 上建立一个登录[entry ]: <tscreen> <verb> /nfs msdos(ro) </verb> </tscreen> 注意!你的 NFS 目录与其子目录的所有档案均为非安全的。 某些人也能够利用他自己的开机磁片来开启 MS-DOS 机器进入 Linux 并 mount 这个目录。 如此一来,你不要放置任何敏感的东西在你的 NFS 子目录。 </p> <p> 重新启动你的 NFS 驻留程式[daemons]<tt>rpc.mountd</tt> 与 <tt>rpc.nfsd</tt>。 它们似乎无法用 <tt>SIGHUP</tt> 重新启动,所以删除它们然後再重新引用[reinvoke ]它们。 如果你并不是使用这些驻留程式在你的 <tt>/etc/rc.d/rc.inet2</tt>,你现在或许要去用它。 </p> <p> 好了,现在我们完成了备份与重建所有的设定。 完全备份 Linux 机器,利用 SAR#1 来开启你的 MS-DOS 机器。 当出现第二片的提示时,放入 SAR#2 读取。 使用 root 登录,执行命令稿:<tt>/bin/tapesetup</tt>。 登出 MS-DOS 机器。 如果你使用备份命令稿,则程式 netbackup 现在将会运作。 你也可以使用 ``<tt>-f msdos:/dev/ftape</tt>'' 启动 GNU <tt>tar</tt>、<tt>cpio</tt> 或 <tt>mt</tt>,并利用此法制作你的备份。 如果你拥有备份程式,但它仅可以写成局部档案[local file],如下操作。 假定该备份程式被称为``<tt>局部备份[localbackup]</tt>'' ,写入的档案藉由该程式命令列的引数[argument]来表示: <tscreen> <verb> mknod /tmp/tapepipe p rsh msdos dd of=/dev/ftape < /tmp/tapepipe &ero; localbackup /tmp/tapepipe </verb> </tscreen> 当它完成,删除 <tt>/tmp/tapepipe</tt>。 </p> <p> 复原到一个活的[live ]Linux 机器: <tt>netbackup</tt> 命令稿、<tt>tar</tt>、<tt>cpio</tt> 与其他相似的在除了部分操作者使用的特别动作外将可完成全部的工作。 如果你拥有一个备份程式,但它仅能写到局部档案[local file], 执行: <tscreen> <verb> mknod /tmp/tapepipe p rsh -n msdos dd if=/dev/ftape >> /tmp/tapepipe &ero; localrecovery /tmp/tapepipe </verb> </tscreen> 删除 <tt>/tmp/tapepipe</tt> 在你完成之後。 </p> <p> 留心我使用 '<tt>rsh</tt>' 成为在 MS-DOS 机器上的基本使用者。 一个正确的 <tt>.rhosts</tt> 项目可以工作正常。 这个在 '<tt>tape144</tt>' 磁碟上的配置准许 <tt>rsh</tt> 成为一个 root,但不准许 <tt>telnet</tt> 或 <tt>rlogin</tt> 成为 root,控制台[console]的登入是被限制的。 如此有益於安全性。 </p> <p> 如果你担心基础的 <tt>.rhost</tt> 档案,你可以建立一个新的使用者 ``<tt>tapeuser</tt>'' 在 SAR#2 上,以准许来操作磁带机但并非磁碟[建立一个新的群组[group ]并将 tapeuser 置於该群组,然後 <tt>chown</tt> 与 <tt>chmod</tt> 档案 <tt>/dev/rft*</tt> 与 <tt>/dev/nrft*</tt>]。 你的备份程式当时应该能了解 <tt>rsh</tt> 这个名字相较於 root 更适合。 当然目前得有一个 <tt>.rhosts</tt> 档案在 <tt>˜tapeuser</tt> 在 SAR#2。 在我自己的使用,相较於一个基础 <tt>.rhosts</tt> 我会选择此种方法。 </p> <p> 终於,这份文件圆满的复原一个垃圾硬碟。 假定现在 Linux 分割趋势完全不能复原的。 如果有需要,像 Linux 安装 HOWTO上说的重新格式化该分割区。 自 SAR 磁片 #1 启动 Linux 机器,当出现提示,插入磁片 #2。 现在,依循在档案 <tt>/root/notes</tt> 中的叙述[这里是 <tt>/tape144/root/notes</tt> ,在当它被安装上你的 Linux 机器时]。 一但两台机器都被启动完成,执行你需要的复原惯例[ recovery routine ]。 如果你是使用备份命令稿,你可以如下操作: <enum> <item>改变你将恢复的硬碟安装点的指南[directory ]。 <item>如果任一 mounted volumnes 已在此备份上, 而你想把它们复原,你只要在硬碟上建一些 mount point, 然後把备份 mount 在这些 mount point 上。 <item>输入命令: <tscreen> <verb> rsh -n msdos dd if=/dev/ftape | afio -i -v -Z -c 1024 - </verb> </tscreen> or <tscreen> <verb> rsh -n -l tapeuser msdos dd if=/dev/ftape | afio -i -v -Z -c 1024 - </verb> </tscreen> 或 <tscreen> <verb> mknod /tmp/backpipe p rsh -n msdos dd if=/dev/ftape >> /tmp/backpipe &ero; afio -i -v -Z -c 1024 /tmp/backpipe </verb> </tscreen> </enum> 这里是读取在远方机器上的磁带机,将结果写到 stdout,那是 <tt>afio</tt> 所点取的地方。 '<tt>-i</tt>' 参数告诉它用相对於'目前目录'来 recover [此处是硬碟分割区的根目录]。 '<tt>-v</tt>' 是很冗长的,列出它们复原的档案清单。 '<tt>-Z</tt>' 告诉 afio ,此为一个各别的压缩档案。 '<tt>-c 1024</tt>' 告诉它使用 5 MB 的流动缓冲区来避免太多的磁带转回动作。 </p> <sect>备忘录 <p> 在 <tt>/tape144/root/notes</tt> 档案中列出的命令可以在命令稿上执行。 当我在□试的时候,我得到 rpc 设定错误。 我猜想它只是命令执行的太快,portmapper 自己没有适当的安装完成。 我发现手动输入顺序[sequence ]的工作情形良好,所以我推荐如此。 </p> <p> 我想这是一个安全的设定方法。 有人仍可以在你取出磁带前, 先一步把磁带取出将所有档案读出. 对於重视资料机密的人会考虑备份资料流的加密. 也就是说, 原备份的输出 pipe 到加密程式再把加密程式的输出送到 之前所说的 <tt>/tmp/tapepipe</tt>. 但是要住意, 这个加密的备份在复原过程中的错误,将导致在该点之 後的所有档案无法复原, 因为该备份是一个独立的 DES 加密资料流。 我们也可以用 afio 的选项, 先把每个档案 gzip 再做加密. 但这种 先压缩的作法会导至一堆已知的字串(gzip 过会有固定 header), 比 较容易被破解. 所以比较好的作法是跳过 gzip, 直接做 DES 加密, 代价是需要较多的磁带空间. 不用说也知道, DES 加密是不作压缩的.</p> <p> 我附上的 <tt>rc.inet1</tt> 写法只能使用在地区网路 (Local network) 上,而不能用一个 Gateway 和外界沟通。 </p> <p> 在完全恢复到空白硬碟的期间,SAR 磁片 #3 提供 <tt>ftape.o</tt> 让 MS-DOS 机器穿过 NFS。 这是因为 <tt>ftape</tt> 模组某些旧的版本不能在有磁片在软碟机时管理某些磁带机。 在较新的核心程式,所有的 NFS 要素[stuff ]会被忽略。 </p> <p> <bf>这是非常重要的</bf>。 <bf>***测试***</bf> SAR 复原程序。 I did, but don't leave anything to chance. 确定你可以仅使用 SAR 磁片复原至少一个档案到 Linux 机器上[例如没有安装硬碟]。 如果你不能重新启动 Linux 机器在不照成太多使用者不便的情况下,改变在 SAR 磁片中的设定资讯,指派 ``<tt>linux</tt>'' 的身分到另一个 MS-DOS 机器,然後启动两个 MS-DOS 机器进入 Linux 去确定均可正常运作。 然後,将 ``<tt>linux</tt>'' 的身分修正回来,如此你拥有一个可用的 SAR 磁片。 </p> <sect>版权 <p> Copyright Jan 10, 1995 by Christopher Neufeld (<htmlurl url="mailto:neufeld@physics.utoronto.ca" name="neufeld@physics.utoronto.ca">) </p> <p> 修正於 二月 6, 1996. </p> <p> 修正於 八月 5, 1997. </p> </article>