出自 Arch Linux 中文维基

XFS 是由矽谷圖形公司 (Silicon Graphics, Inc.) 開發的高性能日誌式文件系統。XFS 因其基於分配組 (allocation group) 的設計而特別擅長並行 IO。當該文件系統跨越多個存儲設備時,這種設計使得 IO 線程數、文件系統帶寬、文件和文件系統大小都具有極大的可伸縮性。

安裝

為了使用 XFS 用戶空間實用程序,請 安裝 xfsprogs 軟體包。 它包含了管理 XFS 文件系統所需的必要工具。

數據損壞

如果遇到了任何原因的引起的數據損壞,就需要手動修復文件系統。

修復 XFS 文件系統

先卸載 XFS 文件系統:

# umount /dev/sda3

卸載後,運行 xfs_repair(8) 工具來修復:

# xfs_repair -v /dev/sda3

在線元數據檢查 (scrub)

警告: 該程序目前是實驗性的,這意味著它的行為和接口可能隨時發生變化。參見 xfs_scrub(8)

xfs_scrub 請求內核檢查 XFS 文件系統中的所有元數據對象。內核會掃描元數據記錄以查找明顯錯誤的值,然後與其他元數據進行交叉引用。其目的是通過檢查單個元數據記錄與文件系統中其他元數據的一致性,建立對整個文件系統一致性的合理置信度。如果存在完整的冗餘數據結構,則可以根據其他元數據重建損壞的元數據。

啟用/運行 xfs_scrub_all.timer 以定期在線檢查所有 XFS 文件系統元數據。

注意: 有時可能需要 編輯 xfs_scrub_all.timer,它會 (默認) 在每周日上午 3:10 運行,並且如果錯過了上一次執行時間 (也就是說因為系統關機/斷電) ,計時器將會 立即激發

數據完整性

xfsprogs 3.2.0 引入了一種新型磁碟格式 (v5),其包含了稱為 自描述元數據 (Self-Describing Metadata) 的元數據校驗方案。 基於 CRC32,它提供的額外保護措施可以在意外斷電時防止元數據損壞。當使用 xfsprogs 3.2.3 或更高版本時,這種校驗默認是打開的。如果需要在舊版內核中掛載 XFS 為可讀寫,可以在調用 mkfs.xfs(8) 時加上 -m crc=0 來關閉校驗特性。

# mkfs.xfs -m crc=0 /dev/target_partition

自 Linux Kernel 3.15 起,XFS v5 磁碟格式被視作穩定特性,可用於生產環境。

注意:BtrfsZFS 不同,XFS 中的 CRC32 校驗僅用於元數據而非實際數據。

使用管理

調整文件系統大小

注意: 目前來講,縮減 XFS 大小還 沒可能實現[失效連結 2021-11-19 ⓘ]

當更改分區後,XFS 可以被在線調整大小。只需將掛載點作為第一參數執行 xfs_growfs, 即可將 XFS 文件系統增大到可能的最大大小:

# xfs_growfs /path/to/mnt/point

性能

要獲得最佳速度,只要這樣創建 XFS 文件系統:

# mkfs.xfs /dev/target_partition

對,就是這麼簡單 - 因為所有 新特性默認都是開啟的[失效連結 2021-11-19 ⓘ]

另請參閱 xfs(5) 以詳細了解所有可用的掛載選項。

提示:當在 RAID 設備上使用 XFS 文件系統時,可通過使用 largeioswalloc 值,以及比默認情況更大的 logbsizeallocsize 值等來提高性能。下列文章能提供更多有關詳情:

帶區大小和寬度

如果這個文件系統位於條帶化的 RAID 上,可以在 mkfs.xfs(8) 命令中指定帶區大小來獲得顯著的性能提升。

XFS 有時可以檢測到軟 RAID 下的幾何形 (geometry), 但萬一您要重塑其或您正在使用硬 RAID, 請參閱 如何計算出正確的 sunit 和 swidth 值以獲得最佳性能[失效連結 2021-11-19 ⓘ]

訪問時間記錄

某些文件系統可以通過在 /etc/fstab 文件中添加 noatime 掛載選項來增強性能。對於 XFS 文件系統來說,默認的訪問時間記錄行為是 relatime,與 noatime 相比這幾乎沒有額外開銷,且仍然可以記錄正確的訪問時間。所有 Linux 文件系統現在都以這個選項為默認值(從大約 2.6.30 版本開始),但是 XFS 從 2006 年開始就採用了類似 relatime 的特性,因此不需要出於性能考慮而在 XFS 上使用 noatime。

另外,noatime 包含了 nodiratime,所以指定了 noatime 時就不需要指定 nodiratime

磁碟碎片整理

