1. 程式人生 > >Linux下常見檔案系統的對比

Linux下常見檔案系統的對比

本文將對Linux下常見的幾種檔案系統進行對比,包括ext2、ext3、ext4、XFS和Btrfs,希望能幫助大家更好的選擇合適的檔案系統。

內容來自於網上找的資料以及自己的一些經驗,能力有限,錯誤在所難免,僅供參考

歷史

檔案系統 建立者 建立時間 最開始支援的平臺
ext2 1993 Linux,Hurd
XFS SGI 1994 IRIX, Linux, FreeBSD
ZFS Sun 2004 Solaris
ext4 眾多開發者 2006 Linux
Btrfs Oracle 2007 Linux

從建立時間可以看出他們所處的不同時代,因為Btrfs的實現借鑑自ZFS,所以這裡也將ZFS列出來作為參考。

大小限制

檔案系統 最大檔名長度 最大檔案大小 最大分割槽大小
ext2 255 bytes 2 TB 16 TB
ext3 255 bytes 2 TB 16 TB
ext4 255 bytes 16 TB 1 EB
XFS 255 bytes 8 EB 8 EB
Btrfs 255 bytes 16 EB 16 EB

最大檔案和分割槽大小受格式化分割槽時所採用的塊大小(block size)所影響,塊越大,所支援的最大檔案和分割槽越大,也越可能浪費磁碟空間,上表列出的資料基於4K的塊大小。

程式碼規模

從程式碼規模可以看出檔案系統的功能豐富程度以及複雜度,下面列出的資料來自於kernel-4.1-rc8,只是簡單的用wc -l來統計,沒有過濾空行、註釋等。

檔案系統 原始檔(.c) 標頭檔案(.h)
ext2 8363 1016
ext3 16496 1567
ext4 44650 4522
XFS 89605 15091
Btrfs 105254 7933
  • Btrfs還在快速的開發過程中,程式碼行數可能還有比較大的變化
  • XFS和Btrfs都使用了B-tree

ext2

ext的優點是比較簡單,檔案比較少時效能較好,比較適合檔案少的場景,主要缺點如下

  • inode的數量是固定不變的,在格式化分割槽的時候可以指定inode和資料塊所佔空間的比例,但一旦格式化好,後續就沒法再改變了
  • 當塊大小為4K時,單個檔案大小不能超過2TB,分割槽大小不能超過16TB(目前硬碟大小一般都只有幾TB,所以也不是什麼大問題,)
  • 一個目錄下最多隻能有32000個子目錄
  • 由於目錄裡面儲存的檔案和子目錄都是以線性方式來組織的,所以遍歷目錄效率不高,尤其當目錄下檔案個數達到10K以上規模的時候,速度會明顯的變慢
  • 當底層的磁碟分割槽空間變大時(使用LVM時很常見),ext2沒法動態的擴充套件來使用增加的空間
  • 沒有日誌(Journal)功能,所以資料的安全性不高

ext3

ext3在ext2的基礎上實現了下面幾個功能,其它的都保持不變,即ext2的缺點ext3也有

  • 支援日誌(Journal)功能,資料的安全性較ext2有很大的提高
  • 當底層的分割槽空間變大時,ext3可以自動擴充套件來使用增加的空間
  • 使用HTree來組織目錄裡面的檔案和子目錄,使目錄下的檔案和子目錄數不再受效能限制(數量超過10K也不會有效能問題)

ext4

ext4借鑑了當前成熟的一些檔案系統技術,在ext3上增加了一些功能,並且對效能做了一些改進,主要變化如下

  • 當塊大小為4K時,支援的最大檔案和最大分割槽大小分別達到了16TB和1EB
  • 不再受32000個子目錄數的限制,支援不限數量的子目錄個數
  • 支援Extents,提高了大檔案的操作效能
  • 內部實現上支援一次分配多個數據塊,較ext3的效能有所提高
  • 支援延時分配(即支援fallocate函式)(fallocate是libc的函式,在不支援該功能的檔案系統上,libc會建立一個佔用磁碟空間檔案)
  • 支援線上快速掃描
  • 支援線上碎片整理(單個檔案或者整個分割槽)
  • 日誌(Journal)支援校驗碼(checksum),資料的安全性進一步提高
  • 支援無日誌(No Journaling)模式(ext3不支援該功能),這樣就和ext2一樣,消除了寫日誌對效能的影響
  • 支援納秒級的時間戳
  • 記錄了檔案的建立時間,由於相關的應用層工具還不支援,所以只能通過debug的方式看到檔案的建立時間

