出自 Arch Linux 中文维基

來自 Ext4 - Linux Kernel Newbies

Ext4 是最常用的 Linux 文件系統 Ext3 的進化。在許多方面,Ext4對於 Ext3 有著比 Ext3 對於 Ext2 更多更深的改變。Ext3 主要是向 Ext2 添加了日誌系統,而 Ext4 修改了重要的文件系統的數據結構,比如用來存儲文件數據的那部分。當然結果就是文件系統有更好的設計,更好的性能,穩定性還有更多的功能。

創建 ext4 文件系統

安裝 e2fsprogs

要格式化分區,使用:

# mkfs.ext4 /dev/分区
提示:
  • 更多選項參見 mke2fs(8);編輯 /etc/mke2fs.conf 可以查看/修改默認配置。
  • 如果支持,可以啟用元數據校驗和

Bytes-per-inode 比例

來自 mke2fs(8):

mke2fs 在硬碟上為每個bytes-per-inode大小的空間創建一個 inode. Bytes-per-inode 的比例越大, 創建的 inode 就越少.

創建新文件、目錄、符號連結等都需要至少一個空閒的 inode。如果 inode 數過低,即使文件系統中仍有空間也無法創建文件。

由於無法在創建文件系統後修改 bytes-per-inode 比例以及 inode 數量, mkfs.ext4 默認使用更低的 inode 比例,即每 16384 bytes (16 KiB) 一個 inode 以避免這個問題.

然而,對於一個具有對於大小為數百或數千GB、平均文件大小為兆字節的分區,這通常會導致 inode 過大,因為創建的文件數永遠不會達到 inode 數。

這樣的結果是浪費硬碟空間, 因為這些未使用的 inode 每個都會占用文件系統 256 bytes 的空間 (這是在 /etc/mke2fs.conf 中設置的,但是不應該改變). 256 * 數百萬 = 許多GB在未使用的節點中被浪費了.

這種情況可以通過比較以下幾點進行評價, Use% 以及 IUse%dfdf -i 提供:

$ df -h /home
Filesystem              Size    Used   Avail  Use%   Mounted on
/dev/mapper/lvm-home    115G    56G    59G    49%    /home
$ df -hi /home
Filesystem              Inodes  IUsed  IFree  IUse%  Mounted on
/dev/mapper/lvm-home    1.8M    1.1K   1.8M   1%     /home

要指定一個不同的 Bytes-per-inode 比率,你可以使用 -T usage-type 選項,將會使用/etc/mke2fs.conf中定義的類型,表示文件系統預期的用法。 在這些類型中較大的 largefilelargefile4 將提供更相關聯的比例,即每 1 MiB 或 4 MiB 一個 inode。

# mkfs.ext4 -T largefile /dev/device

Bytes-per-inode 比例可以直接通過 -i 選項設定: e.g. 使用 -i 2097152 對應 2 MiB 的比例以及 -i 6291456 對應 6 MiB 的比例.

提示:相反地,如果你需要建立一個分區用於存放數百萬計的小文件(例如郵件或新聞組項目)你可以使用更小的 usage-type 值,例如 news (每 4096 bytes 一個 節點) 或者 small (相同但更小的 inode 和 block 大小).
警告: 如果你大量使用符號連結,請確保保持足夠高的 inode 數和較低的 bytes-per-inode,因為符號連結雖然不會占用更多的空間,但每一個新的符號連結都會消耗一個新的 inode,因此文件系統中的 inode 可能會被很快用完。

保留塊

默認情況下,5% 的文件系統塊會被預留給超級用戶,以避免碎片化並「允許由 root 擁有的守護程序在非特權進程被阻止向文件系統寫入後繼續正常運行」(來自 mke2fs(8))。

對於現在的大容量磁碟,如果分區被用於長期存儲或對系統運作並非至關重要(例如 /home),這將比必要的大小更大。查看 這封郵件 ,可以了解ext4 的開發者 Ted Ts'o 對保留塊的看法 ,以及 這個 superuser 的回答 ,為這個話題提供了一般的背景信息。

如果分區滿足以下條件之一,則通常可以放心縮小保留塊的比例:

  • 非常大(例如 > 50G)
  • 用於長期存儲,即文件不會被非常頻繁地創建和刪除

在 ext4 相關的實用程序中可以使用 -m 選項指定保留塊的比例。

要在創建文件系統時不創建保留塊,使用:

# mkfs.ext4 -m 0 /dev/设备

要在之後將比例改為 1%,使用:

# tune2fs -m 1 /dev/设备

要將保留塊空間設置為以千兆字節為單位的絕對大小,使用 -r:

# tune2fs -r $((ngigs * 1024**3 / blocksize)) /dev/设备

