Linux日志文件系統面面觀
文件系統是用來管理和組織保存在磁盤驅動器上的數據的系統軟件,其實現了數據完整性的保證,也就是保證寫入磁盤的數據和隨后讀出的內容的一致性。除了保存以文件方式存儲的數據以外,一個文件系統同樣存儲和管理關于文件和文件系統自身的一些重要信息(例如:日期時間、屬主、訪問權限、文件大小和存儲位置等等)。這些信息通常被稱為元數據(metadata)。
本文引用地址:http://www.104case.com/article/201610/305406.htm由于為了避免磁盤訪問瓶頸效應,一般文件系統大都以異步方式工作,因此如果磁盤操作被突然中斷可能導致數據被丟失。例如如果出現這種情況:如果當你處理一個在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日志式文件系統,可以從www.namesys.com下載,目前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
評論