Thinking in XiaoQiang
世人皆有悲哀,只有你不明白
posts - 56,comments - 150,trackbacks - 0
Linux 备份与恢复速成指南

级别: 初级

Chris Walden
电子商务架构师, IBM Developer Relations
2004 年 1 月

Column iconIBM 电子商务架构师 Chris Walden 将通过他在 developerWorks 上发表的九篇系列文章来指导您如何在 Linux 环境中运用您的 Windows 操作技巧。本部分将考察 Linux 系统上的内容,同时在考虑到恢复和安全的情况下,计划并实现常规备份。

Linux 是一个稳定而可靠的环境。但是任何计算系统都有无法预料的事件,比如硬件故障。拥有关键配置信息的可靠备份是任何负责任的管理计划的组成部分。在 Linux 中可以通过各种各样的方法来执行备份。所涉及的技术从非常简单的脚本驱动的方法,到精心设计的商业化软件。备份可以保存到远程网络设备、磁带驱动器和其他可移动媒体上。备份可以是基于文件的或基于驱动器映像的。可用的选项很多,您可以混合搭配这些技术,为您的环境设计理想的备份计划。

确定策略
可以采用许多不同的方法来备份系统。欲了解关于这方面的一些信息,您可以阅读本文结尾处 参考资料 中列出的“Introduction to Backing Up and Restoring Data”一文。

所备份的内容很大程度上取决于您备份它们的理由。您是否试图从严重的故障(比如硬盘驱动器问题)中恢复?您是否想归档以便能在需要时恢复旧的文件?您计划从一个冷系统和还原着手,还是从一个预加载的备用系统着手?

确定要备份的内容
在备份和还原系统时,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 命令。 tartape 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 开关(本例中没有显示)以进行多卷备份。

以防万一
不要忘了 Linux 是区分大小写的。例如, tar 命令应该总是以小写的形式执行。命令行开关可以是大写、小写或大小写的混合。例如, -t-T 执行不同的功能。文件或目录名称可以混合使用大小写,而且就像命令和命令行开关一样,是区分大小写的。

要还原一个或多个文件,可以使用带提取开关( -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 命令执行转储的逆向功能。可以首先还原文件系统的完全备份,而后续的增量备份可以在已还原的完全备份之上覆盖。可以从完全或部分备份中还原单独的文件或者目录树。

dumprestore 都能在网络上运行,因此您可以通过远程设备进行备份或还原。 dumprestore 使用磁带驱动器和提供广泛选项的文件设备。然而,两者都仅限用于 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 会自动跟踪多个卷。

跳过文件
标记将被 dump 跳过的文件和目录是可以做到的。实现此目的的命令是 chattr ,它改变 ext2 和 ext3 文件系统上的扩展属性。


chattr +d <filename>

上面的命令向文件添加一个标记,让 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
dumptar 都有一批拥护者。两者都各有优点和缺点。如果您运行的是除 ext2 或 ext3 之外的任何文件系统,那么 dump 就对您不可用。然而如果不是这种情况,那么只需最少的脚本就能运行 dump ,并且 dump 还具有可用于帮助还原的交互式模式。

我倾向于使用 tar ,因为我喜欢编写脚本来获得额外的控制级别。此外还有用于操作 .tar 文件的多平台工具。

其他工具
在 Linux 中,任何能够复制文件的程序都可以用来执行某种程度的备份。有人就使用 cpiodd 来执行备份 。 cpio 是又一个与 tar 差不多的打包实用工具,但使用得不太普遍。 dd 是一个文件系统复制实用工具,它产生文件系统的二进制副本。 dd 还可用于产生硬盘驱动器的映像,类似于使用诸如 Symantec 的 Ghost 这样的产品。然而, dd 不是基于文件的,因此您只能使用它来将数据还原到完全相同的硬盘驱动器分区。

商业化备份产品
可用于 Linux 的商业化备份产品有很多。商业化产品一般提供了便利的界面和报告系统,而在使用诸如 dumptar 这样的工具时,您必须自食其力。商业化产品很广泛,通常提供大量的特性。使用商业软件包的最大好处是,有一个预先建立的用于处理备份的策略,您可以立即投入工作。商业化的开发人员已经犯了您即将要犯的许多错误,他们的智慧的代价相比于丢失您的宝贵数据来说是廉价的。

Tivoli Storage Manager
Tivoli Storage Manager 或许是现在可用于 Linux 的最好的商业化备份和存储管理实用工具。Tivoli Storage Manager 服务器可运行在多种平台上,包括 Linux,而客户机则可以运行在更多种类的平台上。

本质上,Storage Manager 服务器是通过适合于备份该环境的设备来配置的。要参与备份的任何系统都要加载一个与服务器通信的客户机。备份可以按计划执行、通过 Tivoli Storage Manager 客户机界面手动执行,或者使用基于 Web 的界面远程执行。

TSM 基于策略的性质意味着无需经常调整文件列表,就能够为备份行为定义中心规则。此外,IBM Tivoli Storage Resource Manager 还能够识别、评估、控制和预测企业存储资产的利用情况,能够检测潜在的问题并自动应用自修复调整。更多细节请参见 Tivoli Web 站点(参见 参考资料中的链接)。

图 1. Tivoli Storage Manager 菜单
图 1. Tivoli Storage Manager 菜单

然后备份和还原就通过远程设备来处理

图 2. Tivoli Storage Manager 界面
图 2. Tivoli Storage Manager 界面

前瞻和回顾
拥有良好备份的第一步是拥有计划。首先知道您需要保存的数据以及需要什么恢复策略,然后使用最适合该策略的工具。

Linux 附带了一些现成的(out of the box)有用备份工具。其中两个最常用的是 tardump/restore 。两者都能执行完全系统备份。使用创造性的脚本,您能够设计一个自定义的方案来本地和远程地备份系统。

然而,编写自己的备份脚本可能是一项繁重的任务,对于复杂的企业来说更是如此。诸如 Tivoli Storage Manager 这样的商业化软件降低了学习难度,并允许您立即控制自己的备份,但是您可能必须调整自己的策略来适应这些工具的功能。

参考资料

关于作者
Chris Walden 是德克萨斯州奥斯汀的 IBM Developer Relations Technical Consulting(也称为 dragonslayers )的一名电子商务架构师,该公司为 IBM 商业伙伴提供教育、实现和咨询。他致力于 Linux 相关工作,一有机会就向身边的人宣传 Linux 的种种好处。除了完成他的架构师的职责之外,他还精通 Linux 基础设施服务器的各个领域,包括混合平台用户环境下的文件、打印以及其他应用服务等。Chris 有 10 年的计算机行业经验,从现场支持到 Web 应用开发和顾问,各个领域他都曾涉足。您可以通过电子邮件 cmwalden@us.ibm.com 与 Chris 联系。
posted on 2005-10-27 09:29 小强 阅读(267) 评论(0)  编辑  收藏 所属分类: Linux

只有注册用户登录后才能发表评论。


网站导航: