XFS
開發者 | Silicon Graphics Inc. |
---|---|
全稱 | XFS |
釋出 | 1994年 (IRIX v5.3) |
結構 | |
目錄內容 | B+樹 |
檔案分配 | B+樹 |
限制 | |
最大檔案尺寸 | 8 exabytes (減1位元組) |
最長檔名 | 255 bytes |
最大卷容量 | 16 exabytes |
檔案名字符集 | 除NUL('\0')和 '/'以外的位元組 |
功能 | |
日期記錄 | 支援 |
日期解像度 | 納秒 |
屬性 | 支援 |
檔案系統權限 | 支援 |
透明壓縮 | 不支援 |
透明加密 | 不支援(在塊裝置層上實現) |
單一實例儲存(SIS) | 不支援 |
作業系統支援 | IRIX, Linux, FreeBSD (試驗性) |
XFS,一種高效能的紀錄檔檔案系統,最早於1993年,由Silicon Graphics為他們的IRIX作業系統而開發,是IRIX 5.3版的預設檔案系統。2000年5月,Silicon Graphics以GNU通用公眾特許條款釋出這套系統的原始碼,之後被移植到Linux內核上。XFS特別擅長處理大檔案,同時提供平滑的數據傳輸。
歷史
XFS的開發始於1993年,在1994年被首次部署在IRIX 5.3上。2000年5月,XFS在GNU通用公眾特許條款下釋出,並被移植到Linux上。2001年XFS首次被Linux發行版所支援,現在所有的Linux發行版上都可以使用XFS。
XFS最初被合併到Linux 2.4主線中,這使得XFS幾乎可以被用在任何一個Linux系統上。Arch, Debian, Fedora, openSUSE, Gentoo, Kate OS, Mandriva, Slackware, Ubuntu, VectorLinux和Zenwalk的安裝程式中都可選擇XFS作為檔案系統,但由於預設的啟動管理器GRUB中存在bug[1],以上發行版中只有少數幾個允許用戶在 /boot 掛載點(引導目錄)上使用XFS檔案系統。
FreeBSD在2005年12月獲得了對XFS的唯讀支援,並在次年6月引入了試驗性的寫入支援。不過這些只是為了方便用戶從Linux上遷移到FreeBSD上,並不是為了把XFS作為主打檔案系統使用。Red Hat Enterprise Linux 5.4 64位元版的內核完整支援XFS,但未包含建立和使用XFS的命令列工具(CentOS正在進行這方面的嘗試),原因是這些軟件套件還不夠穩定[2]。Red Hat Enterprise Linux 7/CentOS預設使用XFS檔案系統。[3]
規範
容量
XFS是一個64位元檔案系統,最大支援8exbibytes減1位元組的單個檔案系統,實際部署時取決於宿主作業系統的最大塊限制。對於一個32位元Linux系統,檔案和檔案系統的大小會被限制在16tebibytes。
檔案系統紀錄檔
紀錄檔檔案系統是一種即使在斷電或者是作業系統崩潰的情況下保證檔案系統一致性的途徑。XFS對檔案系統元數據提供了紀錄檔支援。當檔案系統更新時,元數據會在實際的磁碟塊被更新之前順序寫入紀錄檔。XFS的紀錄檔被儲存在磁碟塊的迴圈緩衝區上,不會被正常的檔案系統操作影響。XFS紀錄檔大小的上限是64k個塊和128MB中的較大值,下限取決於已存在的檔案系統和目錄的塊的大小。在外置裝置上部署紀錄檔會浪費超過最大紀錄檔大小的空間。XFS紀錄檔也可以被存在檔案系統的數據區(稱為內建紀錄檔),或者一個額外的裝置上(以減少磁碟操作)。
XFS的紀錄檔所儲存的是「邏輯」條目,以人類更加容易理解的方式來描述當前正在進行的操作(「物理」紀錄檔與其相反,儲存的是每次操作中被修改的塊)。紀錄檔的更新以非同步的方式進行,避免影響整體效能。
如果發生系統崩潰,可以根據紀錄檔中的記錄來重做並完成崩潰的前一時刻發生的系統操作。崩潰之後首次掛載檔案系統時,會自動進行恢復。恢復的速度不受檔案系統大小的影響,取決於需要重做的系統操作的數量。
對於最近被修改但未完全寫入磁碟的數據,XFS保證在重新啟動時清零所有未被寫入的數據塊,以防止任何有可能的、由剩餘數據導致的安全隱患(因為雖然從檔案系統介面無法訪問這些數據,但不排除裸裝置或裸硬件被直接讀取的可能性)。
分配組
XFS檔案系統內部被分為多個「分配組」,它們是檔案系統中的等長線性儲存區。每個分配組各自管理自己的inode和剩餘空間。檔案和資料夾可以跨越分配組。這一機制為XFS提供了可伸縮性和並列特性——多個線程和行程可以同時在同一個檔案系統上執行I/O操作。這種由分配組帶來的內部分區機制在一個檔案系統跨越多個物理裝置時特別有用,使得最佳化對底層儲存部件的吞吐量利用率成為可能。
條帶化分配
在條帶化RAID陣列上建立XFS檔案系統時,可以指定一個「條帶化數據單元」。這可以保證數據分配、inode分配、以及內部紀錄檔被對齊到該條帶單元上,以此最大化吞吐量。
基於Extent的分配方式
XFS檔案系統中的檔案用到的塊由變長Extent管理,每一個Extent描述了一個或多個連續的塊。與那些把檔案所有塊都單獨列出來的檔案系統相比,extent大幅縮短了列表。
有些檔案系統用一個或多個面向塊的點陣圖管理空間分配——在XFS中這種結構被由一對B+樹組成的、面向Extent的結構替代了;每個檔案系統分配組(AG)包含這樣的一個結構。其中,一個B+樹用於索引未被使用的Extent的長度,另一個索引這些Extent的起始塊。這種雙索引策略使得檔案系統在定位剩餘空間中的Extent時十分高效。
可變塊尺寸
塊是檔案系統中的最小可單位配置。XFS允許在建立檔案系統時指定塊的大小,從512位元組到64KB,以適應專門的用途。比如,對於有很多小檔案的應用,較小的塊尺寸可以最大化磁碟利用率;但對於一個主要處理大檔案的系統,較大的塊尺寸能提供更好的效能。...
延遲分配
XFS在檔案分配上使用了惰性計算技術。當一個檔案被寫入快取時,XFS僅在主記憶體中對該檔案保留適當數量的塊,並不立即給數據分配Extent。實際的塊分配僅在這段數據被沖刷到磁碟時才發生。這一機制提高了將該檔案寫入一組連續塊中的機會,減少碎片的同時提升了效能。
稀疏檔案
XFS對每個檔案提供了一個64位元的稀疏地址空間,使得大檔案中的「洞」(空白數據區)不被實際分配到磁碟上。因為檔案系統對每個檔案使用一個Extent表,檔案分配表就可以保持一個較小的體積。對於太大以至於無法儲存在inode中的分配表,這張表會被移動到B+樹中,繼續保持對該目標文件在64位元地址空間中任意位置的數據的高效訪問。
擴充屬性
XFS通過實現擴充檔案屬性給檔案提供了多個數據流,使檔案可以被附加多個名/值對。檔名是一個最大長度為256位元組的、以NULL字元結尾的可列印字串,其它的關聯值則可包含多達64KB的二進制數據。這些數據被進一步分入兩個名字空間中,root
和user
。儲存在root名字空間中的擴充屬性只能被超級用戶修改,user名字空間中的可以被任何對該檔案擁有寫權限的用戶修改。擴充屬性可以被添加到任意一種 XFS inode上,包括符號連結、裝置節點、目錄,等等。可以使用attr
這個命令列程式操作這些擴充屬性。xfsdump
和xfsrestore
工具在進行備份和恢復時會一同操作擴充屬性,而其它的大多數備份系統則會忽略擴充屬性。
Direct I/O
對於需要高吞吐量的應用,XFS實現了直接的I/O,允許未快取的I/O操作直接應用到用戶空間。數據在應用程式的緩衝區和磁碟間利用DMA進行傳輸,以此提供底層磁碟裝置全部的I/O頻寬。
確定速率I/O
XFS確定速率I/O系統給應用程式提供了預留檔案系統頻寬的API。XFS會動態計算底層儲存裝置能提供的效能,並在給定的時間內預留足夠的頻寬以滿足所要求的效能。此項特性是XFS所獨有的。確定方式可以是硬性的或軟性的,前者提供了更高效能,而後者相對更加可靠。不過只要底層儲存裝置支援硬性速率確定,XFS就只允許硬性模式。這一機制最常被用在即時應用中,比如影片流。
DMAPI
XFS實現了數據管理應用程式介面(DMAPI)以支援高階儲存管理(HSM)。到2010年10月為止,Linux上的XFS實現已經支援DMAPI所要求的的磁碟元數據規範,但有報告稱內核支援仍處於不穩定狀態。此前SGI曾提供了一個包含DMAPI勾點的內核原始碼樹,但這個支援未被合併進主代碼樹。不過現在內核開發者們已經注意到了它並對其做了更新[4]。
快照
XFS並不直接提供對檔案系統快照的支援,因為XFS認為快照可在卷管理器中實現。對一個XFS檔案系統做快照需要呼叫xfs_freeze
工具凍結檔案系統的I/O,然後等待卷管理器完成實際的快照建立,再解凍I/O,繼續正常的操作。之後這個快照可以被當作備份,以唯讀方式掛載。在IRIX上釋出的XFS包含了一個整合的卷管理器,叫XLV。這個卷管理器無法被移植到Linux上,不過XFS可以和Linux上標準的LVM正常工作。在最近釋出的Linux內核中,xfs_freeze
的功能被實現在了VFS層,當卷管理器的快照功能被喚醒時將自動啟動xfs_freeze
。相對於無法掛起,卷管理器也無法對其建立「熱」快照的ext3檔案系統[5],XFS的快照功能具有很大優勢。幸運的是,現在這種情況已經改觀。從Linux 2.6.29內核開始,ext3, ext4, gfs2和jfs檔案系統也獲得了凍結檔案系統的特性[6]。
線上碎片整理
雖然XFS基於Extent的特徵和延遲分配策略顯著提高了檔案系統對碎片問題的抵抗力,XFS還是提供了一個檔案系統碎片整理工具,xfs_fsr
(XFS filesystem reorganizer的簡稱)。這個工具可以對一個已被掛載、正在使用中的XFS檔案系統進行碎片整理[7]。
線上尺寸調整
XFS提供了xfs_growfs
工具,可以線上調整XFS檔案系統的大小。XFS檔案系統可以向儲存當前檔案系統的裝置上的未分配空間延伸。這個特性常與卷管理功能結合使用,因為後者可以把多個裝置合併進一個邏輯卷組,而使用硬碟分區儲存XFS檔案系統時,每個分區需要分別擴容。到2010年8月為止,XFS分區不可以原位收縮[8],不過有一些方法可以變相處理這個問題[9]。
原生備份/恢復工具
XFS提供了xfsdump
和xfsrestore
工具協助備份XFS檔案系統中的數據。xfsdump
按inode順序備份一個XFS檔案系統。與傳統的UNIX檔案系統不同,XFS不需要在dump前被解除安裝;對使用中的XFS檔案系統做dump就可以保證鏡像的一致性。這與XFS對快照的實現不同,XFS的dump和restore的過程是可以被中斷然後繼續的,無須凍結檔案系統。xfsdump
甚至提供了高效能的多線程備份操作——它把一次dump拆分成多個數據流,每個數據流可以被發往不同的目的地。不過到目前為止,Linux尚未完成對多數據流dump功能的完整移植。
原子磁碟配額
XFS的磁碟配額在檔案系統被初次掛載時啟用。這解決了一個在其它大多數檔案系統中存在的一個競爭問題:要求先掛載檔案系統,但直到呼叫quotaon (8)之前配額不會生效。
效能考慮
寫入屏障
XFS檔案系統預設在掛載時啟用「寫入屏障」的支援。該特性會一個合適的時間沖刷底層儲存裝置的回寫快取,特別是在XFS做紀錄檔寫入操作的時候。這個特性的初衷是保證檔案系統的一致性,具體實現卻因裝置而異——不是所有的底層硬件都支援快取沖刷請求。在帶有電池供電快取的硬件RAID控制器提供的邏輯裝置上部署XFS檔案系統時,這項特性可能導致明顯的效能退化,因為檔案系統的代碼無法得知這種快取是非揮發性的。如果該控制器又實現了沖刷請求,數據將被不必要地頻繁寫入物理磁碟。為了防止這種問題,對於能夠在斷電或發生其它主機故障時保護快取中數據的裝置,應該以nobarrier
選項掛載XFS檔案系統。
紀錄檔的放置
XFS檔案系統建立時預設使用內建紀錄檔,把紀錄檔和檔案系統數據放置在同一個塊裝置上。由於在所有的檔案系統寫入發生前都要更新紀錄檔中的元數據,內建紀錄檔可能導致磁碟競爭。在大多數負載下,這種等級的競爭非常低以至於對效能沒有影響。但對於沉重的隨機寫入負載,比如在忙碌的數據塊伺服器上,XFS可能因為這種 I/O競爭無法獲得最佳效能。另一個可能提高這個問題的嚴重性的因素是,紀錄檔寫入被要求以同步方式提交——它們必須被完全寫入,之後對應實際數據的寫入操作才能開始。
如果確實需要最佳的檔案系統效能,XFS提供了一個選項,允許把紀錄檔放置在一個分離的物理裝置上。這只需要很小的物理空間。分離的裝置有自己的I/O路徑,如果該裝置能對同步寫入提供低延遲的路徑,那麼它將給整個檔案系統的操作帶來顯著的效能提升。SSD,或帶有寫回快取的RAID系統是紀錄檔裝置的合適候選,它們能滿足這種效能要求。不過後者在遭遇斷電時可能降低數據的安全性。要啟用外部紀錄檔,只須以logdev
選項掛載檔案系統,並指定一個合適的紀錄檔裝置即可。
缺點
- XFS檔案系統的卷無法被直接收縮,只能通過「備份->重灌->還原」的方式間接進行容量縮減(這也是雲端主機供應商會告知儲存空間只能增加不能縮減的其中一個原因),在準備多一組儲存卷的情況下,有工具可對XFS卷進行上述操作:
xfsdump
和xfsrestore
。 - 歷史上XFS上的元數據操作曾比其它檔案系統都慢,表現為在刪除大量小檔案時效能糟糕。該效能問題是被Red Hat的XFS開發者Dave Chinner在代碼中定位到的。使用一個叫「延遲記錄」的掛載選項可以成數量級地提升元數據操作的效能。該選項幾乎把紀錄檔整個存在主記憶體中。Linux內核主線版本2.6.35中作為一個試驗性特性引入了這個修補程式,在2.6.37中使它成為了一個穩定的特性,並在2.6.39中把它作為預設的紀錄檔記錄方法。早期測試顯示在有少量線程的環境中其效能接近EXT4,在大量線程的環境下超過了EXT4[10]。
- 缺少透明壓縮的支援
- 缺少校驗保護,校驗保護在對付靜態型資料損毀方面有幫助
參考文獻
- ^ Redhat.com. [2011-02-23]. (原始內容存檔於2021-04-20).
- ^ Red Hat Linux Bugzilla entry on XFS implementation. [2011-02-23]. (原始內容存檔於2019-03-08).
- ^ Release Notes for Red Hat Enterprise Linux 7.0
- ^ XFS mailing list post regarding state of DMAPI support. [2011-02-24]. (原始內容存檔於2011-09-27).
- ^ Linux questions about freezing Ext3. [2011-02-24]. (原始內容存檔於2016-01-13).
- ^ Freeze Feature Commit to Linux kernel[永久失效連結]
- ^ Bitubique.com. [2011-02-24]. (原始內容存檔於2009-04-01).
- ^ XFS.org (頁面存檔備份,存於互聯網檔案館), FAQ
- ^ SGI.com. [2011-02-24]. (原始內容存檔於2011-06-07).
- ^ and http://oss.sgi.com/archives/xfs/2010-05/msg00329.html. [2011-02-24]. (原始內容存檔於2011-10-06). 外部連結存在於
|title=
(幫助)