Linux服务器上的备份和恢复
2010-03-06 15:57:13 阿炯

进行一般的备份应该是负责任的系统管理者的最高优先考虑,虽然Linux 是一个高度可靠的作业系统,系统失效仍然可能发生。可能因为硬件故障,电源中断,或其他不可预料的问题。更常见的这些问题是来自人为的错误,不当的变动,甚至因为删除重要的档案。如果您负责管理系统上的用户, 一定可能常被要求重建因为不小心误删的档案。

如果您进行一般备份,以每日为基础较好 (至少对更动频繁的使用者档案),您将会有助於减少档案的损失,并且增加复原程度。最安全的备份方法是将他们纪录於不同的媒体中,例如磁带,抽取式硬碟,可写式 cd .等。然後将您的备份和您的 Linux系统分开存放。有时候这可能并不实际 -- 也许在您可以存放备份磁带的地方没有防火室 ! 或是在第一优先的地点没有办法存取这样的外部备份系统。虽然如此,仍然可以进行备份,只是会受到一点限制。

在我服务的单位,我在几个 Linux 系统上进行备份。按情况的不同,有些备份存放在磁带,其他则写入位於网路上的不同伺服器中,然而有一些仍然使用 cron 自动作业 (可能因为伺服器位在远端,在那里每天进行磁带备份是不切实际或不可能的),简单的放在分别不同磁碟上的分割区中 (例如,放在 /archive/ 档案系统) 。在家里,我没有外部的备份系统,我也没有大量的磁碟空间去存放备份影像档。因此,我改为只备份在/home/ 的我的使用者档案,同样的还有一些在 /etc/的自订设定档,将备份存放在分别不同的磁碟分割区中。

服务器备份程序

进行Linux备份有几种不同的方法,其中包括所有 Linux 发行版本中都有的命令列工具,例如dd,dump,cpio以及tar。其他还有文字型态工具,例如 Amanda 及 Taper,这些是被设计来在备份及回存过程中加入更友善的使用者介面。当然也有图形介面的工具,像是KDat。最後,还有商业化的备份工具,像是 BRU 和 PerfectBackup+。这些备份计划中任何之一都足以提供您宝贵资料的保护。

这里有一些包括哪里可以获得工具的列表,可以在“Linux Applications and Utilities Page”找到,位於http://www.xnet.com/~blatura/linapp2.html#back. 当决定好备份方式,您可能要考虑下列几点因素:
可携性 - 备份的可携性 (亦即. 从一个 Linux 发行版本或应用 Unix备份然後回存到另外一个; 例如从Solaris 到 Red Hat Linux) 对您而言是否重要 ? 如果是,可能想要选择一个命令列的工具 (亦即. dd,dump, cpio, 或 tar),因为您可以相当地确定该工具可以在另一个 *nix 系统上找到。

无人或自动备份 - 定期自动进行备份而不需人力介入之能力,对您而言是否重要 ? 如果是,您可能需要能支援该方案的工具及备份媒体。

使用者友善 - 使用者友善的介面对您而言是否重要 ? 如果是,您可能想要选择一个文字或图形介面的工具。商业的应用程式可以提供最简便的介面及技术支援。

远端备份 - 从远端机器进行备份及回存的能力对您而言是否重要 ? 如果是,您可能想要选择命令列或文字模式的工具而不是图形介面(除非您有相当快的网路连结及执行远端 X sessions 的能力)。

网路备份 - 从网路主机进行备份及回存对您而言是否重要 ? 如果是,您可能要用一些支援从网路存取备份设备的命令列工具(像是 tar),或是专用工具程式例如 Amanda 或是一些商业工具程式。

媒体型态 - 备份可以储存在很多不同的媒体,像是磁带,外接式硬碟,ZIP 磁碟,或可读写 CD。考虑售价及可靠性,储存容量,及传送速度。

警告: 当备份您的系统时, 不要包括 /proc 伪档案系统 ! /proc 中的档案并非真的档案,而仅是看起来像档案的描述,而且指向核心资料结构的连结。备份 /proc/kcore ,这事实上这是一个伪装档案,包含记忆体中所有的资料,会浪费很多的磁带 ! 您可能也需要避免备份 /mnt 档案系统,除非您有从 CD-ROM,软碟机,网路分享档案,或其他安装设备上备份的特殊需求。

明显地,备份及回存的过程会因您所选择的备份方法而有所不同。然而,在这一节,我将会讨论我最常使用的两种工具备份的方法 : tar (其名称源於“Tape ARchiver”),这是一个命令列式的工具,在 *nix 系统中具有很高的可携性 ; 以及 KDat,一个来自於 KDE 套件的图形介面磁带备份工具。最後,我应该补充一点,依您所选择的备份方式,即使该工具没有建立於自动备份时间表上的能力,您仍然可以利用 cron 功能进行该自动备份。 参考使用Cron 和 Crontab 档进行自动作业 有关使用 cron 的细节以及如何建立 crontab 行程表档案。