blocksize 是文件系統中的塊大小,以字節為單位。它幾乎總是4096,但你可以檢查以確保無誤:

# tune2fs -l /dev/設備 | grep 'Block size:'
Block size:               4096

$(()) 語法用於數學擴展。這個語法在 bashzsh中有效,但在 fish中不適用。 對於 fish,應使用以下語法:

# tune2fs -r (math 'ngigs * 1024^3 / blocksize') /dev/设备

這些命令可以應用於已掛載的文件系統,改變將立即生效。可以使用 findmnt(8) 查找設備名:

# tune2fs -m 1 "$(findmnt -no SOURCE 挂载点路径)"

查詢當前保留塊的數量:

# tune2fs -l /dev/mapper/proxima-root | grep 'Reserved block count:'
Reserved block count:     2975334

這是塊的數量,所以需要乘上文件系統的塊大小才能得到字節數:2975334 * 4096 / 1024**3 = 11.34 GiB

從 ext2/ext3 遷移到 ext4

不轉換直接把 ext2/ext3 分區掛載成 ext4 分區格式

基本原理

轉換到ext4和繼續使用 ext2/ext3 格式的折中的辦法就是把分區當作 ext4 分區來掛載。

優點:

  • 兼容性(分區的文件系統可以繼續掛載為 ext3) – 這允許用戶繼續在不支持 ext4 文件格式的作業系統中讀取分區。(例如:帶 ext2/ext3 驅動的 Windows 系統)
  • 提高性能(不過沒有完全轉換成 ext4 分區後好)。[1] [2]

缺點:

  • 僅能使用少部分 ext4 特性。(只有那些不改變分區格式的功能能被使用,例如 multiblock allocation 和 delayed allocation)
注意: 除了由 ext4 格式帶來的相對新的不一樣的特性(可以看作一種潛在風險)之外,這種技術沒有大的缺點

步驟

  1. 修改 /etc/fstab,把你想要掛載成 ext4 的分區的「type」欄的內容從 ext2/ext3 改為 ext4。
  2. 重新掛載分區。

將 ext2/ext3 分區轉換為 ext4 格式

基本原理

為了能夠使用 ext4 的全部特性,必須完成一個不可逆的轉換過程。

優點:

  • 更好的性能以及新功能。[3] [4]

缺點:

  • 對於主要包含靜態文件的分區,例如 /boot 分區,新功能可能並沒有什麼好處。此外,添加日誌功能(將ext2分區轉換為ext3/ext4分區會自動進行)總是會帶來額外的性能開銷。
  • 不可逆(ext4 分區不能「降級」到 ext2/ext3。不過,在啟用 extent和其他特有功能前,是可以向下兼容的)

步驟

這些指令改編自內核文檔BBS thread

警告:

在下面的步驟中,/dev/sdxX 代表要轉換的分區的路徑,例如 /dev/sda1

  1. 在將任何ext3分區轉換為ext4之前,備份所有數據。clonezilla是一個有用的工具,尤其對於根分區來說。
  2. 編輯 /etc/fstab ,將要轉換為ext4分區的'type'欄的內容從ext3改為ext4。
  3. 啟用實時介質(如果需要)。使用 e2fsprogs 進行轉換時分區必須未掛載。如果要轉換根分區,最簡單的方法就是從其他實時介質啟動。
  4. 確保分區未被掛載
  5. 如果你想轉換一個ext2分區,第一步就是以root身份運行 tune2fs -j /dev/sdxX 來添加日誌 ,使其成為ext3分區。
  6. 以root身份運行tune2fs -O extent,uninit_bg,dir_index /dev/sdxX 。這個命令將ext3分區轉換為ext4(不可逆)。
  7. 以 root 身份運行 fsck -f /dev/sdxX
    • 這一步是必須的,否則文件系統將無法讀取。這次運行 fsck 是為了將文件系統恢復到一致狀態。它將發現組描述中的校驗和錯誤。-f 選項要求 fsck 強制檢查,即使文件系統看起來是乾淨的。可以在上面使用 -p 選項來「自動修復」(否則,每個錯誤都要求用戶輸入)。
  8. 推薦操作:掛載分區並以root身份運行 e4defrag -c -v /dev/sdxX
    • 即使現在文件系統已經轉換為ext4了,但以前寫入的文件還沒有利用ext4的extent的優勢,該操作將提高大文件性能並減少碎片和文件系統檢查時間。為了充分利用ext4的優勢,所有文件都需要在磁碟上重寫。使用 e4defrag來解決這個問題。
  9. 重新啟動

提升性能

E4rat

