Linux备份与恢复
确定要备份的内容
在备份和还原系统时,Linux 基于文件的性质成了一个极大的优点。在 Windows 系统中,注册表与系统是非常相关的。配置和软件安装不仅仅是将文件放到系统上。因此,还原系统就需要有能够处理 Windows 这种特性的软件。在 Linux 中,情况就不一样了。配置文件是基于文本的,并且除了直接处理硬件时以外,它们在很大程度上是与系统无关的。硬件驱动程序的现代方法是,使它们以动态加载的模块的形式可用,这样内核就变得更加与系统无关。不同于让备份必须处理操作系统如何安装到系统和硬件上的复杂细节,Linux 备份处理的是文件的打包和解包。
一般情况下,以下这些目录是需要备份的:
- /etc
包含所有核心配置文件。这其中包括网络配置、系统名称、防火墙规则、用户、组,以及其他全局系统项。 - /var
包含系统守护进程(服务)所使用的信息,包括 DNS 配置、DHCP 租期、邮件缓冲文件、HTTP 服务器文件、db2 实例配置,等等。 - /home
包含所有用户的默认用户主目录。这包括他们的个人设置、已下载的文件和用户不希望失去的其他信息。 - /root
是根(root)用户的主目录。 - /opt
是安装许多非系统文件的地方。IBM 软件就安装在这里。OpenOffice、JDK 和其他软件在默认情况下也安装在这里。
有些目录是应该考虑 不备份的。
- /proc
应该永远不要备份这个目录。它不是一个真实的文件系统,而是运行内核和环境的虚拟化视图。它包括诸如 /proc/kcore 这样的文件,这个文件是整个运行内存的虚拟视图。备份这些文件只是在浪费资源。 - /dev
包含硬件设备的文件表示。如果计划还原到一个空白的系统,那就可以备份 /dev。然而,如果计划还原到一个已安装的 Linux 系统,那么备份 /dev 是没有必要的。
其他目录包含系统文件和已安装的包。在服务器环境中,这其中的许多信息都不是自定义的。大多数自定义都发生在 /etc 和/home 目录中。不过出于完整性的考虑,您可能希望备份它们。
在生产环境中,我希望确保数据不会丢失,因而我会备份除 /proc 目录之外的整个系统。如果最担心用户和配置,我会仅备份 /etc、/var、/home 和 /root 目录。
备份工具
正如前面提到过的, Linux 备份在很大程度上就是打包和解包文件。这允许使用现有的系统实用工具和脚本来执行备份,而不必购买商业化的软件包。在许多情况下,这类备份将是足够的,并且为管理员提供了极大的控制能力。备份脚本可以使用 cron
命令来自动化,这个命令控制 Linux 中预定的事件。
tar
tar
是一个已移植到 Linux 中的经典 UNIX 命令。 tar
是 tape archive(磁带归档)的缩写,最初设计用于将文件打包到磁带上。如果您下载过 Linux 源代码,或许已经碰到过 tar 文件。这是一个基于文件的命令,它本质上是连续地、首尾相连地堆放文件。
使用 tar
可以打包整个目录树,这使得它特别适合用于备份。归档文件可以全部还原,或从中展开单独的文件和目录。备份可以保存到基于文件的设备或磁带设备上。文件可以在还原时重定向,以便将它们重新放到一个与最初保存它们的目录(或系统)不同的目录(或系统)。 tar
是与文件系统无关的。它可以使用在 ext2、ext3、 jfs、Reiser 和其他文件系统上。
使用 tar
非常类似于使用诸如 PKZip 这样的文件实用工具。只需将它指向一个目的(可以是文件或设备),然后指定您想要打包的文件。您可以通过标准的压缩类型来动态压缩归档文件,或指定一个自己选择的外部压缩程序。要通过 bzip2 压缩或解压缩文件,可使用 tar -z
命令。
要使用 tar
来把除 /proc 目录之外的整个文件系统备份到 SCSI 磁带设备:
tar -cpf /dev/st0 / --exclude=/proc
在上面的例子中, -c
开关表示归档文件正在被创建。 -p
开关表示我们希望保留文件许可权限,这对良好的备份来说是很关键的。 -f
开关指向该归档文件的文件名。在本例中,我们使用的是原始磁带设备 /dev/st0。/ 表示我们想要备份的内容。既然我们想要备份整个系统,因此把这个开关指定为根(root)。当把 tar
指向一个目录(以 / 结尾)时,它会自动递归。最后,我们排除了 /proc 目录,因为它没有包含需要保存的任何内容。如果单盒磁带容纳不下这个备份,我们需要添加 -M
开关(本例中没有显示)以进行多卷备份。
要还原一个或多个文件,可以使用带提取开关( -x
)的 tar
命令:
tar -xpf /dev/st0 -C /
这里的 -f
开关同样指向归档文件, -p
开关表明我们想要还原归档的权限。 -x
开关表明从归档中提取文件。 -C /
表明我们想要让还原从 / 开始。 tar
通常还原到运行这个命令的目录。 -C
开关使我们的当前目录不再相关。
您可能会经常使用的另外两个 tar
命令是 -t
和 -d
开关。 -t
开关列出某个归档文件的内容。 -d
开关将归档文件的内容与系统上的当前文件作比较。
为便于操作和编辑,您可以将想要归档的文件和目录放进一个文本文件中,然后在命令行通过 -T
开关引用这个文本文件。这些文件和目录可以与命令行上列出的其他目录结合起来。下面的命令行备份 MyFiles 中列出的所有文件和目录、/ 根目录和 /tmp 目录中的所有 iso 文件。
tar -cpf /dev/st0 -T MyFiles /root /tmp/*.iso
文件列表只是一个文本文件,其中列出文件或目录。下面是一个例子:
/etc
/var
/home
/usr/local
/opt
请注意 tar -T
(或 files-from
)命令不能接受通配符。文件必须明确地列出。上面的例子展示了一种单独地引用文件的方法。您还可以执行脚本来搜索系统,然后建立一个列表。下面就是这样一个脚本的例子:
#!/bin/sh
cat MyFiles > TempList
find /usr/share -iname *.png >> TempList
find /tmp -iname *.iso >> TempList
tar -cpzMf /dev/st0 -T TempList
上面的脚本首先将 MyFiles 中的所有现有文件列表复制到 TempList。然后它执行两个 find
命令来搜索文件系统中匹配某个模式的文件,并将它们附加到 TempList。第一次是搜索 /usr/share 目录树中以 .png
结尾的所有文件。第二次是搜索 /tmp 目录树中以 .iso
结尾的所有文件。在建立好列表之后, tar
然后在文件设备 /dev/st0 (第一个 SCSI 磁带设备)上创建 一个新的归档文件,该文件使用 g zip 格式来压缩,并保留所有文件权限。该归档文件将跨越多个卷。要归档的文件的名称将从 TempList 文件中提取。
还可以使用脚本来执行更精细的操作,比如增量备份。Gerhard Mourani 在他的 Securing and Optimizing Linux 一书中给出了一个优秀的脚本,您可在本文结尾处的 参考资料中找到关于这本书的信息。
也可以编写脚本来还原文件,虽然还原通常是手动进行的。正如上面提到过的,用于提取文件的 -x
开关代替了 -c
开关。可以还原整个归档文件,或者还原指定的个别文件或者目录。使用通配符来引用归档文件中的文件是可以的。还可以使用开关来转储和还原。
dump 和 restore
dump
可以执行类似 tar
的功能。然而, dump
倾向于考虑文件系统而不是个别的文件。下面是引自 dump 手册文件中的内容:“dump 检查 ext2 文件系统上的文件,并确定哪些文件需要备份。这些文件将出于安全保护而被复制到给定的磁盘、磁带或其他存储媒体上……大于输出媒体容量的转储将被划分到多个卷。在大多数媒体上,容量是通过一直写入直至返回一个 end-of-media 标记来确定的。”
配合 dump
的程序是 restore
,它用于从转储映像还原文件。
restore
命令执行转储的逆向功能。可以首先还原文件系统的完全备份,而后续的增量备份可以在已还原的完全备份之上覆盖。可以从完全或部分备份中还原单独的文件或者目录树。
dump
和 restore
都能在网络上运行,因此您可以通过远程设备进行备份或还原。 dump
和 restore
使用磁带驱动器和提供广泛选项的文件设备。然而,两者都仅限用于 ext2 和 ext3 文件系统。如果使用的是 JFS、Reiser 或者其他文件系统,您将需要其他的实用工具,比如 tar
。
使用 dump 执行备份
使用 dump
执行备份是相当简单的。下面的命令执行一个完全 Linux 备份,它把所有 ext2 和 ext3 文件系统备份到一个 SCSI 磁带设备。
dump 0f /dev/nst0 /boot
dump 0f /dev/nst0 /
在这个例子中,系统中有两个文件系统。一个用于 /boot,另一个用于 / ,这是常见的配置。它们必须在执行备份时单独地引用。 /dev/nst0 引用第一个 SCSI 磁带驱动器,不过是以非重绕的模式引用。这样确保各个卷在磁带上一个接一个地排列。
dump
的一个有趣特性是其内置的增量备份功能。在上面的例子中, 0 表示 0 级或基本级备份。这是完全系统备份,您要定期执行以保存整个系统。对于后续的备份,您可以使用其他数字(1-9)来代替 0,以改变备份级别。1 级备份会保存自从执行 0 级备份以来更改过的所有文件。2 级备份会保存自从执行 1 级备份以来更改过的所有文件,以此类推。使用 tar
和脚本可以执行相同的功能,但要求脚本创建人员提供一种机制来确定上次备份是何时执行的。 dump
具有它自己的机制,即它在执行备份时会输出一个更新文件(/etc/dumpupdates)。这个更新文件将在每次执行 0 级备份时被重设。后续级别的备份会保留它们的标记,直至执行另一次 0 级备份。如果您在执行基于磁带的备份, dump
会自动跟踪多个卷。
使用 restore 来执行还原
要还原使用 dump
保存的信息,可以使用 restore
命令。像 tar
一样, dump
能够列出( -t
)归档文件的内容,并与当前文件作比较( -C
)。使用 dump
時必须小心的地方是还原数据。有两种非常不同的还原方法,您必须使用正确的方法才能获得可预测的结果。
重建 (-r)
记住,在设计 dump
时考虑得更多的是文件系统,而不是单独的文件。因此,存在两种不同的文件还原风格。要重建一个文件系统,可使用 -r
命令行开关。设计重建的目的是为了能在空文件系统上操作,并将它还原为已保存的状态。在执行重建之前,您应该已经创建、格式化和装载(mount)了该文件系统。不应该对包含文件的文件系统执行重建。
下面是使用上面执行的转储来执行完全重建的例子。
restore -rf /dev/nst0
上面这个命令需要针对要还原的每个文件系统分别执行。
在需要的时候,可以重复这个过程来添加增量备份。
提取 (-x)
如果需要使用单独的文件而不是使用整个文件系统,您必须使用 -x
开关来提取它们。例如,要仅从我们的磁带备份中提取 /etc 目录,可使用以下命令:
restore -xf /dev/nst0 /etc
交互式还原 (-i)
restore
提供的另外一个特性是交互式模式。使用命令:
restore -if /dev/nst0
将把您置于交互式 shell 中,同时还显示了包含在该归档文件中的项。键入“help”将会显示一个命令列表。然后您就可以浏览并选择希望提取的项。务必记住,您提取的任何文件都将进入当前目录。
dump 与 tar
dump
和 tar
都有一批拥护者。两者都各有优点和缺点。如果您运行的是除 ext2 或 ext3 之外的任何文件系统,那么 dump
就对您不可用。然而如果不是这种情况,那么只需最少的脚本就能运行 dump
,并且 dump
还具有可用于帮助还原的交互式模式。
我倾向于使用 tar
,因为我喜欢编写脚本来获得额外的控制级别。此外还有用于操作 .tar 文件的多平台工具。