使用 tar备份:
如果您选择 tar 作为您的备份方案,您可能要花点时间去了解种种的指令选项 ; 键入 “man tar” 有更深入的明细。您还需要了解如何存取适当的备份媒体 ; 虽然在 Unix 的世界中对待所有的装置就像处理档案一样,如果您写入到一个字元设备像是磁带,“档案”的名称就是设备本身的名称 (亦即. /dev/nst0 是一个SCSI介面的磁带机)。
下面的指令会将您的整个 Linux 系统备份於 /archive/ 档案系统,除了 /proc/ 伪装档案系统,/mnt/, /archive/ 档案系统 (没必要备份我们的备份档 !),还有 Squid 很大的快取资料档 (是的,依我之见,浪费备份媒体而且不需要去备份)之外的任何已挂载的档案系统 :
tar -zcvpf /archive/full-backup-`date '+%d-%B-%Y'`.tar.gz
--directory / --exclude=mnt --exclude=proc --exclude=var/spool/squid .

不要被上面的指令吓到 ! 当我们将其分为两部分,您将会发现这个强力工具之美。

上列的指令指定了选项 z (压缩; 备份资料经由 gzip压缩), c (建立; 一个 archive 档开始被建立),v (verbose; 显示出已经备份好的档案), p (允许保存;保护的资料将会被 “记忆” ,可以被回复)。f (档案) 选项後面接的是的要写入的 archive 档 (或装置)名称,注意包含资料的档名是如何得到的,只要用两个後引号将date 指令圈起来。 一般的命名惯例是在未压缩过的档案後面加上 .tar ,压缩的档案加上 tar.gz --directory 选项告知 tar 在开始备份前首先跳到以下的档案路径 ( 在本例中是/目录 )。 --exclude 选项告知 tar 不要备份所指定的档案或目录。最後, . 符号告知 tar 要备份目前目录中的所有东西。

注意: 有一点很重要必须了解的就是 tar 的选项是大小写不同的 ! 此外,大部分的选项可以用助记符号加以简化(亦即. f),或者使用较易记忆的选项全名 (亦即. file)。 助记符号前用一个- 字元作为字首作为辨识,在全名的前面有两个这种符号的字首。参考 “man”页以得到更多有关使用 tar 的资讯。

另一个例子,这一次只有写入指定的档案系统 (和上一个除了例外全部写入的例子相反) 到一台 SCSI 的磁带机 :tar -cvpf /dev/nst0 --label=Backup set created on `date '+%d-%B-%Y'`. --directory / --exclude=var/spool/ etc home usr/local var/spool

在上面一行的选项,注意没有用到 z (压缩) 选项。我强烈建议反对写入压缩资料到磁带上,因为如果磁带上资料有一部份损坏,您会失去整个备份 ! 然而,未压缩的储存的 archive 档具有很高的可恢复性,即使磁带上的档案有一部份损毁。因为磁带机是一个字元设备,没有办法指定一个确实的档名。因此,指定给 tar 的档名可简化为装置名称,/dev/nst0,是在 SCSI 排汇上的第一个磁带设备。

注意: /dev/nst0 设备在备份做好後不会回带 ; 因此有可能将好几组备份写到同一磁带。(您也可以选择/dev/st0这个装置,在这种情形磁带在备份完後会自动回带),既然我们无法对一套备份指定档名, --label 选项可以来写进档案本身一些有关这一套备份的资讯。最後,只有包含在 /etc/, /home/, /usr/local, 及 /var/spool/ (除了 Squid 的 快取资料档)会写进磁带。当使用磁带时,可以使用下列命令回带,以及退出磁带:
mt -f /dev/nst0 rewind
mt -f /dev/nst0 offline

小技巧: 您将会发现到当 archive 档建立时,前面的/ (斜线) 符号会被 tar 去除。这是 tar 的预设操作模式,这是故意用来保护您避免覆写这些重要档案的原先版本,以防万一您不慎在重建过程中覆写了不正确的档案。

如果您真的不喜欢这个特性 (记住,这是特性!) 您可以指定 tar --absolute-paths 选项,这样会保留前面的斜线。然而,我不建议这样做,因为很危险 !

使用KDat备份:
如果您使用 KDE 桌面环境,我相信您会发现KDat 公用程式不但强大而且对使用者很友善。此外,另一个好处是KDat 利用tar 作为其备份 engine。因此,用 KDat 写入的备份组不但可以用 KDat 读取,也可以用 tar ! 这使得 KDat 成为在使用者友善及备份可携性中很好的选择。

