Linux下常見文件系統對比

本文將對Linux下常見的幾種文件系統進行對比,包括ext二、ext三、ext四、XFS和Btrfs,但願能幫助你們更好的選擇合適的文件系統。node

內容來自於網上找的資料以及本身的一些經驗,能力有限,錯誤在所不免,僅供參考數據庫

歷史

文件系統 建立者 建立時間 最開始支持的平臺
ext2 Rémy Card 1993 Linux,Hurd
XFS SGI 1994 IRIX, Linux, FreeBSD
ext3 Dr. Stephen C. Tweedie 1999 Linux
ZFS Sun 2004 Solaris
ext4 衆多開發者 2006 Linux
Btrfs Oracle 2007 Linux

從建立時間能夠看出他們所處的不一樣時代,由於Btrfs的實現借鑑自ZFS,因此這裏也將ZFS列出來做爲參考。ubuntu

大小限制

文件系統 最大文件名長度 最大文件大小 最大分區大小
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的塊大小。swift

代碼規模

從代碼規模能夠看出文件系統的功能豐富程度以及複雜度,下面列出的數據來自於kernel-4.1-rc8,只是簡單的用wc -l來統計,沒有過濾空行、註釋等。安全

文件系統 源文件(.c) 頭文件(.h)
ext2 8363 1016
ext3 16496 1567
ext4 44650 4522
XFS 89605 15091
Btrfs 105254 7933
  • Btrfs還在快速的開發過程當中,代碼行數可能還有比較大的變化bash

  • 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分區上):

dev@ubuntu:~$ ls -i /etc/fstab
10747906 /etc/fstab
dev@ubuntu:~$ sudo debugfs -R 'stat <10747906>' /dev/sda1
Inode: 10747906   Type: regular    Mode:  0644   Flags: 0x80000
Links: 1   Blockcount: 8
ctime: 0x5546dc54:6e6bc80c -- Sun May  3 22:41:24 2015
 atime: 0x55d1b014:8bcf7b44 -- Mon Aug 17 05:57:40 2015
 mtime: 0x5546dc54:6e6bc80c -- Sun May  3 22:41:24 2015
crtime: 0x5546dc54:6e6bc80c -- Sun May  3 22:41:24 2015
Size of extra inode fields: 28
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系列文件系統內部結構相對簡單一些,出問題後恢復相對容易。

結束語

本篇沒有比較它們的性能,在一般狀況下,他們之間沒有太大的性能差異,只有在特定的場景下,才能看出區別,若是對性能比較敏感,建議根據本身的使用場景來測試不一樣的文件系統,而後根據結果來選擇。

相關文章
相關標籤/搜索