一、日志式文件系統簡介
盡管Linux可以支持種類繁多的文件系統,但是幾乎所有的Linux發行版都用ext2作為默認的文件系統。ext2的設計者主要考慮的是文件系統性能方面的問題。ext2在寫入文件內容的同時並沒有同時寫入文件的meta-data(和文件有關的信息,例如:權限、所有者以及創建和訪問時間)。換句話說,Linux先寫入文件的內容,然後等到有空的時候才寫入文件的meta-data。這樣若出現寫入文件內容之後但在寫入文件的meta-data之前系統突然斷電,就可能造成在文件系統就會處於不一致的狀態。在一個有大量文件操作的系統中出現這種情況會導致很嚴重的後果。因此就導致了新的日志式文件系統的出現以解決這個問題。日志文件系統比傳統的文件系統安全,因為它用獨立的日志文件跟蹤磁盤內容的變化。就像關系型數據庫(RDBMS),日志文件系統可以用事務處理的方式,提交或撤消文件系統的變化。Linux系統缺少日志式文件系統是限制推廣其在企業級應用的一個重要制約因素。因此就出現了多種不同的日志式文件系統,當前linux環境下有下面幾種日志文件可供選擇:
SGI的xfs日志文件系統,SGI的xfs是基於Irix(SGI的Unix)上已經實現的xfs。SGI已經宣布xfs為Open Source的軟件。
Veritas的文件系統和卷管理(volume manager)。
Reiserfs:Reiserfs應用了一些新的技術,例如,統一名字空間(unified name space)有一些Linux的發行版已經包括了reiserfs文件系統,作為安裝時的可選項。SuSE 6.4 就很容易使用reiserfs文件系統。reiserfs的最新版是ReiserFS 3.6.25,經過測試reiserfs的基准測試的結果是非常令人滿意的。
IBM的jfs。這兩文件系統都遵循開放源碼版權聲明,且的而且很多有天賦的人在開發這兩個文件系統。jfs(Journaled File System Technology for Linux)的開發者包括AIX(IBM的Unix)的jfs的主要開發者。在AIX上,jfs已經經受住了考驗。它是可靠、快速和容易使用的。
日志文件系統的另一個選擇是ext2的後繼者ext3fs文件系統。ext3fs文件系統正在Linux內核黑客Stephen Tweedie的領導下開發。ext3fs還處於beta測試階段,就像reiserfs和jfs,但是它工作得很好。Stephen預計2000年夏天可以正式發布ext3fs。ext3fs最大的優點是向下兼容ext2。而且ext3fs還支持異步的日志,這意味著它的性能可能還比ext2好。
在上面提到的日志式文件系統中,ReiserFS是目前Linux環境下最成熟的一種。而IBM的JFS和SGI的XFS則相對於來說要年輕一些,ext3文件系統則仍然需要開發。因此我們這裡選擇ReiserFS。
二、 為什麼叫日志式?
日志式文件系統在強調數據完整性的企業級服務器中有著重要的需求,是文件系統發展的方向。日志式文件系統的思想來自於如Oracle等大型數據庫。數據庫操作往往是由多個相關的、相互依賴的子操作組成,任何一個子操作的失敗都意味著整個操作的無效性,對數據庫數據的任何修改都要回復到操作以前的狀態。日志式文件系統采用了類似的技術。
在分區中保存有一個日志記錄文件,文件系統寫操作首先是對記錄文件進行操作,若整個寫操作由於某種原因(如系統掉電)而中斷,則在下次系統啟動時就會讀日志記錄文件的內容來恢復沒有完成的寫操作。而這個過程一般只需要幾秒鐘到幾分鐘,而不是ext2文件系統的fsck那樣在大型服務器情況下可能需要幾個小時來完成掃描。
對日志式文件系統原理的一個更詳細的描述可以參考Journal File Systems
三、獲得ReiserFS
Kernel 2.4.1已經包含了ReiserFS的代碼,但是最好使用包含了最新的ReiserFS 3.6.25的kernel 2.4.3,若你不是使用kernel 2.4.3,建議你使用這個版本的ReiserFS。本文將使用kernel 2.4.3來作為示例。
對於Kernel 2.4.2則需要打補丁:
# cd /usr/src/linux
# zcat linux-2.4.2-reiserfs-20010327.patch.gz patch -p1
對於2.2版本的內核:
# bzip2 -dc linux-2.2.18-reiserfs-3.5.32-patch.bz2 patch -p1
在make config階段需要對"prompt for development and/or incomplete code/drivers"回答Yes。否則系統就不會詢問關於ReiserFS的選項;在編譯內核的文件系統參數部分,應該選擇支持ReiserFS。若你不希望將root(/)安裝在ReiserFS文件系統下,則只需要將對ReiserFS的支持編譯為模塊即可。本文將討論將root安裝在ReiserFS之上的情況。
四、編譯內核和模塊
注:如果你使用的是RedHat7.0,那麼就需要首先邊際Makefile並將其中所有的gcc替換為kgcc。首先需要從redhat7.0安裝光盤上安裝kgcc,若沒有采取這一步,那麼得到的內核將會顯示kernel panics信息。Redhat7.0帶的gcc2.96有很多的bug。所有的內核編譯都應該使用kgcc來完成。
gcc vs. kgcc:
Linux 之父 Linus Torvalds 日前在 Linux核心郵件論壇中,表明了他對 Red Hat 7.0 的看法:『基本上不堪使用』。 節錄這封信的內容重點:『坦白地說,任何使用 Red Hat 7.0 和他們那壞掉的編譯器都會遇到麻煩。』『我不知道為何 Red Hat 選擇釋出那愚蠢的 gcc-2.96(一定通過沒有任何 gcc 技術人員的批准 - gcc 人員對此也很生氣),而且更令我驚訝的是他們顯然已經知道他們用的這個編譯器是壞的。他們包進了另一個好的編譯器,叫它作 kgcc。』 『kgcc 意思是核心 gcc,顯然因為 (a) 他們了解到核心編譯錯誤比某些應用程序編譯錯誤來得糟糕,和 (b)...』 『... 我認為 Red Hat 7.0 基本上並非一個可用的開發平台,而且我希望 Red Hat 將他們的編譯器降級...』 Red Hat 執行長 Matthew Szulik 對 Linus Torvalds 這番話的反應是:他不是真正能回應 Linus 這項挑戰的人選,而且他表示 Red Hat 也預料到會遭受這樣的譴責。 Red Hat 7.0 備受爭議的關鍵在於其中包含了 gcc 發展分支中的一個非正式的版本 gcc 2.96,gcc 小組曾表示『gcc 2.96 並非 gcc 正式版本』、『而且將來也不會有這個版本』,它只是在到達 gcc 3.0 路上的一站。 Red Hat 技術長 Michael Tiemann 最近曾為 Red Hat 7.0 使用 gcc 2.96 的決定作出辯護,他表示:『沒有技術上更好的決策』、『因為其他的選擇不會比較好 - 對 Red Hat 系列這樣復雜的需求而言 - 比起走回頭路,這項決定還能推動 gcc 3.0 的發展。』 Tiemann 還說,若批評者的矛頭想要找個目標,對使用 gcc 2.96 的決定『你也可以怪我』。)
下面我們將編譯ReiserFS工具,相應的代碼是存放在/usr/src/linux/fs/reiserfs/utils目錄中的,首先make編譯程序,然後再make install來安裝程序。2.4內核中並沒有包括這些工具,而需要另外下載。從這裡可以下載。
解壓文件:
# tar zxvf reiserfsprogs-3.x.0j.tar.gz
# cd reiserfsprogs-3.x.0j
# ./configure
# make
# make install
不幸的是,並沒有ext2toreiserfs之類的轉換工具,因此將/從ext2轉換為reiserfs就需要三步才能完成:
1.創建一個新的分區,並格式化為ReiserFS格式。
12.將數據從ext2分區拷貝到新分區。
13.將新分區加載為根(/)
創建新分區,ReiserFS並不需要一個特定的分區類型,因此就使用83(Linux):
# fdisk -l /dev/hda
/dev/hda9 2872 3126 2048256 83 Linux
/dev/hda10 3127 3381 2048256 83 Linux
在新分區上創建ReiserFS文件系統:
# mkreiserfs /dev/hda10
加載新的分區:
# mount -t reiserfs /dev/hda10 /mnt/hda10
拷貝數據到新分區:
# cd /mnt/hda10
# tar cvlf - / tar xf -
編輯fstab來指向新的root:
/dev/hda10/reiserfs defaults 1 1
創建指向reiserfsck的一個符號鏈接因為RedHat啟動時將尋找fsck.reiserfs文件來掃描:
# ln -s /sbin/reiserfsck/sbin/fsck.reiserfs
保證系統lilo至少為21.6。這是第一個支持ReiserFS的版本,也可以在/boot目錄中使用小容量的ext2文件系統。但是升級lilo更好一些。也推薦使用GRUB來實現引導。
當在lilo.conf中使用新的內核時需要運行lilo程序。其中lilo.conf中需要將root指向新的內核所在分區。