SGI XFS 檔案系統

XFS 是一種高效能日誌檔案系統,起源於 SGI IRIX 平臺。它是完全多執行緒的,可以支援大型檔案和大型檔案系統、擴充套件屬性、可變塊大小,是基於範圍的,並且廣泛使用 B 樹(目錄、範圍、可用空間)來幫助提高效能和可伸縮性。

有關更多詳細資訊,請參閱 https://xfs.wiki.kernel.org/ 上的文件。此實現與 IRIX 版本的 XFS 在磁碟上相容。

掛載選項

掛載 XFS 檔案系統時,接受以下選項。

allocsize=size

在執行延遲分配寫入時,設定緩衝 I/O 檔案末尾預分配大小(預設大小為 64KiB)。此選項的有效值是從頁面大小(通常為 4KiB)到 1GiB(包括 1GiB),以 2 的冪遞增。

預設行為是動態檔案末尾預分配大小,它使用一組啟發式方法來最佳化預分配大小,基於檔案中的當前分配模式和對檔案的訪問模式。指定固定 allocsize 值會關閉動態行為。

attr2 或 noattr2

這些選項啟用/停用對內聯擴充套件屬性在磁碟上的儲存方式進行“機會性”改進。首次使用新格式時(當選擇 attr2 時,無論是設定還是刪除擴充套件屬性),磁碟上的超級塊特徵位欄位將更新,以反映正在使用的這種格式。

預設行為由磁碟上的特徵位確定,該特徵位指示 attr2 行為處於活動狀態。如果設定了任一掛載選項,則它將成為檔案系統使用的新預設值。

啟用 CRC 的檔案系統始終使用 attr2 格式,因此如果設定了 noattr2 掛載選項,則會拒絕該選項。

discard 或 nodiscard (預設)

啟用/停用發出命令,讓塊裝置回收檔案系統釋放的空間。這對於 SSD 裝置、精簡配置的 LUN 和虛擬機器映像很有用,但可能會對效能產生影響。

注意:目前建議您使用 fstrim 應用程式來 discard 未使用的塊,而不是 discard 掛載選項,因為此選項的效能影響非常嚴重。

grpid/bsdgroups 或 nogrpid/sysvgroups (預設)

這些選項定義了新建立的檔案獲取的組 ID。當設定了 grpid 時,它會採用建立檔案所在的目錄的組 ID;否則,它會採用當前程序的 fsgid,除非該目錄設定了 setgid 位,在這種情況下,它會採用父目錄的 gid,並且如果它本身是一個目錄,還會設定 setgid 位。

filestreams

使資料分配器在整個檔案系統中使用檔案流分配模式,而不僅僅是在配置為使用它的目錄上。

ikeep 或 noikeep (預設)

當指定 ikeep 時,XFS 不會刪除空的 inode 叢集,而是將其保留在磁碟上。當指定 noikeep 時,空的 inode 叢集會返回到可用空間池。

inode32 或 inode64 (預設)

當指定 inode32 時,它表示 XFS 將 inode 建立限制在不會導致 inode 編號具有超過 32 位有效性的位置。

當指定 inode64 時,它表示 XFS 允許在檔案系統中的任何位置建立 inode,包括那些會導致 inode 編號佔用超過 32 位有效性的位置。

inode32 提供用於與舊系統和應用程式向後相容,因為 64 位 inode 編號可能會導致某些無法處理大型 inode 編號的應用程式出現問題。如果正在使用的應用程式無法處理大於 32 位的 inode 編號,則應指定 inode32 選項。

largeio 或 nolargeio (預設)

如果指定了 nolargeio,則 stat(2)st_blksize 中報告的最佳 I/O 將盡可能小,以允許使用者應用程式避免低效的讀取/修改/寫入 I/O。這通常是機器的頁面大小,因為這是頁面快取的粒度。

如果指定了 largeio,則使用指定的 swidth 建立的檔案系統將在 st_blksize 中返回 swidth 值(以位元組為單位)。如果檔案系統未指定 swidth,但指定了 allocsize,則將返回 allocsize(以位元組為單位)。否則,行為與指定 nolargeio 時相同。

logbufs=value

設定記憶體中日誌緩衝區數量。有效數字範圍為 2-8(含)。

預設值為 8 個緩衝區。

如果在小型系統上 8 個日誌緩衝區的記憶體成本太高,則可以在元資料密集型工作負載上以一定的效能損失為代價來減少它。下面的 logbsize 選項控制每個緩衝區的大小,因此也與這種情況相關。

lifetime (預設) 或 nolifetime

啟用基於使用者提供的寫入生存期提示的資料放置。當統計上有利於降低垃圾回收成本時,這將開啟類似生存期資料的協同分配。

這些選項僅適用於分割槽 rt 檔案系統。

logbsize=value

設定每個記憶體中日誌緩衝區的大小。大小可以以位元組為單位指定,也可以以千位元組為單位指定,帶有“k”字尾。版本 1 和版本 2 日誌的有效大小為 16384 (16k) 和 32768 (32k)。版本 2 日誌的有效大小還包括 65536 (64k)、131072 (128k) 和 262144 (256k)。logbsize 必須是 mkfs(8) 時配置的日誌條帶單元的整數倍。

版本 1 日誌的預設值為 32768,而版本 2 日誌的預設值為 MAX(32768, log_sunit)。

logdev=device 和 rtdev=device

使用外部日誌(元資料日誌)和/或即時裝置。XFS 檔案系統最多有三個部分:資料部分、日誌部分和即時部分。即時部分是可選的,日誌部分可以與資料部分分開,也可以包含在其中。

max_atomic_write=value

設定原子寫入的最大大小。大小可以以位元組為單位指定,以千位元組為單位指定,帶有“k”字尾,以兆位元組為單位指定,帶有“m”字尾,或者以千兆位元組為單位指定,帶有“g”字尾。大小不能大於最大寫入大小,不能大於任何分配組的大小,也不能大於日誌可以原子完成的重對映操作的大小。

預設值是將最大 I/O 完成大小設定為允許每個 CPU 一次處理一個。

max_open_zones=value

指定要為分割槽 rt 裝置上的寫入保持開啟的最大區域數。許多開啟的區域有助於檔案資料分離,但可能會影響 HDD 的效能。

如果未指定 max_open_zones,則該值由分割槽 rt 裝置的功能和大小確定。

noalign

資料分配將不對齊到條帶單元邊界。這僅與由 mkfs(8) 使用非零資料對齊引數(sunitswidth)建立的檔案系統相關。

norecovery

檔案系統將在不執行日誌恢復的情況下掛載。如果檔案系統未乾淨地解除安裝,則在 norecovery 模式下掛載時,它很可能不一致。由於這個原因,可能無法訪問某些檔案或目錄。以 norecovery 掛載的檔案系統必須以只讀方式掛載,否則掛載將失敗。

nouuid

不要使用檔案系統的 uuid 檢查雙重掛載的檔案系統。這對於掛載 LVM 快照卷很有用,並且通常與 norecovery 結合使用,用於掛載只讀快照。

noquota

強制關閉檔案系統中的所有配額記帳和強制執行。

uquota/usrquota/uqnoenforce/quota

使用者磁碟配額記帳已啟用,並且(可選)強制執行限制。有關更多詳細資訊,請參閱 xfs_quota(8)

gquota/grpquota/gqnoenforce

組磁碟配額記帳已啟用,並且(可選)強制執行限制。有關更多詳細資訊,請參閱 xfs_quota(8)

pquota/prjquota/pqnoenforce

專案磁碟配額記帳已啟用,並且(可選)強制執行限制。有關更多詳細資訊,請參閱 xfs_quota(8)

sunit=value 和 swidth=value

用於指定 RAID 裝置或條帶卷的條帶單元和寬度。“value”必須以 512 位元組的塊單元指定。這些選項僅與使用非零資料對齊引數建立的檔案系統相關。

指定的 sunitswidth 引數必須與現有的檔案系統對齊特性相容。一般來說,這意味著對 sunit 的唯一有效更改是以 2 的冪倍數增加它。有效的 swidth 值是有效 sunit 值的任何整數倍。

通常,只有在底層 RAID 裝置的幾何形狀被修改後,例如向 RAID5 lun 新增新磁碟並重塑它時,這些掛載選項才是必要的。

swalloc

當擴充套件當前檔案末尾並且檔案大小大於條頻寬度大小時,資料分配將四捨五入到條頻寬度邊界。

wsync

指定後,所有檔案系統名稱空間操作都將同步執行。這確保了當名稱空間操作(建立、取消連結等)完成時,對名稱空間的更改已在穩定儲存上。這在 HA 設定中很有用,其中故障轉移不得導致客戶端在故障轉移期間或之後看到不一致的名稱空間表示。

棄用 V4 格式

V4 檔案系統格式缺少 V5 格式支援的某些功能,例如元資料校驗和、加強的元資料驗證以及儲存超過 2038 年的時間戳的能力。因此,V4 格式已被棄用。所有使用者都應該透過備份他們的檔案、重新格式化和從備份恢復來升級。

管理員和使用者可以透過針對檔案系統掛載點執行 xfs_info 並檢查是否包含包含“crc=”的字串來檢測 V4 檔案系統。如果沒有找到這樣的字串,請將 xfsprogs 升級到最新版本並重試。

棄用將分兩部分進行。現在可以透過 Kconfig 選項在核心構建時停用對掛載 V4 檔案系統的支援。該選項將預設為 yes,直到 2025 年 9 月,屆時它將更改為預設為 no。在 2030 年 9 月,將從程式碼庫中完全刪除支援。

注意:分銷商可能會選擇早於上面列出的日期撤回 V4 格式支援。

已棄用的掛載選項

名稱

刪除計劃

使用 V4 檔案系統掛載

2030 年 9 月

掛載 ascii-ci 檔案系統

2030 年 9 月

ikeep/noikeep

2025 年 9 月

attr2/noattr2

2025 年 9 月

已刪除的掛載選項

名稱

已刪除

delaylog/nodelaylog

v4.0

ihashsize

v4.0

irixsgid

v4.0

osyncisdsync/osyncisosync

v4.0

barrier

v4.19

nobarrier

v4.19

sysctls

以下 sysctl 可用於 XFS 檔案系統

fs.xfs.stats_clear(最小值:0 預設值:0 最大值:1)

將其設定為“1”會清除 /proc/fs/xfs/stat 中累積的 XFS 統計資訊。然後立即重置為“0”。

fs.xfs.xfssyncd_centisecs(最小值:100 預設值:3000 最大值:720000)

檔案系統將元資料重新整理到磁碟並執行內部快取清理例程的間隔。

fs.xfs.filestream_centisecs(最小值:1 預設值:3000 最大值:360000)

檔案系統老化檔案流快取引用並將超時的 AG 返回到可用流池的間隔。

fs.xfs.speculative_prealloc_lifetime

(單位:秒 最小值:1 預設值:300 最大值:86400)在後臺掃描具有未使用投機預分配的 inode 的執行間隔。掃描會從乾淨的 inode 中刪除未使用的預分配,並將未使用的空間釋放回可用池。

fs.xfs.speculative_cow_prealloc_lifetime

這是 speculative_prealloc_lifetime 的別名。

fs.xfs.error_level(最小值:0 預設值:3 最大值:11)

當發生內部錯誤時,用於錯誤報告的捲旋鈕。例如,這將為檔案系統關閉生成詳細的訊息和回溯。當前閾值是

XFS_ERRLEVEL_OFF:0 XFS_ERRLEVEL_LOW:1 XFS_ERRLEVEL_HIGH:5

fs.xfs.panic_mask(最小值:0 預設值:0 最大值:511)

導致某些錯誤情況呼叫 BUG()。該值是一個位掩碼;將表示應導致崩潰的錯誤的標籤 OR 在一起

XFS_NO_PTAG 0 XFS_PTAG_IFLUSH 0x00000001 XFS_PTAG_LOGRES 0x00000002 XFS_PTAG_AILDELETE 0x00000004 XFS_PTAG_ERROR_REPORT 0x00000008 XFS_PTAG_SHUTDOWN_CORRUPT 0x00000010 XFS_PTAG_SHUTDOWN_IOERROR 0x00000020 XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040 XFS_PTAG_FSBLOCK_ZERO 0x00000080 XFS_PTAG_VERIFIER_ERROR 0x00000100

此選項僅用於除錯。

fs.xfs.irix_symlink_mode(最小值:0 預設值:0 最大值:1)

控制是否使用模式 0777(預設)建立符號連結,或者其模式是否受 umask(irix 模式)影響。

fs.xfs.irix_sgid_inherit(最小值:0 預設值:0 最大值:1)

控制在 SGID 目錄中建立的檔案。如果新檔案的組 ID 與父目錄的有效組 ID 或補充組 ID 之一不匹配,則如果設定了 irix_sgid_inherit 相容性 sysctl,則會清除 ISGID 位。

fs.xfs.inherit_sync(最小值:0 預設值:1 最大值:1)

將其設定為“1”將導致 xfs_io(8) chattr 命令在目錄上設定的“sync”標誌被該目錄中的檔案繼承。

fs.xfs.inherit_nodump(最小值:0 預設值:1 最大值:1)

將其設定為“1”將導致 xfs_io(8) chattr 命令在目錄上設定的“nodump”標誌被該目錄中的檔案繼承。

fs.xfs.inherit_noatime(最小值:0 預設值:1 最大值:1)

將其設定為“1”將導致 xfs_io(8) chattr 命令在目錄上設定的“noatime”標誌被該目錄中的檔案繼承。

fs.xfs.inherit_nosymlinks(最小值:0 預設值:1 最大值:1)

將其設定為“1”將導致 xfs_io(8) chattr 命令在目錄上設定的“nosymlinks”標誌被該目錄中的檔案繼承。

fs.xfs.inherit_nodefrag(最小值:0 預設值:1 最大值:1)

將其設定為“1”將導致 xfs_io(8) chattr 命令在目錄上設定的“nodefrag”標誌被該目錄中的檔案繼承。

fs.xfs.rotorstep(最小值:1 預設值:1 最大值:256)

在“inode32”分配模式下,此選項確定分配器在移動到下一個分配組之前嘗試在同一分配組中分配多少個檔案。目的是控制分配器在為新檔案分配範圍時在分配組之間移動的速率。

已棄用的 Sysctl

名稱

刪除計劃

fs.xfs.irix_sgid_inherit

2025 年 9 月

fs.xfs.irix_symlink_mode

2025 年 9 月

fs.xfs.speculative_cow_prealloc_lifetime

2025 年 9 月

已刪除的 Sysctl

名稱

已刪除

fs.xfs.xfsbufd_centisec

v4.0

fs.xfs.age_buffer_centisecs

v4.0

錯誤處理

XFS 可以根據在其操作期間發現的錯誤型別採取不同的操作。該實現將以下概念引入到錯誤處理程式

-故障速度

定義當在檔案系統操作期間發現特定錯誤時,XFS 應以多快的速度向上層傳播錯誤。它可以立即傳播,可以在定義的重試次數後傳播,可以在設定的時間段後傳播,或者只是永遠重試。

-錯誤類

指定錯誤配置將應用到的子系統,例如元資料 IO 或記憶體分配。不同的子系統將具有不同的錯誤處理程式,可以為其配置行為。

-錯誤處理程式

定義特定錯誤的行為。

錯誤期間的檔案系統行為可以透過 sysfs 檔案設定。每個錯誤處理程式獨立工作 - 特定類的錯誤處理程式滿足的第一個條件將導致錯誤被傳播,而不是重置和重試。

當錯誤被傳播時,檔案系統採取的操作取決於上下文 - 它可能會在發生不可恢復的錯誤時導致關閉,它可能會報告回用戶空間,或者它甚至可能會被忽略,因為我們無法對錯誤做任何有用的事情,或者我們可以將其報告給任何人(例如,在解除安裝期間)。

配置檔案被組織成以下層次結構,用於每個掛載的檔案系統

/sys/fs/xfs/<dev>/error/<class>/<error>/

其中
<dev>

掛載的檔案系統的短裝置名稱。這與 XFS 核心錯誤訊息中顯示的裝置名稱相同,如“XFS(<dev>): ...”

<class>

錯誤配置所屬的子系統。截至 4.9,定義的類是

  • “metadata”:應用元資料緩衝區寫入 IO

<error>

單個錯誤處理程式配置。

每個檔案系統都有在其頂級目錄中定義的“全域性”錯誤配置選項

/sys/fs/xfs/<dev>/error/

fail_at_unmount(最小值:0 預設值:1 最大值:1)

定義解除安裝時的檔案系統錯誤行為。

如果設定為 1 的值,則 XFS 將覆蓋解除安裝期間的所有其他錯誤配置,並將其替換為“立即失敗”特性。即沒有重試,沒有重試超時。這將始終允許解除安裝在存在永續性錯誤時成功。

如果設定為 0,則配置的重試行為將繼續,直到所有重試和/或超時都已耗盡。這將延遲解除安裝完成,當存在永續性錯誤時,並且它可能會阻止檔案系統在“永遠重試”處理程式配置的情況下完全解除安裝。

