简易备份和恢复

作者:Alan Keates

直到最近,我的备份工作还仅限于偶尔将我的主目录复制到 CD 上,并将重要文件保存在其他地方,通常是在另一个磁盘分区或软盘上。这一切都随着运行一些 Windows 遗留应用程序的需求而改变。唯一真正适合这项工作的机器是我的主工作站,一台 1.2GHz Athlon 机器,多重启动了四个发行版。我决定释放第一个主分区,它曾经安装了 Mandrake 9.0,并设置一个 Windows 分区。

我通过将其内容传输到第七个分区来释放了第一个主分区,覆盖了一个可有可无的 Vector Linux 3.0 发行版。为了完全安全,我启动到 Debian 3.0 并将两个分区都挂载到 /mnt 中的独立挂载点。然后,以 root 用户身份,我使用 tar 和管道将所有内容,包括所有链接和权限,从源分区复制到目标分区。几分钟后,在更改了我的 GRUB 启动菜单后,我能够启动到第七个分区中的 Mandrake 9.0 Linux,并验证一切都按预期工作。

在这一点上,通常会 DOS 格式化现在空闲的第一个分区并安装 Windows。然而,我开始感到有点不安。Windows 可能会格式化整个驱动器,或者发生其他类似的错误,在这种情况下,我将不得不 fdisk 分区并从头开始重新安装所有内容。当然,原始磁盘将包含所有应用程序,除了我安装的那些额外的软件包,但所有自定义配置都将丢失。

这台机器现在运行着 Mandrake 9.0、Debian 3.0 和 Slackware 8.1。在这些系统中,只有丢失我的 Slackware 安装会让我感到痛苦,因为它一直运行良好,在不到 30 秒的时间内启动到 KDE 3.0——包括我的登录——并且绝对稳定可靠。它还为我的 LAN 上的所有打印机完美地设置了 CUPS 打印系统。因此,我必须不惜一切代价保留此设置。当然,解决方案是完全备份 Slackware 安装的所有内容。

在这一点上,拥有一个简单、容易且万无一失的备份和恢复方法的愿望占据了上风。

我们真正需要什么样的备份和恢复系统?

如果您是家庭或 SOHO Linux 用户,我建议您的备份和恢复系统应该

  • 除了您已经拥有的设备或软件外,不需要其他任何东西

  • 在备份介质方面具有成本效益

  • 易于定期使用,否则根本不会被使用

  • 易于验证,否则在关键时刻可能会毫无用处

  • 只需要介质和一台可以工作的机器,在硬件意义上

  • 在关键时刻只需要最少的恢复过程知识

快速回顾过去的 Linux Gazette 文章,并在 Web 上搜索,可以找到数百种备份解决方案。许多解决方案专门针对备份功能;其他解决方案则针对修复和系统恢复部分,以恢复到某个预定义的 state。实际上,没有一个解决方案是为您的系统或您的特定需求定制的,那么为什么不推出您自己的解决方案呢?这就是我们在这里所做的。

我们可以使用什么?

大多数家庭或 SOHO 用户没有磁带驱动器系统,并且不太可能仅为了备份的目的而购买一个,因为磁带系统和软件的成本可能超过计算机本身的成本。这基本上将我们的选择范围缩小到备份到可移动磁盘、备份到同一硬盘或另一个硬盘、备份到 CD 或通过网络备份到其他硬盘。最后一个选项本质上是一个更复杂的备份到本地硬盘的选项,只是当您的系统崩溃时,它完全不会丢失。因此,让我们看看这些选项

  • 软盘: 适用于每日增量备份,也许是保存工作进度的最佳解决方案,但对于全系统恢复毫无用处。LS120 磁盘和 Zip 磁盘不够大或不够普及,不足以考虑用于此处考虑的简单但完整的备份。

  • 硬盘驱动器: 可以备份到同一驱动器上的单独分区,如果该驱动器发生故障,则几乎没有用处,或者可以备份到同一计算机中的另一个硬盘驱动器。这很好,但很有可能电源故障或附近的闪电可能会烧毁两个驱动器——或者有人可能会偷走计算机——导致没有任何东西可以恢复。

  • 网络文件系统传输: 对于有兴趣正确安装它的人来说,这是一个备份和恢复文件的良好解决方案。但是,它对使系统重新启动到可以恢复文件的状态的过程没有任何作用。简而言之,对于大多数人来说,它太复杂而无法实施。

  • CD-ROM: 这是事情开始变得有趣的地方。如今,大多数 Linux 用户都有 CD 刻录机,而且廉价 CD-RW 光盘的可用性意味着维护类似于传统轮换备份系统的东西的成本绝对是可控的。这就是我们需要的。

