天天看點

ext4之核心文檔

最近接觸ext4比較多,是以就想着直接開一個部落格專門是ext4的,一方面是為了系統的學習下ext4,另一方面也是做一個标記,以後如果還有用到的地方可以回來再看看,當然最重要的還是和廣大的技術人員交流,如果能夠幫助到一些人就更好了。

ext4第一次釋出是在linux-2.6.19的核心裡,發展到現在,ext4的代碼已經是非常巨大,我下載下傳linux-4.7的核心代碼一看,居然有50W lines,我估計要是一行一行的看,我也不需要做什麼事了。然而打開linux-2.6.19的代碼,隻有大約2W lines,是以還是從起源開始吧,就像沒有人能夠出一本書叫做linux-4.7核心源代碼解析一樣。。。

這次看的是linux-2.6.19/Docment/filesystem/ext4.txt,這是核心關于ext4的文檔,講的還是比較好的。我直接翻譯下,後續的人看着友善一些,但是由于個人英語能力所限,翻譯過程可能有一些問題,歡迎指出。

Ext4 檔案系統

===============

這個版本的ext4是一個開發中的版本,一個比ext3性能優秀的fs,不但支援比ext3更加大的檔案系統,還兼顧了可擴充性和可靠性。

郵件清單: [email protected],大家如果想訂閱ext4的核心郵件的話,隻需要向這個郵件發送subscribe就可以了,不過每天會接受到好多封郵件,不過都是開源社群對于ext4的開發的讨論和計劃。

1. 快速使用ext4:

===========================

  - 開發者可以獲得e2fsprogs從以下路徑

    ftp://ftp.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs-interim/

    ftp://ftp.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/

  - 首先格式化 mke2fs -j /dev/hda1

  - 然後挂載檔案系統 mount /dev/hda1 /wherever -t ext4dev

  - 如果想打開extents的支援的話,可以在挂載的時候添加這個選項,但是前提是mke2fs的時候加上-o extents的支援。

