Linux日誌式檔案系統面面觀(轉)

ba發表於2007-08-12
Linux日誌式檔案系統面面觀(轉)[@more@]檔案系統是用來管理和組織儲存在磁碟驅動器上的資料的系統軟體,其實現了資料完整性的保 證,也就是保證寫入磁碟的資料和隨後讀出的內容的一致性。除了儲存以檔案方式儲存的資料以外,一個檔案系統同樣儲存和管理關於檔案和檔案系統自身的一些重要資訊(例如:日期時間、屬主、訪問許可權、檔案大小和儲存位置等等)。這些資訊通常被稱為後設資料(metadata)。

   由於為了避免磁碟訪問瓶頸效應,一般檔案系統大都以非同步方式工作,因此如果磁碟操作被突然中斷可能導致資料被丟失。例如如果出現這種情況:如果當你處理一個在linux的ext2檔案系統上的文件,突然機器崩潰會出現什麼情況?

   有這幾種可能:

   *當你儲存檔案以後,系統崩潰。這是最好的情況,你不會丟失任何資訊。只需要重新啟動計算機然後繼續工作。

   *在你儲存檔案之前系統崩潰。你會丟失你所有的工作內容,但是老版本的文件還會存在。

   *當正在將儲存的文件寫入磁碟時系統崩潰。這是最糟的情況:新版檔案覆蓋了舊版本的檔案。這樣磁碟上只剩下一個部分新部分舊的檔案。如果檔案是二進位制檔案那麼就會出現不能開啟檔案的情況,因為其檔案格式和應用所期待的不同。

   在最後這種情況下,如果系統崩潰是發生在驅動器正在寫入後設資料時,那麼情況可能更糟。這時候就是檔案系統發生了損壞,你可能會丟失整個目錄或者整個磁碟分割槽的資料。

   linux標準檔案系統(ext2fs)在重新啟動時會透過呼叫檔案掃描工具fsck試圖恢復損壞的後設資料資訊。由於ext2檔案系統儲存有冗餘的關鍵後設資料資訊的備份,因此一般來說不大可能出現資料完全丟失。系統會計算出被損壞的資料的位置,然後或者是透過恢復冗餘的後設資料資訊,或者是直接刪除被損壞或是後設資料資訊損毀的檔案。

   很明顯,要檢測的檔案系統越大,檢測過程費時就越長。對於有幾十個G大小的分割槽,可能會花費很長時間來進行檢測。由於Linux開始用於大型伺服器中越來越重要的應用,因此就越來越不能容忍長時間的當機時間。這就需要更復雜和精巧的檔案系統來替代ext2。

   因此就出現了日誌式檔案系統(journalling filesystems)來滿足這樣的需求。


什麼是日誌式檔案系統

   這裡僅僅對日誌式檔案系統進行簡單的說明。如果需要更深入的資訊請參考文章日誌式檔案系統,或者是日誌式檔案系統介紹。

   大多數現代檔案系統都使用了來自於資料庫系統中為了提高崩潰恢復能力而開發的日誌技術。磁碟事務在被真正寫入到磁碟的最終位置以前首先按照順序方式寫入磁碟中日誌區(或是log區)的特定位置。

   根據日誌檔案系統實現技術的不同,寫入日誌區的資訊是不完全一樣的。某些實現技術僅僅寫檔案系統後設資料,而其他則會記錄所有的寫操作到日誌中。

   現在,如果崩潰發生在日誌內容被寫入之前發生,那麼原始資料仍然在磁碟上,丟失的僅僅是最新的更新內容。如果當崩潰發生在真正的寫操作時(也就是日誌內容已經更新),日誌檔案系統的日誌內容則會顯示進行了哪些操作。因此當系統重啟時,它能輕易根據日誌內容,很快地恢復被破壞的更新。

   在任何一種情況下,都會得到完整的資料,不會出現損壞的分割槽的情況。由於恢復過程根據日誌進行,因此整個過程會非常快只需要幾秒鐘時間。

   應該注意的是使用日誌檔案系統並不意味著完全不需要使用檔案掃描工具fsck了。隨機發生的檔案系統的硬體和軟體錯誤是根據日誌是無法恢復的,必須藉助於fsck工具。

   目前Linux環境下的日誌檔案系統

   在下面的內容裡將討論三種日誌檔案系統:第一種是ext3,由Linux核心Stephen Tweedie開發。ext3是透過向ext2檔案系統上新增日誌功能來實現的,目前是redhat7.2的預設檔案系統;Namesys開發的ReiserFs日誌式檔案系統,可以從下載,目前Mandrake8.1採用該日誌式檔案系統。SGI在2001年三月釋出了XFS日誌式檔案系統。可以在 oss.sgi.com/projects/xfs/下載。下面將對這三種日誌檔案系統採用不同的工具進行檢測和效能測試。


