在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天操作系統就會覆蓋原有的文件。 但是對於配置文件來說,有時候幾個月沒有更改也是很正常的事情。為此對於配置文件的備份,則其需 要保留所有的備份信息。此時就必須在文件名字中加入年月日等詳細的信息,以防止文件被覆蓋。