CD-ROM 备份

最基本的要求是拥有一个工作可靠的 CD 刻录机。任何当前的 Linux 发行版都具有所需的工具,为了最大限度地降低介质成本,大约 4 美元可以购买两张高质量的 CD-RW 光盘。对于每日备份,这些光盘将持续约五年半,每周使用,它们将持续到永远。

此处提出的方案是使用两张 CD-RW 光盘进行轮换备份。在我的实际实现中,我分别用红色和绿色对光盘封面的书脊进行了颜色编码,以帮助正确轮换。

我们还要求备份光盘自启动进入最小的工作 Linux 系统。这对于确保我们可以重新建立主引导记录 (MBR) 和其余原始分区信息(如果需要)是必要的。这排除了使用启动盘映像,就像大多数发行版通常提供的那样。这些映像仅提供启动方法和 Linux 内核,并且通常直接启动到它们定制启动的分区。

在快速浏览了可用的 Linux 自启动 CD 后,我决定使用经典且经过良好测试的 TomsRtBt 磁盘,采用 2.88MB 映像格式。这不是 ISO 映像,但它适合作为我们将要刻录的 ISO 的引导映像。它也可以在 Web 上的其他各种来源找到。我已经以软盘格式使用了这个自启动,它很好而且相当完整。请注意,它还包括 Toms FAQ。

为了将我们的工作 Linux 系统恢复到给定状态,我们需要记录所有当前目录内容,这些内容每天都在变化,或者自初始安装以来已作为自定义项进行了更改。这可以通过检查和详细列表来费力地完成,这最大限度地减少了必须恢复的内容。或者,可以通过备份这些目录的全部内容来轻松完成。

在我的例子中,我决定备份 Slackware 8.1 分区上 */home、/etc、/usr/local、/opt、/var、/root 和 /boot* 的全部内容

  • /home 包含每个用户的所有文件

  • /etc 包含所有配置信息

  • /usr/local 通常包含自安装以来添加的任何额外程序

  • /opt 通常被应用程序用来安装文件

  • /var 包含所有可变性质的数据

  • /root 属于 root 用户,并具有必要的自定义项

  • /boot 包含用于启动系统和 boot .conf 文件的所有文件

除了上面标识的每个目录的内容之外,还有一些更重要的信息,如果突然发生无法启动的情况,您不会想缺少这些信息。这些信息包括 MBR 的二进制副本、分区表和 fstab 文件的文本列表,以防您忘记哪个分区对应哪个文件系统。可选地,您可以制作当前 XF86Config 文件和/或诸如 lsdev 和 lspci 之类的命令的文本输出的副本,以获得完整的系统信息。

此外,我们将如何构建所有这些信息,以确保它以完全独立且可用于手头任务的方式进入 CD?这就是我所做的。首先,我创建了一个目录来保存要备份的所有信息。以 root 用户身份,我发出/mkdir /tmp/backup/。请注意,这里我使用 /tmp 作为备份 CD 的常量部分的存储库。这在 Slackware 中是安全的,但在其他发行版中可能不是。选择一个安全的位置,并且该位置本身不会被 tar 文件备份。

将 TomsRtBt .img 文件的副本放入备份目录中

cp ./tomsrtbt288.img /tmp/backup/tomsrtbt288.img

这里的 .img 文件在我的主目录中。

将主引导记录的副本放入备份目录中

dd if=/dev/hda bs=512 count=1 > /tmp/backup/MBR.bin