E4rat 是為 ext4 文件系統設計的預加載應用程式。它監視啟動時打開的文件,並通過優化它們在分區上所處的位置來提升訪問效率,並在啟動過程之初就預加載它們。於機械硬碟不同的是 E4rat 不會提升固態硬碟的性能,因為後者的訪問時間與前者相比可以忽略不計。

禁用訪問時間更新

ext4 文件系統會記錄於文件上次被訪問的時間相關的信息,而記錄這些信息會導致開銷。使用 noatime 選項可防止更新訪問時間戳。

/etc/fstab
/dev/sda5    /    ext4    defaults,noatime    0    1

這樣做會破壞訪問依賴時間的應用程式,請查看 fstab#atime 參數 獲取可能的解決方案。

增加提交時間間隔

通過為 提交 選項提供更長的延遲時間,可以增加數據和元數據的同步間隔。

默認的5秒意味著如果斷電,最多只會丟失5秒的工作。它每5秒強制對所有數據/日誌進行一次完整的同步到物理介質。由於有了日誌功能,文件系統不會受損。以下的 fstab 示例展示了commit選項的使用:

/etc/fstab
/dev/sda5    /    ext4    defaults,noatime,commit=60    0    1

關閉屏障

警告: 如果磁碟無法保證在電源掉電時緩存正確寫入,禁用屏障可能會導致嚴重的文件系統損壞和數據丟失。

Ext4 默認啟用寫屏障。它確保文件系統元數據磁碟上被正確地寫入和排序,即使在寫緩存掉電時也是如此。這會帶來性能成本,特別是對於大量使用 fsync 或創建和刪除許多小文件的應用程式。對於寫緩存由電池供電的磁碟,禁用障礙可以會安全地提高性能。

要關閉屏障,將 barrier=0 選項添加到文件系統中。例如:

/etc/fstab
/dev/sda5    /    ext4    noatime,barrier=0    0    1

禁用日誌

警告: 使用沒有日誌的文件系統,在突發卸載的情況下,例如斷電或者內核鎖定,將導致數據丟失。

ext4 中禁用日誌,可以對已卸載的硬碟使用下列指令完成操作:

# tune2fs -O "^has_journal" /dev/sdXN

技巧與竅門

使用基於文件的加密

自從Linux 4.1以來,ext4原生支持文件加密,請參閱 fscrypt 文章。加密是在目錄級別應用的,在不同的目錄中可以使用不同的加密密鑰。這與 dm-crypt(塊級別的加密)和 eCryptfs(堆疊加密文件系統)都不同

在現有的文件系統中啟用元數據校驗和

當一個文件系統是使用 e2fsprogs 1.43 (2016) 或更高的版本創建時,默認情況下會啟用元數據校驗和。可以轉換現有文件系統以啟用元數據校驗和支持。

如果CPU支持 SSE 4.2,請確保加載 crc32c_intel 內核模塊 以啟用硬體加速的 CRC32C 算法[5]。如果不支持,則改為加載 crc32c_generic 模塊。。

要了解有關元數據校驗和的更多信息,請參閱 ext4 wiki

提示:使用dumpe2fs檢查文件系統上啟用的功能:
# dumpe2fs -h /dev/path/to/disk
注意: 必須卸載文件系統。

首先需要使用 e2fsck來檢查和優化分區:

# e2fsck -Df /dev/path/to/disk  

將文件系統轉換為 64 位:

# resize2fs -b /dev/path/to/disk 

最後啟用校驗和支持:

# tune2fs -O metadata_csum /dev/path/to/disk

驗證:

# dumpe2fs -h /dev/path/to/disk | grep features:
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum

在現有的文件系統中啟用 fast_commit

從 5.10 內核開始,可以啟用fast_commit 選項來提高ext4的性能:

# tune2fs -O fast_commit /dev/drivepartition

闡述當前配置或更改:

# tune2fs -l /dev/drivepartition | grep features

啟用不區分大小寫模式

警告: GRUB目前不支持Ext4的 casefold功能;請參見GRUB bug #56897。為GRUB需要讀取的文件系統啟用該功能將會導致系統無法啟動,並出現未知文件系統 錯誤,即使沒有目錄實際使用該功能。

ext4 可以在不區分大小寫的模式下使用,這可以提高在 Wine 中k運行應用程式和遊戲的性能。此功能不影響整個文件系統,只影響了啟用不區分大小寫屬性的目錄。

首先,在文件系統中啟用該功能:

# tune2fs -O casefold /dev/path/to/disk

現在,你可以在任何目錄中啟用不區分大小寫:

$ chattr +F /mnt/partition/case-insensitive-directory

請注意,目錄必須為空,且從其他地方移動子目錄不會繼承他們的屬性,因此,請相應地提前規劃。

參見