安裝ext3

   關於ext3檔案系統技術方面的問題請參考Dr. Stephen Tweedie的論文和訪談。ext3日誌式檔案系統直接來自於其祖先ext2檔案系統。其具有完全向後相容的關鍵特性,實際上其僅僅是在ext2日誌式檔案系統上新增了日誌功能。其最大的缺點是沒有現代檔案系統所具有的能提高檔案資料處理速度和解壓的高效能。

   ext3從 2.2.19開始是作為一個補丁方式存在的。如果希望對核心新增對ext3檔案系統的支援,就需要使用補丁,可以從ftp.linux.org.uk/pub/linux/sct/fs/jfs或ftp.kernel.org/pub/linux/kernel/people/sct/ext3得到補丁程式,一共需要如下檔案:

   * ext3-0.0.7a.tar.bz2:核心補丁

   * e2fsprogs-1.21-WIP-0601.tar.bz2 支援ext3的e2fsprogs程式套件

   複製linux-2.2.19.tar.bz2和ext3-0.0.7a.tar.bz2到/usr/src目錄下,進行解壓:

   mv linux linux-old
   tar -Ixvf linux-2.2.19.tar.bz2
   tar -Ixvf ext3-0.0.7a.tar.bz2
   cd linux
   cat ../ext3-0.0.7a/linux-2.2.19.kdb.diff | patch -sp1
   cat ../ext3-0.0.7a/linux-2.2.19.ext3.diff | patch -sp1

   首先對核心新增SGI的kdb核心偵錯程式補丁,第二個是ext3檔案系統補丁。下來就需要配置核心,對檔案系統部分的"Enable Second extended fs development code"回答Yes。然後編譯。

   核心編譯安裝以後,需要安裝e2fsprogs軟體套件:

   tar -Ixvf e2fsprogs-1.21-WIP-0601.tar.bz2
   cd e2fsprogs-1.21
   ./configure
   make
   make check
   make install

   下來要做的工作就是在分割槽上建立一個ext3檔案系統,使用新核心重新啟動,這時候你有兩種選擇建立新的日誌檔案系統或者對一個已有的ext2檔案系統升級到ext3日誌檔案系統。

   對於需要建立新ext3檔案系統的情況下,只需要使用安裝的e2fsprogs軟體包中的mke2fs命令加-f引數就可以建立新的ext3檔案系統:

   mke2fs -j /dev/xxx

   這裡/dev/xxx是希望建立ext3檔案系統的新分割槽。-j參數列示建立ext3而不是ext2檔案系統。可以使用引數"-Jsize="來指定希望的日誌區大小(n單位為M)。

   升級一個已有的ext2,使用tune2fs就可以了:

   tune2fs -j /dev/xxx

   你可以對正在載入的檔案系統和沒有載入的檔案系統進行升級操作。如果當前檔案系統正在被載入,則檔案.journal會在檔案系統載入點的所在目錄被建立。如果是升級一個當時沒有載入的檔案系統,則使用隱含的系統inode來記錄日誌,這時候檔案系統的所有內容都會被保留不被破壞。

   你可以使用下面的命令載入ext3檔案系統:

   mount -t ext3 /dev/xxx /mount_dir

   由於ext3實際上是帶有日誌功能的ext2檔案系統 ,因此一個ext3檔案系統可以以ext2的方式被載入。