MBR 包含您使用的启动机制的第一阶段。在我的例子中,那是 GRUB 的 stage1,GRand Unified Boot Loader,或 LILO,以及主分区的分区信息。扩展分区信息保存在磁盘上的其他位置,并且可以使用您从 fdisk 命令存储的信息来恢复——如果需要的话,将详细介绍。

将分区信息的列表放入备份目录中

fdisk -l > /tmp/backup/Partition_Table

这将用于在进行任何恢复之前与 Toms 分区表列表进行比较。

将 fstab 的副本放入备份目录中,它定义了文件系统挂载点。请注意,此处的任何错误都会使文件和设备稍后无法访问

cp /etc/fstab /tmp/backup/fstab.bak

可选地,复制您希望在能够启动到新恢复的 Linux 系统之前可用的任何其他信息。为了便于访问,我在磁盘上保留了一个 XF86Config 副本,以确保我始终可以将 X 设置为我喜欢的方式,即使我正在安装新的系统升级。我还保留了 menu.lst 的副本,因为我使用 GRUB 作为我的首选启动加载程序

cp /etc/X11/XF86Config /tmp/backup/XF86Config.bak 
... 
cp /boot/grub/menu.lst /tmp/backup/menu.lst.bak

这些文件被添加到刻录的每个备份磁盘副本中。只有当其中一个文件发生更改时才需要更换磁盘,然后应该复制该文件。

现在我们需要问:我们需要做什么来创建我们的自启动备份磁盘?这是我使用的步骤

  1. 创建所选目录的压缩 tar 文件,并将其添加到 /tmp/backup。

  2. 通过使用 mkisofs 创建备份目录的可引导 ISO。

  3. 检查 ISO 的大小,以确保它适合您选择的 CD-RW 光盘。

  4. 使用 cdrecord 刻录到 CD-RW。

  5. 在适当的阶段,将消息回显到标准输出,例如 md5sums 等。

  6. 清理不再需要的文件。

下面显示了完成所有这些步骤的脚本。请务必使其可执行——chmod 755 ./backup——并将其复制到 root 的 PATH 中的某个位置;/usr/local/bin 是一个好地方。对下一个脚本也执行相同的操作。

#!/bin/bash
#  backup
#------------------------------------------------------------------------------
#  Script to enable easy backup of all important Linux files
#  and also creates a customized system repair disk.
#  Uses two CD-RW Disks labled "RED" and "GREEN to rotate backups
#------------------------------------------------------------------------------
# The backup directory already contains files for boot and recovery.
# One can add more - my Slackware 8.1 system backup is < 580MB.

Backup_Dirs="/home /etc /usr/local /opt /var /root /boot"
Backup_Dest_Dir=/tmp/backup
Backup_Date=`date +%b%d%Y`
Image_File=/tmp/backup.iso
declare -i Size

# Create tar file with todays Month Day Year prepended for easy identification
tar cvzf $Backup_Dest_Dir/$Backup_Date.tar.gz $Backup_Dirs &> /dev/null

# Start backup process to local CD-RW drive
echo "Backing up $Backup_Dest_Dir to CD-RW Drive - $Backup_Date"
echo "Creating ISO9660 file system image ($Image_File)."

mkisofs -b toms288.img -c boot.cat -r \
        -o $Image_File $Backup_Dest_Dir  &> /dev/nul

# Check size of directory to burn in MB
Size=`du -m $Image_File | cut -c 1-3`
if [ $Size -lt 650 ]
then
   echo "Size of ISO Image $Size MB, OK to Burn"
else
   echo "Size of ISO Backup Image too Large to burn"
   rm $Backup_Dest_Dir/$Backup_Date.tar.gz # Remove dated tar file
   rm $Image_File   # ISO is overwritten next backup but cleanup anyway
   exit 1
fi

# Burn the CD-RW
Speed=4                 # Use best speed for CD-RW disks on YOUR system
echo "Burning the disk."
                              # Set dev=x,x,x from cdrecord -scanbus
cdrecord -v speed=$Speed blank=fast dev=1,0,0 $Image_File &> /dev/null
Md5sum_Iso=`md5sum $Image_File`
echo "The md5sum of the created ISO is $Md5sum_Iso"