儘管 XFS 本質上基於區段 (Extent) 並且延遲分配策略很大程度上增強了它對磁碟碎片的抗性,XFS 仍然提供了磁碟碎片整理程序(xfs_fsr,XFS filesystem reorganizer 的縮寫),它可以在已掛載且活動的 XFS 文件系統上整理碎片。定期查看 XFS 碎片也很有用。

xfs_fsr(8) 改進了已掛載文件系統的文件組織。該重組織算法一次操作一份文件,對文件進行壓縮或改進文件區段布局(改成連續數據塊)。

檢查碎片程度

查看當前文件系統中有多少磁碟碎片:

# xfs_db -c frag -r /dev/sda3

進行碎片整理

要啟動碎片整理,使用 xfs_fsr(8) 命令:

# xfs_fsr /dev/sda3

B+樹(用於索引未用 inode)

自 Linux 3.16 起,XFS 增加了 B+樹用於索引未被使用的 inode。它等同於索引已使用 inode 的 B+樹,不同之處在於索引未用 inode 的 B+樹至少包含一個未用 inode。這一設計的目的是改進分配 inode 時尋找未用 inode 簇的性能。它可以提高長期使用後的文件系統性能,比如你在數月或數年之間已經向文件系統寫入或刪除了數百萬的文件。使用這個功能不會影響整個文件系統的可靠性程度或恢復能力。

這個功能依賴於新的 v5 磁碟格式,自 Linux Kernel 3.15 起它被視作可用於生產環境的穩定特性。它沒有改變磁碟上原本的數據結構,但會添加一個新的結構來使它與 B+樹(用於分配 inode)保持兼容;因此,舊版本的內核只能將帶有 B+樹功能的文件系統掛載為只讀模式。

當使用 xfsprogs 3.2.3 或更高版本時這個功能默認是開啟的。如果你需要一個舊版本內核可寫入的文件系統,這個功能可以在格式化 XFS 分區時用 finobt=0 開關來關閉。你還需要把它和 crc=0 一起用。

# mkfs.xfs -m crc=0,finobt=0 /dev/target_partition

也可以簡寫(crc 包含了 finobt

# mkfs.xfs -m crc=0 /dev/target_partition

外部 XFS 日誌

使用外部日誌 (元數據日誌) 可能對提高性能很有幫助 (例如在 SSD 上)[1][失效連結 2022-09-23 ⓘ]。請參閱 mkfs.xfs(8) 獲取有關 logdev 參數的更多詳情.

警告: 當心:使用快閃記憶體的情況下可能會減損硬碟壽命。請參閱 Improving performance#Reduce disk reads/writes 獲取有關 SSD 壽命減損的詳情。

要在創建 XFS 文件系統時保留指定大小的外部日誌,請為 mkfs.xfs 命令指定 -l logdev=device,size=size 選項。如果省略 size 參數, 則會使用基於文件系統大小的日誌大小。要掛載 XFS 文件系統讓其使用外部日誌,請為 mount 命令指定 -o logdev=device 選項。

同步間隔

XFS 有其專有的 sysctl 變量來設置 "回寫間隔"。在 Arch 上這個默認值為 3000,可以設置到更大的值,只是切記更大的值在有些情況下會導致數據丟失:

/etc/sysctl.d/20-xfs-sync-interval.conf
fs.xfs.xfssyncd_centisecs = 10000

故障排除

根文件系統配額

XFS 配額掛載選項(uquotagquotaprjquota 等)會在重新掛載文件系統時失效。要對根文件系統啟用配額功能,這個掛載選項需要作為 內核參數 rootflags= 傳遞給初始化內存檔 (initramfs)。在隨後的啟動過程中,這個選項不需要在 /etc/fstab 中掛載根 (/) 文件系統的選項裡再次列出。

注意: XFS 配額相較於標準 Linux 磁碟配額 有一些區別,這篇文章 https://inai.de/linux/adm_quota 或許值得一讀。

如果用戶 "nobody" 無法訪問掛載點,xfs_scrub_all 會執行失敗

當執行 xfs_scrub_all 時,它將為每個已掛載的 XFS 文件系統啟動 xfs_scrub@.service 服務。這項服務以用戶 nobody 身份運行,所以如果 nobody 無法導向至目錄,命令執行將會失敗,並隨附以下錯誤:

xfs_scrub@mountpoint.service: Changing to the requested working directory failed: Permission denied
xfs_scrub@mountpoint.service: Failed at step CHDIR spawning /usr/bin/xfs_scrub: Permission denied
xfs_scrub@mountpoint.service: Main process exited, code=exited, status=200/CHDIR

為了能讓對應服務運行,請更改掛載點的 權限 以使用戶 nobody 擁有執行權限。

參考資料