安裝XFS檔案系統

   如果需要從技術方面瞭解XFS檔案系統,請參考SGI的XFS檔案系統和SGI資訊頁面。也可以參考FAQ。

   XFS是一個SGI開發的linux環境下的日誌檔案系統,它是一個成熟的技術,最初是使用在IRIX系統上的檔案系統。XFS遵循GPL版權申明。目前xfs檔案系統最新版本是1.02。可以從下載得到對核心xfs檔案系統支援補丁或者直接下載RPM包方式的核心,下面我們就以補丁方式說明如何對2.4.14核心使用xfs。首先下載如下內容

   patch-2.4.14-xfs-1.0.2.bz2
   patch-2.4.14-xfs-1.0.2-kdb.bz2

   複製Linux核心linux-2.4.2.tar.bz2到 /usr/src目錄下,修改老的核心目錄名,然後解壓新核心:

   mv linux linux-old
   tar -Ixf inux-2.4.2.tar.bz2

   複製每個每個補丁到核心原始碼目錄下(例如:/usr/src/linux),並打補丁:

   zcat patch-2.4.14-xfs-1.0.2.bz2 | patch -p1
   zcat patch-2.4.14-xfs-1.0.2-kdb.bz2 | patch -p1

   然後配置核心,開啟檔案系統部分的核心選項:"XFS filesystem support" (CONFIG_XFS_FS)和"Page Buffer support" (CONFIG_PAGE_BUF)。同時需要升級下面這些系統工具到下面或更高的版本:

   modutils-2.4.0
   autoconf-2.13
   e2fsprogs-devel-1.18

   安裝新核心並重啟伺服器。

   然後下載xfs工具。這個軟體包包括下面的命令來處理檔案系統,使用下面的命令來安裝該軟體包::

   tar -zxf xfsprogs-1.2.0.src.tar.gz
   cd xfsprogs-1.2.0
   make configure
   make
   make install

   安裝這些命令以後,就可以建立新的XFS檔案系統:

   mkfs -t xfs /dev/xxx

   如果xxx是一個已經存在的檔案系統,那麼就需要使用"-f"引數來建立新分割槽,但是記得這將會破壞該分割槽的所有資料。

   mkfs -t xfs -f /dev/xxx

   建立以後就可以使用基於下面的命令載入新檔案系統:

   mount -t xfs /dev/xxx /mount_dir