# Could TEST here using Md5sum_Iso to verify md5sums but problem is tricky.
echo "To verify use script md5scd, this will produce the burned CD's md5sum"
echo "run this as User with backup CD in drive to be used for recovery."
echo "This verifies not only the md5sum but that disk will read OK when needed."

# Remove image file and tar file
echo "Removing $Image_File"
rm $Image_File
echo "Removing : $Backup_Dest_Dir/$Backup_Date.tar.gz"
rm $Backup_Dest_Dir/$Backup_Date.tar.gz
echo "END BACKUP $Backup_Date"
echo "Be sure to place this backup in the RED CD case and previous CD in GREEN"
echo "------------------------------------------------------------------------"
exit 0

使用备份系统

一旦建立,备份过程就很简单了。我通常每天备份一次。如果我在系统上没有做太多事情,那么我每周备份一次。在每次备份开始时,我将绿色 CD 盒中的 CD-ROM 放入 CD 刻录机中。在 xterm 中,我 su 到 root 并发出此命令

nohup backup &> /tmp/backup.log &/

然后关闭 xterm 去睡觉。备份大约需要 15 分钟才能完成,因此可以在工作日的任何方便时间完成。下次在电脑前,我cat /tmp/backup.log并检查备份是否顺利进行。

如果我还想验证备份 ISO,我记下列出的 ISO md5sum 的前四个和后四五个字母。由于我的刻录机无法可靠地读回刚刚刻录的 CD,我将 CD 转移到我的 CD-ROM 驱动器并验证 md5sum 是否相同,使用脚本 md5scd(见下面的列表)。如果它们相同,我将新刻录的 CD 放入红色盒子,并将上次刻录的 CD 放入绿色盒子,为下一个备份周期做好准备。如果存在任何混淆的可能性,可以随时检查 tar 文件的日期。请注意,由于刻录机无法可靠地读取备份 CD,我没有包含 md5sum 的自动检查。我这样做是因为验证失败并不意味着 CD 有错误,只是刚刚从刻录机读取的内容有错误。事实上,在使用我的 CD-ROM 时,我从未遇到 md5sum 比较失败的情况。我认为 MD5 校验和是必不可少的,因为即使是单比特错误也可能破坏整个压缩存档。

#!/bin/bash
#------------------------------------------------------------------------
# md5scd ---- Data CD md5sum Verifier
# Script to automate determining Md5sum for ISO9660 CDs
# NOTE - This script assumes that correct md5sum is known and one wishes
# to verify that a particular CD copy has been burnt correctly.
# If working from a downloaded ISO image use "md5sum ISO" at command line
#------------------------------------------------------------------------
# Requires standard tools found in all Linux Distributions
# If script invoked as user, check all permissions, groups, etc.