小技巧: 即使您决定不使用也不安装完整的 KDE 套件,如果您安装了 Qt 函式馆就仍然可以使用KDE。

当您第一次执行 KDat,您需要建立一个备份 profile。这个 profile 告诉 KDat 您想要备份系统中的哪些档案。如果您要的话,您可以建立好几个备份 profile,依照您的需求 (例如,您可以建立一个 profile 叫做“Full Backup”作系统的完全备份,或是 “Quick Backup”只备份使用者的档案)。

要建立备份 profile,可以选择从选单栏中“File”选项选择“Create Backup Profile” (或在“Backup Profiles”文件夹上按滑鼠右键,然後选择 “Create Backup Profile”)。在右手边的是 KDat 视窗,您可以改变各种设定,像是profile 名称,archive 名称,tar 选项,以及其他的。单击“Help”选单有关於这些设定的用途说明。

要指定哪些档案应该包含在您的 backup profile, 在 / 目录文件夹旁的核对图示上敲一下左键。这会确定所有的档案及这个目录下所有东西都会备份。然後,在文件夹旁的小 +符号上敲一下左键,资料夹会展开,显示档案及以下的目录。您可以排除掉所不想备份的档案;只要在您想排除的每一个档案或目录旁的核对符号上敲一下左键。例如,一个完全备份应该包含已标记的所有档案及目录,要排除 /proc (一个伪装档案系统,包含您目前运作系统的资料),/mnt ( 位於CD-ROM下面的目录,软碟机,网路分享常被挂载在此),而且如果您是 Squid 使用者,/var/spool/squid (Squid的快取资料档)。一旦您选好了合适的档案,在您建立好的备份 profile 上按一下左键,然後在“Files >>” 钮上按一下左键将选好的档案移进您的备份 profile。

注意: 如果您的伺服器资料到巨大到无法实际存放到磁带中,您需要建立分别的备份 profiles,备份组中每部份一个。

