裸机恢复
想象一下,您的磁盘驱动器刚刚变成了一个非常昂贵的冰球。想象一下,您家着火了,您的电脑机箱现在看起来像是萨尔瓦多·达利会喜欢画的东西。现在怎么办?
裸机恢复是在灾难性故障后重建计算机的过程。本文是一个关于如何备份 Linux 计算机以进行裸机恢复,以及如何进行裸机恢复的循序渐进的教程。
正常的裸机恢复过程是:从产品光盘安装操作系统,安装备份软件(以便您可以恢复数据),然后恢复您的数据。然后,您需要通过验证您的配置文件、权限等来恢复功能。
这里的过程将省去安装操作系统产品光盘的步骤。它还将仅恢复从生产计算机备份的文件,因此您的配置在您恢复系统时将保持完整。这应该可以为您节省数小时的验证配置和数据的时间。
本文的目标计算机是一台奔腾计算机,其上安装了一个 Red Hat 5.2 Linux 服务器,安装在一个 IDE 硬盘上。它没有大量数据,因为该计算机被设置为“牺牲”测试平台。也就是说,我不想使用生产计算机和生产数据来测试此过程。此外,我在开始测试之前进行了全新的“服务器”安装,以便在我需要恢复到已知配置时始终可以重新安装。
目标计算机上没有任何其他操作系统。虽然这简化了手头的练习,但也意味着如果您有双启动系统,您将不得不进行实验以恢复非 Linux 操作系统。
下面显示的过程并不容易。在您需要它之前练习它!像我一样做,在一台牺牲计算机上练习。
请注意:示例命令将在大多数情况下显示我必须键入的内容才能恢复目标系统。您可能必须使用类似的命令,但参数不同。例如,下面我们展示了如何在 /dev/hda9 上创建交换设备。您有责任确保您复制您的设置,而不是测试计算机的设置。
基本程序由 W. Curtis Preston 在Unix Backup & Recovery(http://www.ora.com/,http://www.oreilly.com/catalog/unixbr/)中阐述,我在 2000 年 10 月的Linux Journal中对此进行了好评。然而,这本书在这方面有点单薄。例如,您到底备份哪些文件?您需要保留哪些元数据,以及如何保留?
我们将从您已经使用典型的备份工具(如 Amanda、Bru、tar、Arkeia 或 cpio)备份了您的系统这一假设开始。那么,问题是如何从烧毁的硬件到您可以运行将恢复您的数据的恢复工具的地步。
基于 Red Hat Package Manager (RPM) 的 Linux 发行版的用户也应将 RPM 元数据保存为正常备份的一部分。类似这样的东西
rpm -Va > /etc/rpmVa.txt
在您的备份脚本中,将为您在裸机恢复后进行比较提供基础。
要达到这一点,您需要具备
您的硬件再次启动并运行,并根据需要更换组件。BIOS 应正确配置,包括时间、日期和硬盘驱动器参数。
并行端口 Iomega Zip 驱动器或同等产品。您至少需要 30MB 的空间。
您的备份介质。
一个最小的 Linux 系统,允许您运行恢复软件。
为了达到目的,您至少需要两个阶段的备份,可能需要三个阶段。您备份什么以及在哪个阶段备份取决于您的恢复过程。例如,如果您要恢复磁带服务器,您可能在恢复过程中不需要联网,因此只需在常规备份中备份网络即可。
您也将分阶段恢复。在第一阶段,我们构建分区、文件系统等,并从 Zip 磁盘恢复最小的文件系统。第一阶段的目标是能够启动一台运行的计算机,该计算机具有网络连接、磁带驱动器、恢复软件或我们第二阶段所需的任何东西。
如果需要,第二阶段包括恢复备份软件和任何相关数据库。例如,假设您使用 Arkeia 并为您的备份服务器构建裸机恢复 Zip 磁盘。Arkeia 在服务器的硬盘驱动器上保存一个庞大的数据库。如果您愿意,可以从磁带恢复数据库。相反,为什么不 tar 和 gzip 整个 Arkeia 目录(在 /usr/knox 下),并将其保存到另一台计算机上通过 nfs?正如我们所定义的,第一阶段不包括 X,因此您需要进行一些实验才能备份 X 以及您的备份程序。
当然,如果您正在使用其他备份程序,您可能需要做一些工作。您将必须找出它需要运行哪些目录和文件。如果您使用 tar、gzip、cpio、mt 或 dd 作为您的备份和恢复工具,它们将作为下面描述的第一阶段过程的一部分保存到我们的 Zip 磁盘并从中恢复。
最后阶段是从磁带或其他介质进行完全恢复。在您完成最后一个阶段后,您应该能够启动到一个完全恢复且可操作的系统。
首先,按其常规计划执行您的正常备份。如果您不这样做,本文将毫无用处。
接下来,为自己构建一个救援磁盘。我使用 tomsrtbt,可在 http://www.toms.net/~toehser/rb/ 获取。它有详细的文档记录,并在一个软盘中打包了许多有用的工具。它有一个活跃的列表,我提出的一个问题得到了快速而准确的解答。我喜欢我的商店有一天可能会依赖的产品。
接下来,弄清楚如何进行操作系统备份,以便您可以恢复您的正常备份。我遵循了 Preston 的建议,并使用了 Iomega 并行端口 Zip 驱动器。它们每个磁盘大约有 90MB 的可用存储空间。由于我为第一阶段备份开发的脚本保存了大约 30MB 的数据,因此一个 Zip 磁盘应该足以完成手头的工作。
其中大部分内容在 Zip 驱动器 HOWTO(www.linuxdoc.org/HOWTO/mini/ZIP-Drive.html)中介绍,因此我将向您展示我的具体操作。您的结果可能会有所不同。您可能已经完成了其中很多操作,在这种情况下,您的设置可能会有所不同。对我来说,由于没有打印机与 Zip 驱动器共享并行端口,因此简化了该过程。
首先,安装 Zip 驱动器的驱动程序,并为其创建一个挂载点
[root@tester /etc]# modprobe ppa [root@tester /etc]# mkdir /mnt/zip
在您的 fstab 中插入合适的行
/dev/sda4 /mnt/zip vfat noauto 0 0保存 fstab。将 Zip 磁盘放入驱动器。然后您应该能够挂载 Zip 驱动器
[root@tester /etc]# mount /mnt/zip [root@tester /etc]# ls -l /mnt/zip total 277 drwxr-xr-x 2 root root 16384 Dec 31 1969 . drwxr-xr-x 7 root root 1024 May 11 08:34 .. -rwxr-xr-x 1 root root 265728 Jan 30 1998 50ways.exe
Zip 驱动器出厂时已格式化为 MS-DOS 或 Windows (FAT) 或 Mac。FAT 格式对于我们正在做的事情来说效率有点低,但并非致命。我们的测试计算机设置将大约 26MB 放入 Zip 磁盘,因此您可以跳过在 Zip 磁盘上安装 ext2fs。
以下是如何将 Zip 磁盘上的 FAT 文件系统替换为 ext2fs。首先,卸载 Zip 驱动器
[root@tester /etc]# umount /mnt/zip
然后运行 fdisk 并查看您拥有的内容
[root@tester /etc]# fdisk /dev/sda Command (m for help): p Disk /dev/sda: 64 heads, 32 sectors, 96 cylinders Units = cylinders of 2048 * 512 bytes Device Boot Start End Blocks Id System /dev/sda4 * 1 96 98288 6 DOS 16-bit >=32M Command (m for help):出于只有 Murphy 和 Iomega 知道的原因,FAT Iomega Zip 磁盘只有一个分区,即分区四。删除有问题的分区
Command (m for help): d Partition number (1-4): 4 Command (m for help): p Disk /dev/sda: 64 heads, 32 sectors, 96 cylinders Units = cylinders of 2048 * 512 bytes Device Boot Start End Blocks Id System根据 Zip 驱动器 HOWTO,我们将创建一个新分区作为分区 1
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-96): 1 Last cylinder or +size or +sizeM or +sizeK ([1]-96): 96显示分区表表明它已为我们标记为 Linux ext2fs 分区,因此我们不必更改文件系统 ID
Command (m for help): p Disk /dev/sda: 64 heads, 32 sectors, 96 cylinders Units = cylinders of 2048 * 512 bytes Device Boot Start End Blocks Id System /dev/sda1 1 96 98288 83 Linux native使用 w 命令写入分区表并退出。我们现在必须在刚刚创建的分区上创建一个文件系统
[root@tester /etc]# mke2fs /dev/sda1 mke2fs 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09 Linux ext2 file system format File system label= 24576 inodes, 98288 blocks 4914 blocks (5.00%) reserved for the super user First data block=1 Block size=1024 (log=0) Fragment size=1024 (log=0) 12 block groups 8192 blocks per group, 8192 fragments per group 2048 inodes per group Superblock backups stored on blocks: 8193, 16385, 24577, 32769, 40961, 49153, 57345, 65537, 73729, 81921, 90113 Writing inode tables: done Writing superblocks and file system accounting information: done现在我们回到 fstab 并添加一个新条目
/dev/sda1 /mnt/zip ext2 noauto 0 0这使我们能够通过挂载设备文件而不是挂载点来指定我们在 Zip 磁盘上拥有的文件系统。例如
[root@tester /etc]# mount /dev/sda1您将这两行放在 /etc/fstab 中的顺序很重要。如果您指定 /mnt/zip,第一行决定了默认分区挂载是否会尝试挂载。因此,将此行放在您之前创建的条目之上。我们将在将第一阶段数据保存到 Zip 磁盘的脚本中使用它。
在制作了生产备份之后,您还需要备份哪些其他信息才能重建您的系统?您需要保留您的分区信息,以便您可以重建它们。此信息和其他元数据保存在脚本 save.metadata 中(请参阅清单 1)。
不幸的是,fdisk 尚无法导出分区信息,以便您可以从文件中重新导入它。由于您必须使用 fdisk 手动重建分区,因此我们将以人类可读的文本文件形式保存它。
幸运的是,硬盘驱动器的价格正在暴跌,几乎与公众在选举后对政治家的信任度一样快。因此,手动编辑过程允许使用更大的替换驱动器所需的灵活性是一件好事。
该脚本将分区信息保存在 Zip 磁盘根目录下的 fdisk.hda 文件中。最好打印此文件和您的 /etc/fstab。然后,您可以在恢复分区数据时使用硬拷贝。您可以通过在两个虚拟控制台之间切换来节省树木,在一个虚拟控制台中运行 fdisk,并在需要时 cat /etc/fstab 或 /fdisk.hda,但这在我看来容易出错。
您还需要保留与您的恢复方法相关的文件。例如,如果您使用 nfs 来保存您的数据,您将需要保留 hosts.allow、hosts.deny、exports 等。此外,如果您使用任何网络备份恢复过程,例如 Amanda 或 Quick Restore,您将需要保留网络文件,如 HOSTNAME、hosts 等,以及相关的软件树。
处理这些和类似问题的最简单方法是保留整个 /etc 目录。
Preston 在备份他的系统时作弊了。100MB 的 Zip 驱动器不可能容纳 Red Hat 5.2 的服务器安装。250MB 的 Zip 磁盘可以容纳全新的服务器安装,但可能无法容纳生产服务器。我们必须比简单地保留整个 kazoo 更具选择性。我们需要哪些文件?
boot 目录。
/etc 目录和子目录。
启动时需要的目录。
/dev 中的设备文件。
要确定启动时需要的目录,我们查看启动初始化文件 /etc/rc.sysinit。它像这样设置其路径
PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH试验和错误表明,我们也需要其他一些目录,例如 /dev。事后看来,当然我们需要 /dev。在 Linux 中,如果没有设备文件,您就无法做太多事情。
在阅读脚本 save.metadata(请参阅清单 1)时,再次注意我们不一定保存使用绝对路径调用的文件。我们可能需要多次迭代备份,测试裸机恢复,从 CD 重新安装并重试,然后才能获得可用的备份脚本。在我撰写本文期间,我进行了五次这样的迭代才成功恢复。这就是为什么尽可能使用脚本至关重要的原因之一。彻底测试!
在开始恢复过程之前,要做的第一件事是验证硬件时间是否设置正确。使用 BIOS 设置执行此操作。您必须将时间设置到多接近精确取决于您的应用程序。对于恢复,在精确时间的几分钟内应该足够准确。这将允许时间关键事件在您最终启动恢复的系统时从中断的地方继续。
在启动 tomsrtbt 之前,请确保您的 Zip 驱动器放置在并行端口上,即 /dev/lp0 或 /dev/lp1。启动软件将为您加载并行端口 Zip 驱动器驱动程序。
我的测试系统中使用了一块 ne2000 克隆以太网卡。事实证明,这给 tomsrtbt 内核中的 3c59x 驱动程序带来了问题。解决方法是告诉内核忽略其地址范围。在 LILO 提示符下
zImage reserve=0x300,32
下一步是设置视频模式。我通常希望在屏幕上看到尽可能多的内容。因此,当出现选择视频模式的选项时,我使用模式 6,即 80 列 x 60 行。您的硬件可能能够也可能无法处理如此高的分辨率,因此请对其进行实验。
一旦 tomsrtbt 启动并且您有一个控制台,请挂载 Zip 驱动器。最好以只读方式挂载它
# mount /dev/sda1 /mnt -o ro
检查以确保它在那里
# ls -l /mnt然后清除硬盘驱动器的前两个扇区
# dd if=/dev/zero of=/dev/hda bs=512 count=2这将主引导记录 (MBR) 设置为全零。它清除了所有分区记录和任何引导代码,例如 LILO。
然后,使用您之前制作的 fdisk.hda 硬拷贝,使用 fdisk 对硬盘驱动器进行分区。将第一个柱面设为主分区。之后,您将构建一个或多个扩展分区,其中包含一到四个逻辑分区。主分区和扩展分区编号为一到四。分区五及以上是逻辑分区。另请注意,扩展分区与其包含的逻辑分区重叠。分区的分区号是设备名称中的最后一位或两位数字,因此 /dev/hda5 是 hda 上的分区号五。
您可以拥有多个主分区,但这不明智。每个主分区都排除了扩展分区,扩展分区可以细分为逻辑分区。扩展分区更加灵活
# fdisk Command (m for help): p Disk /dev/hda: 64 heads, 63 sectors, 1023 cylinders Units = cylinders of 4032 * 512 bytes Device Boot Start End Blocks Id System Command (m for help):
我们将创建一个新分区作为分区 1
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-1023): 1 Last cylinder or +size or +sizeM or +sizeK (1-1023): 9现在我们将创建扩展分区
Command (m for help): n Command action e extended p primary partition (1-4) e Partition number (1-4): 2 First cylinder (1-1023): 10 Last cylinder or +size or +sizeM or +sizeK (10-1023): 1022请注意,硬盘驱动器有 1,023 个柱面,而我们仅将扩展分区设置为 1,022,浪费了一个柱面。原因是我们要复制 Red Hat 在原始安装中给我们的设置。
现在创建一个逻辑分区
Command (m for help): n Command action l Logical (5 or over) p primary partition (1-4) l First cylinder (10-1022): 10" Last cylinder or +size or +sizeM or +sizeK (1-1022): 368
依此类推,直到您的 fdisk.hda 文件指示您应该拥有的每个分区。
使用 t 命令将您的交换分区的文件系统 ID 设置为 Linux Swap (82)。
不要忘记使用 a 命令设置活动或可引导分区。在仅限 Linux 的安装中,这通常是第一个分区,但也可能是另一个分区。它将是挂载为 /boot 的分区(请参阅您的 fstab 打印件)
Command (m for help): a Partition number (1-9): 1
然后验证您的工作
Command (m for help): v 372 unallocated sectors Command (m for help): p Disk /dev/hda: 64 heads, 63 sectors, 1022 cylinders Units = cylinders of 4032 * 512 bytes Device Boot Start End Blocks Id System /dev/hda1 * 1 9 18112+ 83 Linux native /dev/hda2 10 1022 2042208 5 Extended /dev/hda5 10 368 723712+ 83 Linux native /dev/hda6 369 727 723712+ 83 Linux native /dev/hda7 728 858 264064+ 83 Linux native /dev/hda8 859 989 264064+ 83 Linux native /dev/hda9 990 1022 66496+ 82 Linux swap Command (m for help):对照您的打印副本检查此列表。请注意,一个扩展分区与五个 Linux 分区重叠。
最后,我们使用 w 命令写入分区表并退出
Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. hda: hda1 hda2 < hda5 hda6 hda7 hda8 hda9 > hda: hda1 hda2 < hda5 hda6 hda7 hda8 hda9 > Syncing disks. WARNING: If you have created or modified any DOS 6.x partitions, please see the fdisk manual page for additional information.
然后在您将用作 ext2 分区的每个分区上创建 ext2 文件系统。这些将是您未更改为交换分区的主分区和逻辑分区。不要对您的扩展分区执行此操作!
mke2fs /dev/hda1 mke2fs /dev/hda5 ...例如,
# mke2fs /dev/hda1 mke2fs 1.10, 24-April-97 for EXT2 FS 0.5b, 95/08/09 Linux ext2 file system format File-system label= 4536 inodes, 18112 blocks 905 blocks (5.00%) reserved for the super user First data block=1 Block size=1024 (log=0) Fragment size=1024 (log=0) 3 block groups 8192 blocks per group, 8192 fragments per group 1512 inodes per group Superblock backups stored on blocks: 8193, 16385 Writing inode tables: done Writing superblocks and file system accounting information: done依此类推,直到每个不是交换分区的主分区或逻辑分区。
现在设置交换分区。
# mkswap /dev/hda9 Setting up swap space, size = 68087808 bytes
然后,我们必须手动构建一个分区并将其挂载到每个目录。由于现在是 /target 的内容最终将变为 /,因此我们将 / 将要成为 / 的内容挂载到 /target
# mkdir /target # mount /dev/hda8 /target接下来,我们在 /target 中构建我们需要的目录,并将它们挂载到这些目录,就像对每个目录执行以下操作一样
# mkdir /target/boot # mount /dev/hda1 /target/boot您可以从 /mnt/etc/fstab 确定要构建和挂载哪些目录和挂载点。幸运的是,umask 已经为我们几乎需要构建的所有目录正确设置。
依此类推,直到每个分区。参考 /mnt/ls.root.txt,确保您还为要构建的目录设置了正确的模式。
但不要尝试挂载扩展分区或交换分区。您不需要这样做,而且无论如何也无济于事。
要检查您的进度,请使用不带参数的命令 mount。
# mount /dev/ram0 on / type minix (rw) none on /proc type proc (rw) /dev/ram1 on /usr type minix (rw) /dev/ram3 on /tmp type minix (rw) /dev/sda1 on /mnt type ext2 (rw) /dev/hda8 on /target type ext2 (rw) /dev/hda1 on /target/boot type ext2 (rw) /dev/hda6 on /target/home type ext2 (rw) /dev/hda5 on /target/usr type ext2 (rw) /dev/hda7 on /target/var type ext2 (rw)
一旦您创建了所有目录并将分区挂载到它们,您就可以运行脚本 /mnt/root.bin/restore.metadata(请参阅清单 2)。这将把 Zip 磁盘的内容恢复到硬盘驱动器。
您应该看到 Zip 磁盘根目录的目录,然后是恢复时存档文件的列表。tar 在 tomsrtbt 上会告诉您 tar 的块大小为 20,这很好。您可以忽略它。确保 LILO 打印出其结果
Added linux *
之后将是来自 df -m 命令的输出。
如果您通常直接引导到 X,这可能会导致问题。为了安全起见,暂时更改您的引导运行级别。在 /etc/inittab 中,找到看起来像这样的行
id:5:initdefault:
并将其更改为此
id:3:initdefault:现在,您可以优雅地重新启动。如果您尚未这样做,请从软盘驱动器中取出 tomsrtbt 软盘,并向计算机发出三指礼或其等效命令“shutdown -r now”。计算机将关闭并重新启动。
当计算机重新启动时,返回 BIOS 并验证时钟是否大致正确。
验证时钟后,退出 BIOS 并重新启动,这次引导到硬盘驱动器。您将看到很多错误消息,主要是“我找不到 blah!哇哇!”之类的内容。好吧,如果您到目前为止正确地完成了您的功课,那么这些错误消息并不重要。您不需要 linuxconf 或 apache 来完成您需要做的事情。
您应该能够登录到 root 控制台(没有 X,没有用户,抱歉)。您现在应该能够使用网络,例如,NFS 挂载您的系统备份。
如果您为 Arkeia 做了我建议的两阶段备份,您可以恢复 Arkeia 的数据库和可执行文件。现在,您应该能够运行 /etc/rc.d/init.d/arkeia start 并启动服务器。如果您在另一台安装了 X 的计算机上安装了 GUI,您应该能够登录到您的磁带服务器上的 Arkeia,并准备您的恢复。
当您恢复时,请仔细阅读您的恢复程序的文档。例如,tar 通常不恢复文件的某些特性,例如 suid 位。文件权限由用户的 umask 设置。要完全按照保存的方式恢复文件,请使用 tar 的 p 选项。同样,请确保您的恢复软件将完全按照您保存的方式恢复所有内容。
要恢复测试计算机
[root@tester ~]# restore.all
如果您使用 tar 进行备份和恢复,并使用了 -k(保留旧文件,不覆盖)选项,您将看到很多这样的信息
tar: usr/sbin/rpcinfo: Could not create file: File exists tar: usr/sbin/zdump: Could not create file: File exists tar: usr/sbin/zic: Could not create file: File exists tar: usr/sbin/ab: Could not create file: File exists这是正常的,因为 tar 拒绝覆盖您在第一阶段恢复期间恢复的文件。
只是为了以防万一,请在执行恢复后运行 LILO。我怀疑这是必要的,但如果这是必要的,它比其他选择容易得多。您会注意到我的脚本 restore.all 中有它(请参阅清单 3)。
现在重新启动。在关闭过程中,您将看到很多错误消息,例如“没有这样的 pid”。这是该过程的正常部分。关闭代码正在使用备份时正在运行的守护程序的 pid 文件来关闭上次启动时未启动的守护程序。当然没有这样的 pid。
您的系统应该正常启动,错误比以前少得多。在基于 RPM 的系统上,您的恢复工作效果如何的酸性测试是验证所有软件包
rpm -Va
某些文件(例如配置文件和日志文件)在正常情况下会发生更改,您应该能够从报告中在精神上过滤掉这些文件。
如果您早些时候听取了我的建议并将 RPM 元数据作为正常备份过程的一部分保留,您应该能够比较这两个文件,从而大大加快此步骤。
您应该已启动并运行。现在是测试您的应用程序的时候了,尤其是那些作为守护程序运行的应用程序。应用程序越复杂,您可能需要做的测试就越多。如果您有远程用户,请禁止他们使用系统,或者在您测试时将其设置为“只读”。这对于数据库尤其重要,以防止使任何损坏或数据丢失比已经可能的情况更糟。
如果您通常引导到 X,并且在上面禁用了它,请在重新启用它之前测试 X。通过将 /etc/inittab 中的那一行改回:id:5:initdefault: 来重新启用它
您现在应该准备好开始工作了——并准备好一些阿司匹林和一张沙发。
您应该为每台计算机取出您的 Zip 磁盘和您制作的打印件,并将它们放在您商店中的安全位置。您还应该在您的异地存储位置存储这些副本。异地备份存储的主要目的是实现灾难恢复,而将每个主机恢复到替换硬件上是灾难恢复的一部分。
您还应该在您的异地存储中拥有几个 tomsrtbt 软盘,甚至可能是一些 Zip 驱动器。在您的几台计算机上拥有 tomsrtbt 发行版的副本,以便它们相互备份。此外,您可能应该将本文的副本以及您特定于站点的注释与您的备份和异地备份存储一起保存。
Charles Curley (ccurley@trib.com) 住在怀俄明州,在那里他骑马和放牧牛、猫和电子。只有最后一种收入不错,因此他还为一家总部位于华盛顿州雷德蒙德的小型软件公司编写文档。