在Linux服务器上做备份和恢复
进行一般的备份应该是负责任的系统管理者的最高优先考虑。虽然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”只备份使用者的档案)。
要指定哪些档案应该包含在您的 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 指令两三次就会跳到档案真正开头的地方。