实际进行备份时,将磁带放入,从 “File” 选单中选择 “Mount Tape” (或是用滑鼠敲一下看起来像磁带的图示)。这样会“挂载”磁带 (事实上,因为磁带机是字元装置,事实上无法挂载它 -- 其实 KDat 只是先回带,试着去读取开头资讯,如果成功,找寻磁带机上符合的索引。否则,KDat 会提醒您格式化磁带。

(注意: 如果 KDat 持续反映没有磁带在磁带机但事实上有,您应该确定在参数中指定的磁带机名称正确,在选单栏中用滑鼠敲一下“Edit”选项然後选择“User Preferences”.)

一旦 KDat 已经挂载好磁带,在您开始备份前必须选择备份的 profile。当打算开始备份,只要在您要的备份 profile上敲一下右键,然後在“Backup”上敲一下左键。KDat 会先显示一个对话框告诉您有关您所选择备份 profile 的细节 ;在“Ok” 上敲一下左键就会开始备份。

当备份开始进行,KDat 会显示一个有各种状态资讯的对话框 (经过时间,备份大小,备份比率,估计剩馀时间,档案数量及总共写入 bytes 数),以及已经备份档案的列表。一个包含好几 gigabyte 资料的完全备份可能需要花上好几个小时。必要的话,在备份过程中任何时候您可以在“Abort” 钮上敲一下左键放弃备份。一旦备份完成,您可以在选单栏中选择 “Edit”,再选 “Unmount Tape”以解挂载磁带,或在磁带图示上敲一下,这样磁带会回带然後跳出。无疑地, 比例行备份更重要的事就是当问题发生後能让重要档案正常回复 !

明显地,就像伺服器备份程序所讨论的,进行回存的程序依您所选择的备份方案而有所不同。在这一节,我将会讨论由 tar 及 KDat所备份的回存方法。

使用 tar 回存:
下面的指令会从 full-backup-09-October-1999.tar.gz 回存所有的档案,这是我们 Linux 系统的备份例 (按照在 使用tar 备份 一节中的命令例所做的):tar -zxvpf /archive/full-backup-09-October-1999.tar.gz

上面的命令会从 archive 档中取出所有的档案,保留原档案的拥有者及权限。 x 选项用来作解出(其他的选项在 使用tar 备份 这节中有提到:)

警告: 从一个 tar 的 archive档中解出档案可能是一件危险的事,因此必须谨慎进行。也许这些档案作时并未包括准备好的路径(有一些被误导或未被告知的发展者散他们的档案时可能会这样),表示档案会被解到目前的目录下。也许档案压缩时有加上 / 斜线 (当备份档建立时指定 --absolute-paths 选项),表示档案会被回存到绝对位置 (即使您不愿意)。或者也许档案压缩时未加上 / 斜线, 表示档案会被解到目前的目录下 (即使您不愿意这样)。当然,全看备份是如何建立的。因为这个缘故,我强烈建议先在 tar命令加上t (type) 选项加以测试,然後当您完全确定命令会依您预期进行後将 t 换成x (extract) 。

如果您不需要回存 archive 中所有的档案,您可以指定一个或更多的档案,按照下面例 :
tar -zxvpf /archive/full-backup-09-October-1999.tar.gz etc/profile usr/local/bin/tolower

上面的命令会从例的档案回存 etc/profile 及 usr/local/bin/tolower。如果您只试着从您的 archive 档中回存一个或几个档案,除非您确实地指定和 archive 档中所存放相同的档名及路径,否则不会成功。 下面的例会帮您解决问题:
tar -ztvpf /archive/full-backup-09-October-1999.tar.gz | grep -i profile

在上面的例,所有在 archive 档中的档案都以档名列出。所有的结果都会输出到 grep 指令 (使用 grep的i 选项可忽略混杂的情况),显示profile中任何档案的目录及档名。当您确实决定要回存的档名时,您可以用一般的 tar 指令表达指定所要回存的档案。

就像在 伺服器备份程序 所提到的,当建立一个 archive 档时, tar 会从档案路径去除前面的 / (斜线)符号。这表示档案回存时可能不会在和备份时相同的位置结束。因此,不要改变到 / root 目录或者--directory / 选项。

注意: 一个更安全的方法是在不同的目录回存档案 (例如您的 home 目录),然後比对,搬移及更新档案到之後的原始位置。

使用KDat回存:
要从 KDat 建立的备份组回存一个或更多档案,将备份磁带放进磁带机,从“File”选单项目选择“Mount Tape”(或在磁带的图示上按下滑鼠左键) KDat 会试着从磁带读入开头资讯,如果成功的话,会试着找寻符合开头资讯的磁带索引。这个索引存在硬碟,是由 KDat 为所格式化的每一个备份磁带所做的唯一档案,每一次进行备份就会更新。如果符合的档案索引遗失了(也许您回存的备份组是由另一部机器所备份的,或是因为硬碟损毁而删除了索引档), KDat 会通知您这件事,并且如果可以读取磁带重建索引的话会询问您。由於您必须在您回存档案前先重建索引,按左键选择“Yes”是有意义的。

(注意: 一但磁带重新索引过,名称会变成“Reindexed Tape”。 您可以将它重新命名成原来的样子)

当磁带索引成功地读入,可以用来选择您想从备份组回存的档案或目录,和您建立备份档时所用的方法十分相同(查看 伺服器备份程序 有关选择档案过程的详细说明)。

当您选择好合适的档案,您可以从目录页中的“File”选项选择“Restore...”开始回存程序(或在磁带回存的图示上按滑鼠左键)。KDat会显示一个对话框,让您确认要回存的档案。此外,您有指定回存的档案所到目录的选项。这让您回存重要档案到您的 home 目录下,然後可以和预期位置中的档案做比较,移动或是更新。这实际上是最安全的回存档案方法。

要开始回复程序,在“Okay”钮上按一下,KDat 会扫描磁带并且开始回存选定好的档案。有时,您会发现不使用 KDat 回存一个用 KDat 备份过的档案是必须或有帮助的。也许您想要在不提供图形介面的系统上回存这些档案,或是您的网路速度很慢而透过它执行 KDat 是不切实际。幸运地, KDat 使用 tar 工具写入备份资料, 在任何 *nix 系统都有的命令列工具。如果您打算用 tar 回存用 KDat 建立的备份组,就像您回存用 tar 本身备份的普通备份组所做的选项一样。记住,资料组并未以压缩格式储存。

注意: 当您试着使用 tar 存取由 KDat 所做的备份组时,一定会得到错误讯息。这是因为当磁带第一次格式化时 KDat 加入了开头及其他资讯。重 tar 指令两三次就会跳到档案真正开头的地方。

每个人都告诉你备份是如何的重要,但是目前却缺乏如何进行备份的详细的教程来讨论需要备份哪些文件,备份间隔应该是多少?这篇文章将为你回答这些问题,通过该文章你可以定义适合自己的备份策略。

总的来说,可以将备份分为两类:系统备份,其实现对操作系统和应用程序的备份(只要系统管理员的才能进行这项工作);用户备份,其实现对用户文件的备份(我不知道是否别人也使用这些术语,但是本文中都这样使用)。我们会看到,系统备份和用户备份应该区别对待。

系统备份

进行系统备份的原因是尽量在系统崩溃以后能快速简单完全地恢复系统的运行。然而当然你不会希望花费几个月来备份你的系统。进行有效备份的最有效的方法是仅仅备份那些对于系统崩溃恢复所必需的数据。想想下面这种情况,你的系统大部分都非常稳定-/usr/bin的内容并不是那么经常变动,为了使事情简化,你也许已经有了系统的粗糙拷贝。大多数人都是使用某种发布安装Linux系统,然后对系统进行自己的定制。原始的发布就是我们进行系统恢复的出发点。

Linux区别于其他大多数操作系统的一个方面是操作系统和大多数应用程序一次被安装,而Windows或者其他Unix系统则是应用程序与操作系统是分开来安装的,首先是安装操作系统,然后才逐渐安装各个应用程序,对于这些系统,备份整个系统才是必要的,这些操作系统在初次安装时需要花费大量的时间和精力。而对于Linux来说,初次或再次安装一个基本系统(包括绝大多数应用程序)是非常简单和快速的。

上面说到系统的大部分都非常稳定,下面我们来考虑哪部分比较容易变动。定制自己的系统的一个方面是安装新的应用程序(没有随发布安装的应用程序)。当安装新的软件时,你应该严格要求自己,将新安装的软件和初始安装的内容分隔开来,最恰当的目录位置是/usr/local之下。/usr/local目录的目的就是包含那些相对系统来说本地化的内容。这样做的一个优点就是你可以容易的察看哪些程序可以从发布光盘中恢复,哪些程序需要从备份中恢复。

另外一个你会需要修改的地方是标准程序使用的配置文件。大多数Linux应用程序的的配置文件都是纯文本格式,你可以根据需要编辑配置文件来定制软件的运行。有时候发布将自动基于你回答的问题答案来编辑某些配置文件,但是大多数情况下你需要自己编辑它们。很多重要的文件位于/etc目录之下,如:
/etc/printcap---配置如何与打印机通信
/etc/fstab---配置系统有哪些文件系统
/etc/passwd---包含所有的用户信息,如密码,登录shell等
/etc/inittab---配置init在不同运行级别下分别如何启动系统
/etc/XF86Config---包含XFree86的初始配置

不同的系统可能有很多其他的的重要配置文件,可以看到/etc目录非常重要,包含在该目录下的文件可能是数小时的工作成果。我就曾经花费了好长时间才正确的配置了XF86Config文件。想到如果重新再做一遍,我就害怕。当然,某些程序使用了其他目录下的一些文件,但是Linux的基本配置文件绝大多数都位于/etc目录下。

当你修改了某个程序所使用的配置文件,你不能将其搬移到其他地方,因为程序通常在固定的地方寻找配置文件。因此记录对系统所做的修改就非常重要,无论所做的修改如何的微小,这样当系统崩溃时才能轻松的恢复系统。

记录对系统的修改的最好的工具是一杆笔和一张纸。记录下对系统进行了哪些修改的详细描述及为什么要进行修改是非常必要的。不要自以为是的认为经过六个月你仍然能记得你如何编译安装了某个应用,或你为什么你要修改某个配置,而实际情况是你往往会忘记。即使你在一个单独的目录下安装了一个新的软件(比较容易查找修改),也应详细的记录如何安装的程序,什么时候安装的及是否有任何事情还不是非常清楚。

现在我们已经讨论了哪些系统文件需要进行备份,下面我们考虑多长时间应该备份一次。每次你对系统进行了修改可能是进行备份的时刻,但是不要忘记在修改系统以前对要修改的部分备份,以防止在出现问题时可以恢复。关键点是系统只有在你修改了它以后才会变动,而修改往往不是经常的事情,因此对系统的备份应该对应于这个情况。

用户备份


用户备份不同于系统备份,因为用户的数据变动更加频繁一些,因此几乎不可能建立某个用户的精确到每分钟的备份。当备份用户数据,你只是为用户提供一个虚拟的安全网络-合理的最近它数据文件的备份,当出现任何问题如误删除某些文件或者硬盘发生故障时,使用户可以恢复自己的数据。

用户备份应该比系统备份更加频繁,也许是每天都进行备份(cron程序提供了自动定期运行某个程序的方法)。而几乎所有的备份程序(包括tar)都提供了一个有用的特性:仅仅备份特定时间(如上次备份)以后被修改的文件。这可以显著的减少进行用户备份所需要花费的时间,因为一个用户在特定时间段内一般仅仅是修改了很少量的文件。你可以对用户数据进行完全备份和增量备份的手段结合起来使用。

虽然可以是用软盘作为备份的存储介质,但是每张软盘只能存储少量的数据。很多备份程序允许一个备份跨越若干个磁盘,但是这也意味着在进行备份时必须自行更换软盘。若你仅仅是管理具有若干个用户的小型系统,这也许非常简单,但是情况往往不是这样。数字或磁记录带也许是一个更好的选择,因为它们具有更大的存储容量。Linux支持很多不同类型的磁带设备,或者通过ftape模块或者通过对SCSI的支持(数字记录带往往是SCSI设备)。而且从性价比来说磁带设备的成本现在非常低廉,因此它非常实用。可选的,你的Linux可能和其他带有磁带机的计算机在同一个局域网之中,Linux可以访问其他远程机器的磁带设备。

无论选择什么介质进行备份,都需要管理这些介质设备。你的备份是在发生了问题时才会被使用的,这时你会依赖于备份,因此你必须经常验证你的备份。一个没有验证的备份甚至比没有备份更糟。

你同样应该保持多个备份集合,一个流行的策略是基于祖父-父亲-儿子思想。这里你拥有三套备份,最新的一份(儿子),中间的一份(父亲),最老的一份(祖父)。当你进行下一次备份,你应该覆盖掉最老的那一份,使其变为最新的一份。这种策略的优点是即使其中的一份失效,你仍然可以根据其他的备份进行恢复,但是你不必每次进行两次备份。
最后一个忠告也许有些奇怪:保持至少一个备份远离源机器,最好完全放在另外一栋大楼里。为什么呢?这是为了防止源机器所在地发生灾难如火灾等等,你可以重新实用一台新的机器,使用新的Linux发布,但是你不能得到一个新的备份磁带。计算机中的数据是最珍贵的,不可替代的,因此应该小心的保护它。

如何进行备份

OK,理论部分已经足够了,下面我们来看一些例子。有很多的备份程序可供选择,包括自由软件和商业软件,每种都有其优点。但是我们这里使用tar(GNU version 1.11.2)来作为示例说明。

这里假定系统中刚刚在/usr/local中安装了很多新软件,并且需要备份系统中/usr/local下的所有内容。这里你没有磁带设备,因此你使用了软盘,使用如下的命令:
$ tar -cWMf /dev/fd0 /usr/local

c选项标识创建一个存档,W表示在写入备份内容到备份设备以后再读出来进行验证以提高可靠性,M选项指示tar若需要时可以跨越多张磁盘,f选项通知将存档写入到哪里,在这里是/dev/df0。在很多系统中,你必需具有root的身份才能访问/dev/df0。虽然上面这个例子指定进行验证,但是仍然可以对备份进行检测:
$ tar -tMf /dev/fd0

将显示该磁盘备份的文件的列表。依赖于/usr/local目录下内容的大小,也许会需要多张软盘来备份该目录下的内容,当然可以是用tar命令的压缩选项-z来减少需要的磁盘数目,该选项指定tar将存档使用gzip进行压缩处理以减小存档大小。这个特性有好处也有坏处,好处就是可以减少存档大小,坏处是压缩存档的任何一处的错误就会导致整个存档不可恢复。某些程序在备份文件以前将这些文件一个个单独压缩,这时一个好主意。

前面我提到可以仅仅备份某个时间以后被修改的文件,使用tar,你能使用N选项来进行这样的存档,例如:
$ tar -cf /dev/ftape -N yesterday /home

将备份/home目录下昨天以后被修改的所有文件。这一次数据被备份到软磁带设备/dev/ftape中。实现该功能的另外一个可选的方法是联合使用find和tar命令:
$ find /home -cnewer /etc/last_backup -type f i-print > back_these_up
$ tar -cf /dev/ftape -T back_these_up
$ touch /etc/last_backup

find命令用来查找所有在/etc/last_backup被修改以后内容发生了变化的文件,并将查找结果存放在文件back_these_up之中,T选项指示tar命令备份文件back_these_up中指定的的所有文件;随后touch文件/etc/last_backup,其将作为下次备份的时间点。将若干个这样的命令连接在一起使用是非常有用的。作为一个副产品我们的到了我们备份的文件的名字的列表文件,及最新一次备份的时间。(文件etc/last_backup的时间戳)。

我们可以做的另外一件事情就是过滤文件列表,从而使特定的文件不被备份。例如,也许会希望不备份对象文件或者DVI文件,因为它们可以由源文件生成。若仅仅希望忽略一种类型的文件则一个简单的grep -v将完成这个功能,egrep则可以被用来忽略多种类型的文件,如下例所示我们只要修改上例的第一行即可:
$ find /home -cnewer /etc/last_backup -type f i-print | egrep
-v '<<.o$|< back_these_up

这个功能也可以使用find来实现,当然可能不如egrep那么强大:
$ find /home -cnewer /etc/last_backup -type f ! ( -name *.o -o -name
*.dvi ) -print > back_these_up

常常会出现你的备份要求不能仅用一个简单的tar命令完成的情况,这个时候应该自己写脚本来完成需要的功能。这个脚本可能简单到上面的示例那样只有几行程序,也可能非常复杂。一个非常简单的脚本,定期使用cron来运行,能使备份变为非常简单的过程。

备份不应该成为一个长时间的痛苦的事情,但它是作为系统管理必不可少的工作。在着手之前进行详细的考虑和计划是应该的。做出对系统进行完全备份的决定是非常容易的,同样做出六个月以前的几个文件的老备份也是可以满足需要的决定也是非常容易的,而实际是最好的策略是在两者之间。

Linux环境下,如何使用备份的脚本和命令以及商业化的软件来合理高效地保护磁盘数据安全。备份与恢复系统承担着事前备份与事后恢复的职能。在当前高速发展的网络环境下,任何一个网络上的信息系统都不可能保证绝对的安全。只要有网络存在,就会有来自网络的形形色色的威胁。为了抵御网络的攻击和入侵,虽然我们引入了日趋成熟的入侵检测系统、防火墙系统等,黑客们的入侵手段也日益高明,他们总能找到这些系统的安全漏洞及不足进行入侵,因而网络入侵所引起的安全事件呈逐年增加之势。

在这种情况下,我们难以保证网络中关键系统的绝对安全,因而就需要采用备份及恢复技术。备份及恢复技术就是使用存储介质和一定的策略,定期将系统业务数据备份下来,以保证数据意外丢失时能尽快恢复,将用户的损失降到最低点。它是信息安全学科中一种非常重要的核心技术。

Linux下的备份技术


对于备份和恢复来说,Linux提供了诸如tar、cpio、 dump等工具来实现。这样,用户无需花钱购买,便可根据系统的实际情况,结合使用相应的备份恢复工具实现备份与恢复的基本功能。

tar工具介绍

tar是一个已移植到 Linux 中的经典 Unix 命令。tar 是 tape archive(磁带归档)的缩写,最初设计用于将文件打包到磁带上,现在我们大都使用它来实现备份某个分区或者某些重要的文件目录。我们使用 tar 可以打包整个目录树,这使得它特别适合用于备份。归档文件可以全部还原,或从中展开单独的文件和目录。备份可以保存到基于文件的设备或磁带设备上。文件可以在还原时重定向,以便将它们重新放到一个与最初保存它们的目录(或系统)不同的目录(或系统)。tar是与文件系统无关的,因而它的适用范围很广,它可以使用在ext2、ext3、jfs、Reiser和其他文件系统上。

使用tar非常类似于使用诸如Windows环境下的 Winzip、WinRAR这样的文件实用工具。只需将它指向一个目的(可以是文件或设备),然后指定想要打包的文件,就可以通过标准的压缩类型来动态压缩归档文件,或指定一个自己选择的外部压缩程序。要通过bzip2压缩或解压缩文件,可使用tar -z命令。下面是一个简单的使用该工具进行数据备份的例子:
tar czvf - /root/code > /tmp/code_bak.tgz (将/root/code目录下的所有程序文件打包备份到/tmp/code_bak.tgz)
tar xzvf /tmp/code_bak.tgz /root/code (将备份的目录文件恢复到指定目录)

cpio工具介绍

cpio命令可以从tar或者cpio档案文件中拷入或者拷出文件。cpio命令和tar命令兼容,但是这个命令具备一些tar命令没有的功能,如下所示:
● 支持cpio和tar两种档案文件格式;
● 支持许多老式磁带数据格式;
● 能够通过一个管道(pipe-line)读取文件的文件名。
目前看来,只有很少的Linux软件包是以cpio格式发行的。用户如果对cpio命令的详细情况感兴趣,可以通过“man cpio ”命令阅读它的使用手册。

dump 和 restore介绍

dump可以执行类似tar的功能。然而,dump倾向于考虑文件系统而不是个别的文件。dump检查ext2文件系统上的文件,并确定哪些文件需要备份。这些文件将出于安全保护而被复制到给定的磁盘、磁带或其他存储媒体上。在大多数媒体上,容量是通过一直写入直至返回一个end-of-media标记来确定的。

配合dump的程序是restore,它用于从转储映像还原文件。restore命令执行转储的逆向功能。可以首先还原文件系统的完全备份,而后续的增量备份可以在已还原的完全备份之上覆盖。可以从完全或部分备份中还原单独的文件或者目录树。

dump和restore都能在网络上运行,因此用户可以通过远程设备进行备份或还原。dump和restore使用磁带驱动器和提供广泛选项的文件设备。然而,两者都仅限用于ext2和ext3文件系统。如果使用的是JFS、Reiser或者其他文件系统,将需要其他的实用工具,比如 tar。举个例子:
dump 0f /dev/nst0 /(将ext2文件系统备份到第一个SCSI设备)
restore -xf /dev/nst0 /home/code(将备份的SCSI设备中的/home/code目录下的所有数据还原到磁盘)

另外,现在市场上还存在着诸如Tivoli Storage Manager之类的商业化存储备份工具,这些都是可视化的工具,用户可以方便地通过用户界面来实现备份与恢复。值得注意的是,这是一款商业软件,因而并不是免费的,对于很多用户来说,它所提供的功能与我们上述的Linux自带的备份与恢复工具比较相似,只是更加人性化和友好,使用户从枯燥的命令行方式下摆脱出来,从而方便用户使用。

Linux中的备份策略

备份需要花费一定量的物力和财力,如何在备份所取得的收益与备份消耗的资源上做一个权衡是网络安全工作者需要考虑的一个大问题,因为支出大于产出也就意味着低效甚至失败。所以在 Linux环境中进行数据备份,需要根据实际情况进行区分对待,以取得比较好的效果。特别是,需要对一些关键的目录进行区分,从而做到有针对性的备份,减少不必要的浪费。

一般情况下,以下所列目录是需要备份的,它们在系统中具有举足轻重的地位:/etc包含所有核心配置文件,这其中包括密码文件、网络配置文件、系统名称、防火墙规则、NFS文件系统配置文件以及其他全局系统项;/var包含系统守护进程(服务)所使用的信息,包括 DNS 配置、DHCP 租期、邮件缓冲文件、HTTP 服务器文件等;/home包含所有用户的默认用户主目录,这包括他们的个人设置、已下载的文件和用户存放在系统中的重要的信息;/root是根 (root)用户的主目录;/bin是存放许多系统中常用的诸如ls、ps等命令的重要场所,这些命令在磁盘上均有影响,极容易遭受黑客的破坏。

相反地,在Linux系统中,如下目录是不应该备份的:/proc永远不需要备份,它不是一个真实的文件系统,而是运行内核和环境的虚拟化视图,它包括诸如 /proc/cpuinfo、/proc/meminfo 这样的文件,这个文件是整个运行内存的虚拟视图,一旦系统关机或者重新启动,该目录下的信息便不复存在;/dev包含硬件设备的文件表示,如果计划还原到一个空白的系统,那就可以备份 /dev,如果计划还原到一个已安装的Linux系统,那么备份/dev 是没有必要的;另外,一些软链接(也就是指向另外一些磁盘文件的文件)是不需要备份的,因为这些文件当中存储的只是被指向文件的地址,这些软链接文件,用户可以通过使用“ls -l”命令来判定,如下所示,其中linux-2.4即为一个软链接文件,它指向的是linux-2.4.7-10这个目录。

备份技术及基本分类

一般说来,建立一套完备的网络数据备份系统必须具备如下几个必要条件:
● 数据备份的容量都是比较大的,所以针对关键业务系统的数据备份需要实现自动化,以减少系统管理员的工作量 ;
● 以备份服务器形成备份中心,对各种平台的应用系统及其他信息数据进行集中的备份,系统管理员可以在任意一台工作站上管理、监控、配置备份系统,实现分布处理,集中管理的特点;
● 用户可以比较方便和快捷地恢复损坏的整个文件系统和各类数据;
● 备份系统还应考虑网络带宽对备份性能的影响,备份服务器的平台选择及安全性,备份系统容量的适度冗余,备份系统良好的扩展性等因素。
进行备份工作需要确定数据备份的策略。备份策略指确定需备份的内容、备份时间及备份方式。用户要根据自己的实际情况来制定不同的备份策略。目前被采用最多的备份策略主要有以下三种:

1.完全备份
就是每天对系统进行完全备份。这种备份策略的好处是:当发生数据丢失的灾难时,就可以恢复丢失的数据。然而它亦有不足之处。首先,由于每天都对整个系统进行完全备份,造成备份的数据大量重复。这些重复的数据占用了大量的空间,这对用户来说就意味着增加成本。其次,由于需要备份的数据量较大,因此备份所需的时间也就较长。对于那些业务繁忙、备份时间有限的用户和单位来说,选择这种备份策略是不明智的。并且,由于备份的时间间隔太小而造成的完全备份数目过多,造成硬件资源的大量浪费,也是很不必要的。

2.增量备份
就是每天只对当天新的或被修改过的数据进行备份。这种备份策略的优点是节省了存储介质空间,缩短了备份时间。但它的缺点在于,当灾难发生时,数据的恢复比较麻烦。另外,这种备份的可靠性也很差。备份间隔中的数据是无法恢复的,这就需要用户在指定备份间隔时做适当的权衡,才能取得比较好的效果。

3.差分备份
管理员先在最初(例如星期天)进行一次系统完全备份,然后在接下来的几天里,管理员再将当天所有与星期天不同的数据(新的或修改过的)备份到磁介质上。差分备份策略在避免了以上两种策略的缺陷的同时,又具有了它们的所有优点。首先,它无需每天都对系统做完全备份,因此备份所需时间短,并节省了空间;其次,它的灾难恢复也很方便。


该文章最后由 阿炯 于 2015-03-05 13:05:58 更新,目前是第 2 版。