unix中利用Find命令備份根文件系統(tǒng)
在Unix操作系統(tǒng)中有很多命令可以用來(lái)備份文件。但是Unix操作系統(tǒng)中根文件系統(tǒng)是一種比較特殊的文件。通常情況下對(duì)這類文件進(jìn)行備份的話,必須要卸載其他文件系統(tǒng)。因?yàn)楦募到y(tǒng)是其他文件系統(tǒng)的祖宗,如果不卸載的話,會(huì)同時(shí)備份其他文件系統(tǒng)中的文件。但是如果先卸載其他文件系統(tǒng)再進(jìn)行備份的話,那么就會(huì)很麻煩。為此在find命令中提供了一個(gè)很有用的參數(shù),可以幫助我們實(shí)現(xiàn)這個(gè)功能。
一、根文件系統(tǒng)備份的重要性及備份的難點(diǎn)。
當(dāng)系統(tǒng)發(fā)生崩潰時(shí),雖然可以通過(guò)重新安裝操作系統(tǒng)來(lái)恢復(fù)。但是這個(gè)工作量很大,因?yàn)樾枰匦掳惭b每個(gè)外部設(shè)備。在Unix操作系統(tǒng)中,安裝并配置每個(gè)外部設(shè)備的驅(qū)動(dòng)程序是一件很麻煩的事情。如果系統(tǒng)工程師能夠在平時(shí)的工作中備份好根文件系統(tǒng)中的文件,那么在遇到系統(tǒng)故障時(shí),即使需要重新安裝操作系統(tǒng),那么也只需要安裝Unix操作系統(tǒng)的最小集合。然后把這些根文件系統(tǒng)中的配置文件恢復(fù)過(guò)去,那么就省去了配置外部設(shè)備的麻煩。
但是在備份根文件系統(tǒng)的時(shí)候,由于其地位的特殊性會(huì)遇到不少的麻煩。如無(wú)論在什么時(shí)候把外部設(shè)備添加到Unix操作系統(tǒng)中,或者無(wú)論什么時(shí)候?qū)⑼獠吭O(shè)備從系統(tǒng)中卸載掉,根文件系統(tǒng)中的配置文件都要發(fā)生變化。也就是說(shuō),根文件系統(tǒng)中的配置文件在不斷變化的。為此操作系統(tǒng)要能夠鑒別那些變化了的配置文件,然后有選擇的進(jìn)行復(fù)制。否則的話,就會(huì)增加備份的工作量。其次由于根文件系統(tǒng)是其他文件系統(tǒng)的祖宗,為此對(duì)根文件系統(tǒng)進(jìn)行備份的話,系統(tǒng)會(huì)同時(shí)對(duì)其他文件系統(tǒng)中的內(nèi)容進(jìn)行備份。這無(wú)疑不是我們所希望達(dá)到的目的。
二、可選項(xiàng)mount的作用。
在find命令中有一個(gè)-mount可選項(xiàng)。如果采用find / -mount命令的話,操作系統(tǒng)不會(huì)在加載點(diǎn)查找其他文件系統(tǒng)的文件。也就是說(shuō),利用這個(gè)可選項(xiàng)可以只對(duì)根文件系統(tǒng)進(jìn)行備份,而不需要卸載其他文件系統(tǒng),而且也不會(huì)訪問(wèn)他們。即使用了這個(gè)可選項(xiàng)的find命令,其搜索的路徑只在根文件系統(tǒng)下。
為此對(duì)根文件系統(tǒng)常用的備份策略是,當(dāng)系統(tǒng)已經(jīng)得到完整的、正確的配置之后,系統(tǒng)工程師立刻使用-mount可選項(xiàng)對(duì) 根文件系統(tǒng)進(jìn)行全面的備份。然后每當(dāng)根文件系統(tǒng)下的配置文件發(fā)生變化后,再對(duì)他們進(jìn)行增量備份即可。可見(jiàn)通過(guò)-mount選項(xiàng)可以解決根文件系統(tǒng)備份過(guò)程中遇到的第一個(gè)問(wèn)題。
三、辨別文件是否發(fā)生變化。
在根文件備份中要實(shí)現(xiàn)增量備份,操作系統(tǒng)就必須首先要判斷那些文件在上次備份之后更新了。為了達(dá)到這個(gè)目的,F(xiàn)ind命令提供了兩種處理機(jī)制,分別采用-newer參數(shù)與-mtime參數(shù)。
1、 利用newer可選項(xiàng)來(lái)實(shí)現(xiàn)。
利用newer可選項(xiàng)來(lái)實(shí)現(xiàn)這個(gè)需求的話,比較麻煩一點(diǎn),但是相對(duì)來(lái)說(shuō)卻比較科學(xué)一點(diǎn)。要利用這個(gè)可選項(xiàng)來(lái)實(shí)現(xiàn)這個(gè)命令的話,主要分為三個(gè)步驟。
第一步:建立一個(gè)零字節(jié)的對(duì)比文件。系統(tǒng)工程師首先要利用VI或者其他工具創(chuàng)建一個(gè)零字節(jié)的文件。這個(gè)文件到底有什么用途,筆者下面馬上會(huì)談到。在使用newer可選項(xiàng)來(lái)判斷哪些文件在上次備份后進(jìn)行了修改,這個(gè)零字節(jié)的文件在其中起動(dòng)了關(guān)鍵的作用。其實(shí)我們用到的并不是這個(gè)文件內(nèi)容的本身,而是用到了這個(gè)文件中的時(shí)間屬性。
第二步:利用touch命令來(lái)修改時(shí)間屬性。眾所周知,在Unix操作系統(tǒng)中的文件有很多屬性,如創(chuàng)建時(shí)間、修改時(shí)間等等。在很多腳本程序中,需要用到這些文件屬性。而此時(shí)我們就需要用到這些文件屬性中的修改時(shí)間屬性。利用touch命令可以修改文件的事件屬性。如我們利用touch 文件名字,可以把系統(tǒng)的當(dāng)前時(shí)間賦值給文件的修改時(shí)間截。
第三步:利用-newer參數(shù)進(jìn)行比較。我們利用newer 參數(shù)來(lái)尋找上次備份后所改變的文件主要思路就是備份完成之后,把上面建立的這個(gè)零字節(jié)文件的修改時(shí)間截改為備份完之后的時(shí)間。然后在下次備份的時(shí)候,再利用-newer可選項(xiàng),把查找到的文件的修改時(shí)間與這個(gè)零字節(jié)文件的修改時(shí)間(上次備份后的事件)屬性來(lái)進(jìn)行比較。此時(shí)find命令只會(huì)把那些比這個(gè)時(shí)間更新的文件查找出來(lái)并進(jìn)行備份。為此find命令加上touch命令,然后再結(jié)合-newer可選項(xiàng)就可以把上次備份后更新了的文件找出來(lái)。所以在書(shū)寫(xiě)腳本程序的時(shí)候,需要把find命令寫(xiě)在前面。備份完成所需要的文件之后才能夠利用touch命令來(lái)修改零字節(jié)文件的時(shí)間屬性。
2、 利用mtime可選項(xiàng)來(lái)實(shí)現(xiàn)。
其實(shí)在Unix操作系統(tǒng)的Find命令中,本身就帶有一個(gè)可選項(xiàng)-mtime。這個(gè)選項(xiàng)就是指在最近某個(gè)時(shí)段內(nèi)修改過(guò)的文件。在Find這個(gè)可選項(xiàng)之后,系統(tǒng)會(huì)比較系統(tǒng)的修改時(shí)間與當(dāng)前的系統(tǒng)時(shí)間。把這個(gè)時(shí)間差額與mtime可選項(xiàng)指定的時(shí)間差額進(jìn)行比較。如mtime 1就表示把最近一天(24小時(shí))內(nèi)更改過(guò)的文件全部查找出來(lái)。這也可以達(dá)到增量備份的目的,只是其可能不怎么科學(xué)。如可能由于安裝了某個(gè)重要的外部設(shè)備之后,系統(tǒng)工程師手工執(zhí)行了備份腳本。而讓系統(tǒng)自動(dòng)進(jìn)行備份的時(shí)候,其查找配置文件的時(shí)間參數(shù)是最近一天,而不是從上次備份之后,故就會(huì)出現(xiàn)重復(fù)備份的時(shí)候。不過(guò)通常情況下,這不會(huì)影響到備份的效率。為此如果系統(tǒng)工程師不了解NEWER與TOUCH應(yīng)用的話,那么也可以利用這mtime可選項(xiàng)來(lái)完成這個(gè)需求。他們是通用的。
但是如果備份的數(shù)據(jù)比較大,如一些大型應(yīng)用系統(tǒng)的日志文件,則最好采用第一種方式來(lái)查找需要備份的文件。因?yàn)榇藭r(shí)重復(fù)備份幾個(gè)文件可能會(huì)延長(zhǎng)備份的時(shí)間。不過(guò)如果只是備份Unix操作系統(tǒng)的配置文件,這兩種方法都可以使用;而且其備份時(shí)間基本上相同。筆者是比較偏向于采用第一種方法的。其實(shí)只要掌握其實(shí)現(xiàn)的原理,在寫(xiě)腳本的時(shí)候才用這第一種方式也并沒(méi)有多大的難度。
四、顯示備份文件的列表。
有時(shí)候系統(tǒng)工程師希望每次備份完成之后操作系統(tǒng)都能夠把備份文件的名字保存在一個(gè)文件中。如此當(dāng)系統(tǒng)工程師向恢復(fù)某個(gè)配置文件的時(shí)候,他就可以查看這些文件,以確定這個(gè)文件最近的備份時(shí)間以及備份的地點(diǎn)。另外為了迅速定位這些文件,系統(tǒng)工程師還希望這些保存?zhèn)浞菸募畔⒌奈募帜軌蛞詡浞莸娜掌诿榱藢?shí)現(xiàn)這個(gè)需求,筆者建議大家可以使用下面這個(gè)命令來(lái)實(shí)現(xiàn)。
find / -mount –mtine 1 –printf | cpio –ov >/backup 2>backuplist_’date+%d%b%y’。在這個(gè)命令中,-ov可選項(xiàng)中的v表示顯示每個(gè)被備份的文件。其實(shí)-ov是兩個(gè)可選項(xiàng),分別為-o與-v。在Unix操作系統(tǒng)中,如果一個(gè)命令中帶有多個(gè)可選項(xiàng)的話,可以把他們合并在一起寫(xiě),以節(jié)省書(shū)寫(xiě)的數(shù)量。為此可以把以上兩個(gè)可選項(xiàng)寫(xiě)為-ov。而backuplist_’date+%d%b%y’這個(gè)文件名字中筆者利用了一些參數(shù),讓操作系統(tǒng)自動(dòng)把備份文件的時(shí)間信息放入到文件名中。如此的話系統(tǒng)工程師一看文件名字就知道在某個(gè)時(shí)候備份了哪些文件。這個(gè)文件列表會(huì)每次備份時(shí)都生成一個(gè)文件,時(shí)間久了可能會(huì)有很多個(gè)文件。為此筆者有時(shí)候會(huì)把這個(gè)命名規(guī)則改為backuplist_’date+%d’。如此的話,最多就只有31個(gè)文件。操作系統(tǒng)會(huì)每個(gè)月循環(huán)一次,把舊的文件覆蓋掉。不過(guò)這個(gè)要慎用。如果系統(tǒng)工程師不需要以前的備份文件列表的話,那么可以采用這個(gè)命名規(guī)則。而且系統(tǒng)工程師還可以縮短這個(gè)循環(huán)周期,如文件名字中的的時(shí)間信息為“星期幾。那么每隔7天操作系統(tǒng)就會(huì)覆蓋原有的文件。但是對(duì)于配置文件來(lái)說(shuō),有時(shí)候幾個(gè)月沒(méi)有更改也是很正常的事情。為此對(duì)于配置文件的備份,則其需要保留所有的備份信息。此時(shí)就必須在文件名字中加入年月日等詳細(xì)的信息,以防止文件被覆蓋。
