本文將對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併發
ext的優勢是比較簡單,文件比較少時性能較好,比較適合文件少的場景,主要缺點以下函數
inode的數量是固定不變的,在格式化分區的時候能夠指定inode和數據塊所佔空間的比例,但一旦格式化好,後續就無法再改變了工具
當塊大小爲4K時,單個文件大小不能超過2TB,分區大小不能超過16TB(目前硬盤大小通常都只有幾TB,因此也不是什麼大問題,)佈局
一個目錄下最多隻能有32000個子目錄
因爲目錄裏面存儲的文件和子目錄都是以線性方式來組織的,因此遍歷目錄效率不高,尤爲當目錄下文件個數達到10K以上規模的時候,速度會明顯的變慢
當底層的磁盤分區空間變大時(使用LVM時很常見),ext2無法動態的擴展來使用增長的空間
沒有日誌(Journal)功能,因此數據的安全性不高
ext3在ext2的基礎上實現了下面幾個功能,其它的都保持不變,即ext2的缺點ext3也有
支持日誌(Journal)功能,數據的安全性較ext2有很大的提升
當底層的分區空間變大時,ext3能夠自動擴展來使用增長的空間
使用HTree來組織目錄裏面的文件和子目錄,使目錄下的文件和子目錄數再也不受性能限制(數量超過10K也不會有性能問題)
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被用光,但磁盤還有不少剩餘空間沒法被使用的狀況,不過它也有一個好處,就是一旦磁盤損壞,恢復起來要相對簡單些,由於數據在磁盤上佈局相對要固定簡單。
和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是一個和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系列文件系統內部結構相對簡單一些,出問題後恢復相對容易。
本篇沒有比較它們的性能,在一般狀況下,他們之間沒有太大的性能差異,只有在特定的場景下,才能看出區別,若是對性能比較敏感,建議根據本身的使用場景來測試不一樣的文件系統,而後根據結果來選擇。