注意:不能保證在解除安裝正在進行時可以設定 fail_at_unmount。在“永遠重試”錯誤處理程式配置導致解除安裝掛起之前,sysfs 條目可能會被解除安裝的檔案系統刪除,因此必須在解除安裝開始之前正確配置檔案系統以防止解除安裝掛起。

每個檔案系統都有特定的錯誤類處理程式,用於定義特定錯誤的錯誤傳播行為。還定義了一個“預設”錯誤處理程式,用於定義所有未定義特定處理程式的錯誤的行為。如果為單個錯誤配置了多個重試約束,則第一個過期的重試配置將導致錯誤被傳播。處理程式配置位於目錄中

/sys/fs/xfs/<dev>/error/<class>/<error>/

max_retries(最小值:-1 預設值:Varies 最大值:INTMAX)

定義在檔案系統傳播錯誤之前允許重試特定錯誤的次數。給定錯誤上下文(例如,特定元資料緩衝區)的重試計數會在每次成功完成操作時重置。

將值設定為“-1”將導致 XFS 永遠重試此特定錯誤。

將值設定為“0”將導致 XFS 在報告特定錯誤時立即失敗。

將值設定為“N”(其中 0 < N < Max)將使 XFS 重試操作“N”次,然後再傳播錯誤。

retry_timeout_seconds(最小值:-1 預設值:Varies 最大值:1 天)

定義當發現特定錯誤時,檔案系統允許重試其操作的時間量(以秒為單位)。

將值設定為“-1”將允許 XFS 永遠重試此特定錯誤。

將值設定為“0”將導致 XFS 在報告特定錯誤時立即失敗。

將值設定為“N”(其中 0 < N < Max)將允許 XFS 重試操作最多“N”秒,然後再傳播錯誤。

注意:特定錯誤處理程式的預設行為取決於類和錯誤上下文。 例如,“metadata/ENODEV”的預設值是“0”而不是“-1”,因此此錯誤處理程式預設為“立即失敗”的行為。 這樣做是因為 ENODEV 是一個致命的、不可恢復的錯誤,無論元資料 IO 重試多少次都是如此。

工作佇列併發

XFS 使用核心工作佇列來並行化元資料更新過程。 這使其能夠利用可以同時處理多個 IO 操作的儲存硬體。 此介面暴露了 XFS 的內部實現細節,因此明確不屬於核心可能提供給使用者的任何使用者空間 API/ABI 保證。 這些是 XFS 用於併發的通用工作佇列實現的未文件化的特性,在此提供它們僅用於診斷和調整目的,並且可能隨時更改。

檔案系統工作佇列的控制旋鈕按手頭的任務和資料裝置的簡稱進行組織。 它們都可以在以下位置找到:

/sys/bus/workqueue/devices/${task}!${device}

任務

描述

xfs_iwalk-$pid

整個檔案系統的 Inode 掃描。 目前僅限於掛載時 quotacheck。

xfs-gc

對磁碟空間的後臺垃圾回收,這些磁碟空間已被推測性地分配到 EOF 之外或用於暫存寫入時複製操作。

例如,/dev/nvme0n1 的 quotacheck 工作佇列的控制旋鈕可以在 /sys/bus/workqueue/devices/xfs_iwalk-1111!nvme0n1/ 中找到。

XFS 工作佇列的有趣控制旋鈕如下:

旋鈕

描述

max_active

可以啟動以執行工作的最大後臺執行緒數。

cpumask

允許執行緒在其上執行的 CPU。

nice

排程執行緒的相對優先順序。 這些是可以應用於使用者空間程序的相同的 nice 級別。

分割槽檔案系統

對於分割槽檔案系統,以下屬性在以下位置公開:

/sys/fs/xfs/<dev>/zoned/

max_open_zones(最小值:1 預設值:變化 最大值:UINTMAX)

此只讀屬性公開可用於資料放置的最大開放分割槽數。 該值在掛載時確定,並且受到後備分割槽裝置的容量、檔案系統大小和 max_open_zones 掛載選項的限制。

zonegc_low_space(最小值:0 預設值:0 最大值:100)

定義 GC 應保留多少未用空間百分比以供寫入。 較高的值將回收更多被未使用塊佔用的空間,從而建立一個更大的緩衝區來抵抗寫入突發,但會增加寫入放大。 無論此值如何,垃圾回收將始終旨在釋放最少數量的塊,以保持 max_open_zones 處於開啟狀態以用於資料放置目的。