Linux备份策略研究

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

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

  系统备份

  进行系统备份的原因是尽量在系统崩溃以后能快速简单完全地恢复系统的运行。然而当然你不会希望花费几个月来备份你的系统。进行有效备份的最有效的方法是仅仅备份那些对于系统崩溃恢复所必需的数据。

  想想下面这种情况,你的系统大部分都非常稳定-/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$|<<<>.dvi$' > 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)