安裝ReiserFS檔案系統

   如果希望更多地從技術方面瞭解reiserFS檔案系統,請參考NAMESYS和FAQ。

   ReiserFS檔案系統從2.4.1-pre4開始就是Linux核心的正式支援的檔案系統了。為了使用reiserFS檔案系統那你首先需要在系統上安裝檔案系統支援工具(如:建立ReiserFS檔案系統的mkreiserfs工具)。最新的ReiserFS檔案系統版本可以以補丁的方式新增到2.2.x或者2.4.x核心中。這裡我們以2.2.19為例:

   第一步,首先下在核心原始碼,並下在ReiserFS檔案系統的2.2.19補丁 ,目前補丁最新版本是linux-2.2.19-reiserfs-3.5.34-patch.bz2。同時應該下載工具軟體包:reiserfsprogs-3.x.0j.tar.gz。

   然後解壓核心原始碼和補丁包到/usr/src中:

   tar -Ixf linux-2.2.19.tar.bz2
   bzcat linux-2.2.19-reiserfs-3.5.34-patch.bz2 | patch -p0

   編譯核心支援reiserfs,安裝核心。然後安裝檔案系統工具軟體:

   cd /usr/src/linux/fs/reiserfs/utils
   make
   make install

   安裝新核心並重新啟動。現在就可以建立新的reiserfs檔案系統,並載入:

   mkreiserfs /dev/xxxx
   mount -t reiserfs /dev/xxx /mount_dir

   檔案系統效能測試

   測試環境使用的計算機環境如下:Pentium III - 16 Mb RAM - 2 Gb HD,作業系統為RedHat6.2。所有的檔案系統都能正常工作,所以就進行benchmark分析來對它們進行效能比較。首先我直接拔掉系統電源以模擬系統掉電情況,以測試日誌檔案系統恢復過程。所有的檔案系統都成功地經過了檔案掃描檢測階段,在數秒以後系統都經過了掃描然後正常啟動了系統。

   下一步就採用了bonnie++效能測試程式(進行測試,這個程式對一個檔案進行資料庫型別的訪問,進行了建立、讀和刪除小檔案,這些操作對於Squid、INN或者Maildir格式的郵件伺服器程式(qmail)是最常見的操作。效能測試命令為:

   bonnie++ -d/work1 -s10 -r4 -u0

   其對載入在/work1目錄下的檔案系統進行了10Mb(-s10)的測試。因此在執行測試之前必須建立適當型別的檔案系統並載入到目錄/work1下。其他的引數指定記憶體大小(-r4)的M數,和以root身份執行測試程式,測試結果如下:


每種測試都有兩組資料:檔案系統速度(K/sec)和CPU佔用率(%CPU)。速度越高,檔案系統越好。而對於CPU率來說,數字越小效能越好。可以看到Reiserfs檔案系統在檔案操作方面(Sequential Create和Random Create部分的) 的效能最好,超出其他檔案系統10倍之多。在其他方面(Sequential Output和Sequential Input)則和其他檔案系統效能不相上下。對於其他檔案系統則沒有特別明顯的區別。XFS效能接近ext2檔案系統,ext3檔案系統則比ext2要稍微慢上一些(因為記錄日誌需要一些額外的時間)。 最後使用從得到的效能測試程式mongo,並對其進行了修改以對三種日誌檔案系統進行測試。這裡在mongo.pl程式中新增了新增了載入xfs和ext3檔案系統的命令,並對其進行格式化處理,然後就開始效能測試分析。 該指令碼格式劃分割槽/dev/xxxx,載入其並在每個階段執行指定數目的程式:建立、複製、符號連線處理、讀、顯示檔案狀態資訊、重新命名和刪除檔案。同時,該程式在建立和複製階段以後會計算分段數(fragmentation)。

   Fragm = number_of_fragments / number_of_files

   可以在結果檔案中得到同樣的測試比較結果:

   log - 原始結果
   log.tbl - 比較程式的輸出結果
   log_table - 表格式的結果

   下面的命令進行測試:

   mongo.pl ext3 /dev/hda3 /work1 logext3 1

   如果要測試其他檔案系統,就需要把上面命令的引數中的ext3修改為reiserfs或xfs。其他引數分別為要載入的分割槽,載入路徑,儲存測試結果的檔名及啟動的程式數。

   下面的表格是測試結果。資料單位為秒。值越低效能越好。第一個表格測試使用的資料塊大小為100位元組,第二個表格為1000位元組,最後一個為10000位元組

   從上面的表格可以看到ext3在狀態刪除和重新命名方面要效能更好一些,而ReiserFS檔案系統在檔案建立和複製效能表現更出色。同時也可以看到reiserFS正如其技術文件提到的其在小檔案處理方面效能相當出色。

   結論

   目前Linux至少有兩個健壯可靠的日誌檔案系統可供選擇(XFS和reiserFS),其都得到了廣泛的應用。例如Mandrake8.1就預設支援reiserFS檔案系統。

   從效能測試的結果可以看到,reiserFS是最好的選擇。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-952592/,如需轉載,請註明出處,否則將追究法律責任。

相關文章