unix中利用Find命令备份根文件系统
在Unix操作系统中有很多命令可以用来备份文件。但是Unix操作系统中根文件系统是一种比较特殊的文件。通常情况下对这类文件进行备份的话,必须要卸载其他文件系统。因为根文件系统是其他文件系统的祖宗,如果不卸载的话,会同时备份其他文件系统中的文件。但是如果先卸载其他文件系统再进行备份的话,那么就会很麻烦。为此在find命令中提供了一个很有用的参数,可以帮助我们实现这个功能。
一、根文件系统备份的重要性及备份的难点。
当系统发生崩溃时,虽然可以通过重新安装操作系统来恢复。但是这个工作量很大,因为需要重新安装每个外部设备。在Unix操作系统中,安装并配置每个外部设备的驱动程序是一件很麻烦的事情。如果系统工程师能够在平时的工作中备份好根文件系统中的文件,那么在遇到系统故障时,即使需要重新安装操作系统,那么也只需要安装Unix操作系统的最小集合。然后把这些根文件系统中的配置文件恢复过去,那么就省去了配置外部设备的麻烦。
但是在备份根文件系统的时候,由于其地位的特殊性会遇到不少的麻烦。如无论在什么时候把外部设备添加到Unix操作系统中,或者无论什么时候将外部设备从系统中卸载掉,根文件系统中的配置文件都要发生变化。也就是说,根文件系统中的配置文件在不断变化的。为此操作系统要能够鉴别那些变化了的配置文件,然后有选择的进行复制。否则的话,就会增加备份的工作量。其次由于根文件系统是其他文件系统的祖宗,为此对根文件系统进行备份的话,系统会同时对其他文件系统中的内容进行备份。这无疑不是我们所希望达到的目的。
二、可选项mount的作用。
在find命令中有一个-mount可选项。如果采用find / -mount命令的话,操作系统不会在加载点查找其他文件系统的文件。也就是说,利用这个可选项可以只对根文件系统进行备份,而不需要卸载其他文件系统,而且也不会访问他们。即使用了这个可选项的find命令,其搜索的路径只在根文件系统下。
为此对根文件系统常用的备份策略是,当系统已经得到完整的、正确的配置之后,系统工程师立刻使用-mount可选项对 根文件系统进行全面的备份。然后每当根文件系统下的配置文件发生变化后,再对他们进行增量备份即可。可见通过-mount选项可以解决根文件系统备份过程中遇到的第一个问题。
三、辨别文件是否发生变化。
在根文件备份中要实现增量备份,操作系统就必须首先要判断那些文件在上次备份之后更新了。为了达到这个目的,Find命令提供了两种处理机制,分别采用-newer参数与-mtime参数。
1、 利用newer可选项来实现。
利用newer可选项来实现这个需求的话,比较麻烦一点,但是相对来说却比较科学一点。要利用这个可选项来实现这个命令的话,主要分为三个步骤。
第一步:建立一个零字节的对比文件。系统工程师首先要利用VI或者其他工具创建一个零字节的文件。这个文件到底有什么用途,笔者下面马上会谈到。在使用newer可选项来判断哪些文件在上次备份后进行了修改,这个零字节的文件在其中起动了关键的作用。其实我们用到的并不是这个文件内容的本身,而是用到了这个文件中的时间属性。
第二步:利用touch命令来修改时间属性。众所周知,在Unix操作系统中的文件有很多属性,如创建时间、修改时间等等。在很多脚本程序中,需要用到这些文件属性。而此时我们就需要用到这些文件属性中的修改时间属性。利用touch命令可以修改文件的事件属性。如我们利用touch 文件名字,可以把系统的当前时间赋值给文件的修改时间截。
第三步:利用-newer参数进行比较。我们利用newer 参数来寻找上次备份后所改变的文件主要思路就是备份完成之后,把上面建立的这个零字节文件的修改时间截改为备份完之后的时间。然后在下次备份的时候,再利用-newer可选项,把查找到的文件的修改时间与这个零字节文件的修改时间(上次备份后的事件)属性来进行比较。此时find命令只会把那些比这个时间更新的文件查找出来并进行备份。为此find命令加上touch命令,然后再结合-newer可选项就可以把上次备份后更新了的文件找出来。所以在书写脚本程序的时候,需要把find命令写在前面。备份完成所需要的文件之后才能够利用touch命令来修改零字节文件的时间属性。
2、 利用mtime可选项来实现。
其实在Unix操作系统的Find命令中,本身就带有一个可选项-mtime。这个选项就是指在最近某个时段内修改过的文件。在Find这个可选项之后,系统会比较系统的修改时间与当前的系统时间。把这个时间差额与mtime可选项指定的时间差额进行比较。如mtime 1就表示把最近一天(24小时)内更改过的文件全部查找出来。这也可以达到增量备份的目的,只是其可能不怎么科学。如可能由于安装了某个重要的外部设备之后,系统工程师手工执行了备份脚本。而让系统自动进行备份的时候,其查找配置文件的时间参数是最近一天,而不是从上次备份之后,故就会出现重复备份的时候。不过通常情况下,这不会影响到备份的效率。为此如果系统工程师不了解NEWER与TOUCH应用的话,那么也可以利用这mtime可选项来完成这个需求。他们是通用的。
但是如果备份的数据比较大,如一些大型应用系统的日志文件,则最好采用第一种方式来查找需要备份的文件。因为此时重复备份几个文件可能会延长备份的时间。不过如果只是备份Unix操作系统的配置文件,这两种方法都可以使用;而且其备份时间基本上相同。笔者是比较偏向于采用第一种方法的。其实只要掌握其实现的原理,在写脚本的时候才用这第一种方式也并没有多大的难度。
四、显示备份文件的列表。
有时候系统工程师希望每次备份完成之后操作系统都能够把备份文件的名字保存在一个文件中。如此当系统工程师向恢复某个配置文件的时候,他就可以查看这些文件,以确定这个文件最近的备份时间以及备份的地点。另外为了迅速定位这些文件,系统工程师还希望这些保存备份文件信息的文件名字能够以备份的日期命名。为了实现这个需求,笔者建议大家可以使用下面这个命令来实现。
find / -mount –mtine 1 –printf | cpio –ov >/backup 2>backuplist_’date+%d%b%y’。在这个命令中,-ov可选项中的v表示显示每个被备份的文件。其实-ov是两个可选项,分别为-o与-v。在Unix操作系统中,如果一个命令中带有多个可选项的话,可以把他们合并在一起写,以节省书写的数量。为此可以把以上两个可选项写为-ov。而backuplist_’date+%d%b%y’这个文件名字中笔者利用了一些参数,让操作系统自动把备份文件的时间信息放入到文件名中。如此的话系统工程师一看文件名字就知道在某个时候备份了哪些文件。这个文件列表会每次备份时都生成一个文件,时间久了可能会有很多个文件。为此笔者有时候会把这个命名规则改为backuplist_’date+%d’。如此的话,最多就只有31个文件。操作系统会每个月循环一次,把旧的文件覆盖掉。不过这个要慎用。如果系统工程师不需要以前的备份文件列表的话,那么可以采用这个命名规则。而且系统工程师还可以缩短这个循环周期,如文件名字中的的时间信息为“星期几。那么每隔7天操作系统就会覆盖原有的文件。但是对于配置文件来说,有时候几个月没有更改也是很正常的事情。为此对于配置文件的备份,则其需要保留所有的备份信息。此时就必须在文件名字中加入年月日等详细的信息,以防止文件被覆盖。