Ext4 - Arch Linux 中文维基

跳至內容

# Ext4

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 Ext4，最近一次同步於 2024-06-10，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- 文件系統
- Ext3

來自 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%` 由 `df` 和 `df -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`中定義的類型，表示文件系統預期的用法。 在這些類型中較大的 `largefile` 和 `largefile4` 將提供更相關聯的比例，即每 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

$(()) 語法用於數學擴展。這個語法在 bash包 和 zsh包中有效，但在 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。

警告：

- 如果你要轉換系統的根文件系統，請確保在重啟時可以使用'fallback' initramfs。或者，根據Mkinitcpio#模塊（MODULES） 添加ext4，並在啟動前重新創建initramfs 。
- 如果你決定轉換一個 `/boot` 分區, 請確保 引導加載程序 支持從ext4啟動.

在下面的步驟中，`/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（英語：fscrypt） 文章。加密是在目錄級別應用的，在不同的目錄中可以使用不同的加密密鑰。這與 dm-crypt（塊級別的加密）和 eCryptfs（英語：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 中運行應用程式和遊戲的性能。此功能不影響整個文件系統，只影響了啟用不區分大小寫屬性的目錄。

首先，在文件系統中啟用該功能：

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

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

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

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

## 參見

- Ext4 官方 wiki
- Ext4 Disk Layout described in its wiki
- Ext4 加密 LWN 文章
- Kernel commits for ext4 encryption [6] [7]
- e2fsprogs Changelog
- Ext4 元數據校驗和
- Ext4 fast commits

分類：​

- 文件系統

Ext4
新增話題