mount /dev/hda1 /wherever -t ext4dev -o extents

  - ext4對于ext3是向後相容的,除非添加一個支援extents的檔案。比如: `mount -o extents’,然後在這個檔案系統上建立一個檔案.

  - ext3/4相比較于其他的檔案系統,提供了更高的資料完整性。

2. ext4特性

===========

2.1 目前版本支援的

* 檔案系統大小 > 16TB

* extent格式的檔案具有更強的健壯性,在面對磁盤上的沖突的時候。

* 内部的B+樹減少一些浪費的空間

2.1 之前可用的功能,以後會被"mkefs.ext4”支援:

* dir_index和可變更大小的inode

2.2 後續可能會支援的屬性

以下的都是正在讨論中的屬性:

* 修改的檔案配置設定功能 (一次多塊配置設定, 延遲配置設定)

* 去除32000個子目錄的限制 (這方面的更新檔已經做好了, 還需要e2fs的支援)

* nsec的時間戳,在mtime, atime, ctime上使用, (這方面的更新檔已經做好了, 還需要e2fs的支援)

* 增加inode的版本字段在磁盤存儲上

* 減少mke2fs/e2fsck的消耗的時間 

* 日志的校驗和

* 檔案的預配置設定功能 (e.g 特别是對于一些流媒體應用和資料庫應用)

比如中繼資料的校驗和已經經過了大量的讨論和計劃,但是還沒有開發出更新檔,是以我還不确定他是不是在近期會發出。

mballoc和delalloc會實作性能上的巨大提升.CFS已經使用了mballoc好多年了,IBM + Bull也做了很多的測試在這個上邊。這個特性之是以沒有在第一版的ext4就加進來,我認為是管理上的原因,而且因為這個特性直接影響了磁盤上的部署格式,是以,在第一版就加進來就引起了一些争議,我相信後續的版本一定會支援的。

3. 挂載選項

==========

當你挂載ext4檔案系統的時候,以下的選項在目前版本是支援的:

(*) == 預設的

extents ext4把檔案的資料話分成一個一個的區域,這樣的檔案系統就不能再被ext3挂載了.

journal=update 更新ext4的日志到目前格式.

journal=inum 當有日志存在的話,這個選項會被忽略,否則,這個選項制定了會有多少個inode代表ext4的日志檔案.

journal_dev=devnum 當外部的日志裝置的主裝置号和次裝置号變化的時候,這個選項允許使用者指定新的日志檔案的存放地點,就是通過devnum來指定主裝置号和次裝置号.

noload 在挂載的時候不載入日志.

data=journal 所有的資料寫入都會被日志記錄下來.

data=ordered (*)所有的中繼資料寫入都會被記錄下來,但是資料的寫入會直接寫入不會被記錄下來.

data=writeback 包括中繼資料在内的所有資料都會被直接寫入ext4而不會有日志記錄.

commit=nrsec (*)ext4在每過nrsec秒以後就會同步所有的資料,把這些資料寫入到掉電非易失存儲媒體上去,預設的值是5s.這就意味着如果掉電了,你最多丢失5s内寫入的資料,感謝日志的存在,你的檔案系統并不會崩潰,但是這個值會造成性能上的損失,但是對于資料安全是有好處的,如果設定為0的話,就意味着設定為預設值5s,設定為比較大的值會提升ext4的讀寫性能,但是同時也帶來了安全性的降低。

barrier=1 這個選項打開/關閉隔離,barrier=0的時候關閉,barrier=1的時候打開.

orlov (*) 這個選項會啟用新的orlov塊配置設定器.

oldalloc 這個選項會關閉掉新的orlov塊配置設定器,啟用原先的塊配置設定器. Orlov應當擁有更好的性能,如果在你那裡運作的結果不是這樣的話,你可以回報給我們

user_xattr 啟用擴充使用者屬性功能,此外,你還需要在核心配置選項中加上(CONFIG_EXT4_FS_XATTR).你可以看attr(5)使用者手冊以及http://acl.bestbits.at/ 來對使用者擴充屬性了解更多。

nouser_xattr 關閉擴充使用者屬性.

acl 打開POSIX标準支援的使用者控制權限清單,此外,你還需要在核心配置選項中添加(CONFIG_EXT4_FS_POSIX_ACL).你可以看acl(5)使用者手冊和http://acl.bestbits.at/來了解更多資訊。

noacl 這個選項關閉POSIX标準支援的使用者控制權限清單功能T.

reservation

noreservation

bsddf (*) 使得'df’指令的執行表現的像在BSD上.

minixdf 使得'df’指令的執行表現的像在Minix上.

check=none 在挂載的時候不做多餘的對于位圖的檢查.

nocheck

debug debug資訊将會被發送到syslog.

errors=remount-ro(*) 當有錯誤發生的時候,就會重新挂載為隻讀的.

errors=continue 當有錯誤發生的時候繼續運作,不做任何操作.

errors=panic 當有錯誤發生的時候直接報核心Panic.

grpid 給予所有的檔案統一的組ID.

bsdgroups

nogrpid (*) 新的檔案擁有統一的組ID.

sysvgroups

resgid=n 組ID為n的檔案可以使用保留的塊.

resuid=n 使用者ID為n的檔案可以使用保留的塊.

sb=n 使用第n塊作為超級塊.

quota

noquota

grpquota

usrquota

bh (*) ext4把緩沖區首部和資料頁連接配接起來以緩存塊的資訊。

nobh bh選項表示強制使用緩沖區首部,nobh選項表示盡量避免緩沖區首部(僅僅在data=writeback模式下支援).

資料模式

---------

有三種資料模式:

* writeback

在data=writeback模式下,ext4并不進行任何日志操作,這個模式提供了一個簡單的日志就像 XFS, JFS, ReiserFS等檔案系統的預設模式一樣,一個檔案系統的崩潰然後再修複可能會導緻正确的資料出現在檔案崩潰之前寫入的地方,但是這個模式下ext4擁有最好的性能。

* ordered

在data=ordered模式下,ext4僅僅提供中繼資料的日志,但是把一個組的中繼資料和一些資料塊放在一個單元裡叫做一個事務,當是時候把中繼資料寫入到磁盤上的時候,與之聯系的資料塊會首先寫入。一般情況下,這種模式的性能會略遜色于writeback但是比journal模式要快的多。

* journal

data=journal模式提供了完全的資料塊和中繼資料快的日志,所有的新的資料都會被首先寫入到日志裡,然後在寫入掉電非易失存儲媒體上。在檔案系統崩潰的時候,日志就可以進行重放,把資料和中繼資料帶回到一個一緻性的狀态,這個模式是最慢的,因為所有的資料都需要日志來記錄.

引用

==========

核心源代碼: <file:fs/ext4/>

<file:fs/jbd2/>

programs: http://e2fsprogs.sourceforge.net/

http://ext2resize.sourceforge.net

有用的連結: http://fedoraproject.org/wiki/ext3-devel

http://www.bullopensource.org/ext4/