這裡是一個檢視檔案/etc/fstab建立時間的例子(檔案存在/dev/sda1分割槽上):

  1. [email protected]:~$ ls -i /etc/fstab 
  2. 10747906 /etc/fstab 
  3. [email protected]:~$ sudo debugfs -R 'stat <10747906>' /dev/sda1 
  4. Inode: 10747906   Type: regular    Mode:  0644   Flags: 0x80000 
  5. Links: 1   Blockcount: 8 
  6. ctime: 0x5546dc54:6e6bc80c -- Sun May  3 22:41:24 2015 
  7.  atime: 0x55d1b014:8bcf7b44 -- Mon Aug 17 05:57:40 2015 
  8.  mtime: 0x5546dc54:6e6bc80c -- Sun May  3 22:41:24 2015 
  9. crtime: 0x5546dc54:6e6bc80c -- Sun May  3 22:41:24 2015 
  10. Size of extra inode fields: 28 
  11. EXTENTS: (0):46712815  

Extents: 在最開始的ext2檔案系統中,資料塊都是一個一個單獨管理的,inode中存有指向資料塊的指標,檔案佔用了多少個數據塊,inode裡面就有多少個指標(多級),想象一下一個1G的檔案,4K的塊大小,那麼需要(1024 * 1024)/4=262144個數據塊,即需要262144個指標,建立檔案的時候需要初始化這些指標,刪除檔案的時候需要回收這些指標,影響效能。現代的檔案系統都支援Extents的功能,簡單點說,Extent就是資料塊的集合,以前一次分配一個數據塊,現在可以一次分配一個Extent,裡面包含很多資料塊,同時inode裡面只需要分配指向Extent的指標就可以了,從而大大減少了指標的數量和層級,提高了大檔案操作的效能。

inode數量固定: 在ext2/3/4系列的檔案系統中,inode的數量都是固定的,壞處是如果存很多小檔案的話,有可能造成inode被用光,但磁碟還有很多剩餘空間無法被使用的情況,不過它也有一個好處,就是一旦磁碟損壞,恢復起來要相對簡單些,因為資料在磁碟上佈局相對要固定簡單。

xfs

和ext4相比,xfs不支援下面這些功能

  • 不支援日誌(Journal)校驗碼
  • 不支援無日誌(No Journaling)模式
  • 不支援檔案建立時間
  • 不支援資料日誌(data journal),只有元資料日誌(metadata journal)

但xfs有下面這些特性

  • 支援的最大檔案和分割槽都達到了8EB
  • inode動態分配,從而不受inode數量的限制,再也不用擔心儲存大量小檔案導致inode不夠用的問題了。
  • 更大的xattr(extended attributes)空間,ext2/3/4及btrfs都限制xattr的長度不能超過一個塊(一般是4K),而xfs可以達到64K
  • 內部採用Allocation groups機制,各個group之間沒有依賴,支援併發操作,在多核環境的某些場景下效能表現不錯
  • 提供了原生的dump和restore工具,並且支援線上dump

btrfs

btrfs是一個和ZFS類似的檔案系統,支援的功能非常多,據說將來會替換ext4成為Linux下的預設檔案系統。這裡列舉一些重要的功能

  • 支援的最大檔案和分割槽達到了16EB
  • 支援COW(copy on write)
  • 針對小檔案和SSD做了優化
  • inode動態分配
  • 支援子分割槽(Subvolumes),子分割槽可以單獨掛載
  • 支援元資料和資料的校驗(crc32)
  • 支援壓縮,去重
  • 支援多個磁碟和分割槽,可動態擴充套件
  • 支援LVM,RAID的功能(有了btrfs,就不再需要lvm和軟raid了)
  • 增量備份和恢復
  • 支援快照
  • 將ext2/3/4轉換成btrfs(反過來不行)

btrfs最大的缺點就是由於其COW的實現方式,導致碎片化問題比較嚴重,不太適合頻繁寫的場景,比如資料庫、虛擬機器的磁碟檔案等。不過大部分場合不需要擔心,btrfs有線上的碎片整理工具。

如何選擇

下表僅供參考

檔案系統 適用場景 原因
ext2 U盤 U盤一般不會存很多檔案,且U盤的檔案在電腦上有備份,安全性要求沒那麼高,由於ext2不寫日誌(journal),所以寫U盤效能比較好。當然由於ext2的相容性沒有fat好,目前大多數U盤格式還是用fat
ext3 對穩定性要求高的地方 有了ext4後,好像沒什麼原因還要用ext3,ext4現在的問題是出來時間不長,還需要一段時間變穩定
ext4 小檔案較少 ext系列的檔案系統都不支援inode動態分配,所以如果有大量小檔案需要儲存的話,不建議用ext4
xfs 小檔案多或者需要大的xttr空間,如openstack swift將資料檔案的元資料放在了xttr裡面 xfs支援inode動態分配,所以不存在inode不夠的情況,並且xttr的最大長度可以達到64K
btrfs 沒有頻繁的寫操作,且需要btrfs的一些特性 btrfs雖然還不穩定,但支援眾多的功能,如果你需要這些功能,且不會頻繁的寫檔案,那麼選擇btrfs

另外,ext系列檔案系統內部結構相對簡單一些,出問題後恢復相對容易。

結束語

本篇沒有比較它們的效能,在通常情況下,他們之間沒有太大的效能差別,只有在特定的場景下,才能看出區別,如果對效能比較敏感,建議根據自己的使用場景來測試不同的檔案系統,然後根據結果來選擇。