# Missing arguments?
if [ $# -ne 2 ]
then
  echo "Usage - md5scd mountpoint device, ex - md5scd /mnt/cdrom /dev/hdc"
  exit 1
else
    : OK have arguments
fi

# Loop over md5sum determination ...100 good copies for install-fest?
again=yes
while [ "$again" = yes ]
   do
     echo "Please insert CD at $1 and press ENTER when ready"
     read                        #Wait for insertion of disk
     mount $1
     Block_Count=`df -k $1 | grep $1 | cut -c 25-30`
               #700Mb disk cannot exceed this ^^^^^ column limit in 1k blocks
     umount $1
     Md5sum_Cd=`dd if=$2 count=$Block_Count bs=1024 | md5sum`
     echo "The md5sum of the CD at $1 is " $Md5sum_Cd
     echo
     echo -n "Verify another CD? [yes/no]"
     read again   # Wait for "yes" -> repeat, anything else -> drop through'
   done
exit 0

如果我的系统崩溃了,我该怎么办?

在该意外事件发生之前,应确保备份磁盘可以启动。此外,请确保您了解 tomsrtbt 的局限性,并练习读取备份磁盘上的各种文件,因为那里唯一可用的编辑器是 Vi。当您需要它时,首先必须挂载磁盘

mount -t iso9660 /dev/xxx /mnt

可以使用 TomsRtBt 通过首先使用 gzip 然后 tar 来解压缩和解 tar tar 文件。但是,最好首先使用以下命令检查分区表是否正确fdisk -l并参考存储的表。如果不是,要恢复 MBR,请使用

dd if=/mnt/MBR.bin of=/dev/hda bs=1 count=512 

这将恢复主分区和引导加载程序。然后,使用 fdisk 和分区表文件手动恢复扩展分区以及其中的逻辑分区。这一切都需要勇气和练习!但是,如果不确定或只是练习,可以放弃任何更改。

接下来,对正确的分区进行全新安装。重新启动到拥有 root 控制台的点,挂载备份 CD 并执行

tar xvzf /Mount_Dir/Backup_Tar_Filename

这将恢复所有以前的目录到它们正确的位置。它应该使您拥有几乎完全恢复的系统。

请注意,如果问题只是丢失或损坏的文件,也可以随时通过例如提取来恢复任何已保存的目录

tar xvzf /Mount_Dir/Backup_Tar_Filename /home

布丁的证明

任何系统的测试都是“它是否有效?”我最初验证了备份 CD 是否启动到 Toms 精彩的 Linux 系统,所有文本材料都是可读的,并且fdisk -l确实与存储的版本相对应。我没有从二进制映像文件恢复 MBR,但如果我需要它,它就在那里。

最终测试是将我的 Slackware 8.1 系统替换原始的 Mandrake 9.0 系统,在安装 Windows 之前,也许不得不恢复。简而言之

  1. 我更改了 menu.lst 以反映我们现在将启动 Slackware 而不是 Mandrake 的事实,并格式化了分区,mke2fs -j /dev/hda1.

  2. 我使用驱动器中的 Slackware 安装盘重新启动,并将 BIOS 设置为从 CD-ROM 启动。在 15 分钟内,一切都安装完毕。

  3. 我重新启动到新系统,并在 root 控制台中将最后一个备份 CD 挂载到 /mnt 并发出tar xvzf /mnt/last_dated_backup.tar.gz.

在另外五分钟内,这将重新安装所有备份的分区内容。现在重新启动将我带入一个恢复的 Slackware 8.1,X 已设置好并且 KDE 登录。由于没有保存 /dev,因此必须重置某些设备权限——声音等等——但这微不足道。整个过程花费不到半小时,与进行正常安装并添加所有缺少的常用程序,然后进行冗长的重新配置相比,这简直是天壤之别。

结论

备份很容易做,也很容易坚持做下去。现在系统正在使用中,我看到可以进行一些小的改进。手动备份和验证命令可以制成 shell 变量,并用一个单词调用。此外,如果总文件大小成为一个因素,可以使用 tar 的 --exclude 选项来排除 tar 文件中不包含大量不变代码的部分。或者,可以使用 bzip2 压缩。就目前而言,会保存来自 root 的完整目录。

对 Windows 应用程序的迫切需求结果证明并没有那么迫切,但这个机会给了我实际定期备份所需的推动力。也许我的下一个项目将是安装 Wine 并尝试让那些讨厌的应用程序在 Linux 中运行,而无需总是重新启动。

我对任何改进意见都感兴趣。实际上,欢迎任何反馈,特别是如果明显的缺陷或遗漏是显而易见的。这个方案只使用了很短的时间,但到目前为止我非常满意。最后,我也鼓励您建立定期备份。如果您想要一种快速的现成方法,请尝试这种方法。对脚本进行一些更改应该可以让您今天和以后的每一天都进行备份。

版权 (c) 2003, Alan Keates。最初发表于 Linux Gazette 第 91 期。版权 (c) 2003, Specialized Systems Consultants, Inc。

Alan 是一位退休的控制系统工程师,他的大部分职业生涯都致力于为加拿大的 CANDU 核反应堆设计和实施计算机化的控制和停堆系统。作为一名拥有 40 多年经验的程序员和自 1994 年以来的 Linux 爱好者,他的第一篇日志条目显示一台仍在运行的 386 DX33 机器上的 Bogomips 为 7.83。Linux 和高尔夫在众多爱好中名列前茅。

加载 Disqus 评论