Linux下常見文件系統(tǒng)的對(duì)比
本文將對(duì)Linux下常見的幾種文件系統(tǒng)進(jìn)行對(duì)比,包括ext2、ext3、ext4、XFS和Btrfs,希望能幫助大家更好的選擇合適的文件系統(tǒng)。
內(nèi)容來自于網(wǎng)上找的資料以及自己的一些經(jīng)驗(yàn),能力有限,錯(cuò)誤在所難免,僅供參考
歷史
文件系統(tǒng) | 創(chuàng)建者 | 創(chuàng)建時(shí)間 | 最開始支持的平臺(tái) |
---|---|---|---|
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 | 眾多開發(fā)者 | 2006 | Linux |
Btrfs | Oracle | 2007 | Linux |
從創(chuàng)建時(shí)間可以看出他們所處的不同時(shí)代,因?yàn)锽trfs的實(shí)現(xiàn)借鑒自ZFS,所以這里也將ZFS列出來作為參考。
大小限制
文件系統(tǒng) | ***文件名長(zhǎng)度 | ***文件大小 | ***分區(qū)大小 |
---|---|---|---|
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 |
***文件和分區(qū)大小受格式化分區(qū)時(shí)所采用的塊大小(block size)所影響,塊越大,所支持的***文件和分區(qū)越大,也越可能浪費(fèi)磁盤空間,上表列出的數(shù)據(jù)基于4K的塊大小。
代碼規(guī)模
從代碼規(guī)??梢钥闯鑫募到y(tǒng)的功能豐富程度以及復(fù)雜度,下面列出的數(shù)據(jù)來自于kernel-4.1-rc8,只是簡(jiǎn)單的用wc -l來統(tǒng)計(jì),沒有過濾空行、注釋等。
文件系統(tǒng) | 源文件(.c) | 頭文件(.h) |
---|---|---|
ext2 | 8363 | 1016 |
ext3 | 16496 | 1567 |
ext4 | 44650 | 4522 |
XFS | 89605 | 15091 |
Btrfs | 105254 | 7933 |
- Btrfs還在快速的開發(fā)過程中,代碼行數(shù)可能還有比較大的變化
- XFS和Btrfs都使用了B-tree
ext2
ext的優(yōu)點(diǎn)是比較簡(jiǎn)單,文件比較少時(shí)性能較好,比較適合文件少的場(chǎng)景,主要缺點(diǎn)如下
- inode的數(shù)量是固定不變的,在格式化分區(qū)的時(shí)候可以指定inode和數(shù)據(jù)塊所占空間的比例,但一旦格式化好,后續(xù)就沒法再改變了
- 當(dāng)塊大小為4K時(shí),單個(gè)文件大小不能超過2TB,分區(qū)大小不能超過16TB(目前硬盤大小一般都只有幾TB,所以也不是什么大問題,)
- 一個(gè)目錄下最多只能有32000個(gè)子目錄
- 由于目錄里面存儲(chǔ)的文件和子目錄都是以線性方式來組織的,所以遍歷目錄效率不高,尤其當(dāng)目錄下文件個(gè)數(shù)達(dá)到10K以上規(guī)模的時(shí)候,速度會(huì)明顯的變慢
- 當(dāng)?shù)讓拥拇疟P分區(qū)空間變大時(shí)(使用LVM時(shí)很常見),ext2沒法動(dòng)態(tài)的擴(kuò)展來使用增加的空間
- 沒有日志(Journal)功能,所以數(shù)據(jù)的安全性不高
ext3
ext3在ext2的基礎(chǔ)上實(shí)現(xiàn)了下面幾個(gè)功能,其它的都保持不變,即ext2的缺點(diǎn)ext3也有
- 支持日志(Journal)功能,數(shù)據(jù)的安全性較ext2有很大的提高
- 當(dāng)?shù)讓拥姆謪^(qū)空間變大時(shí),ext3可以自動(dòng)擴(kuò)展來使用增加的空間
- 使用HTree來組織目錄里面的文件和子目錄,使目錄下的文件和子目錄數(shù)不再受性能限制(數(shù)量超過10K也不會(huì)有性能問題)
ext4
ext4借鑒了當(dāng)前成熟的一些文件系統(tǒng)技術(shù),在ext3上增加了一些功能,并且對(duì)性能做了一些改進(jìn),主要變化如下
- 當(dāng)塊大小為4K時(shí),支持的***文件和***分區(qū)大小分別達(dá)到了16TB和1EB
- 不再受32000個(gè)子目錄數(shù)的限制,支持不限數(shù)量的子目錄個(gè)數(shù)
- 支持Extents,提高了大文件的操作性能
- 內(nèi)部實(shí)現(xiàn)上支持一次分配多個(gè)數(shù)據(jù)塊,較ext3的性能有所提高
- 支持延時(shí)分配(即支持fallocate函數(shù))(fallocate是libc的函數(shù),在不支持該功能的文件系統(tǒng)上,libc會(huì)創(chuàng)建一個(gè)占用磁盤空間文件)
- 支持在線快速掃描
- 支持在線碎片整理(單個(gè)文件或者整個(gè)分區(qū))
- 日志(Journal)支持校驗(yàn)碼(checksum),數(shù)據(jù)的安全性進(jìn)一步提高
- 支持無日志(No Journaling)模式(ext3不支持該功能),這樣就和ext2一樣,消除了寫日志對(duì)性能的影響
- 支持納秒級(jí)的時(shí)間戳
- 記錄了文件的創(chuàng)建時(shí)間,由于相關(guān)的應(yīng)用層工具還不支持,所以只能通過debug的方式看到文件的創(chuàng)建時(shí)間
這里是一個(gè)查看文件/etc/fstab創(chuàng)建時(shí)間的例子(文件存在/dev/sda1分區(qū)上):
- 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文件系統(tǒng)中,數(shù)據(jù)塊都是一個(gè)一個(gè)單獨(dú)管理的,inode中存有指向數(shù)據(jù)塊的指針,文件占用了多少個(gè)數(shù)據(jù)塊,inode里面就有多少個(gè)指針(多級(jí)),想象一下一個(gè)1G的文件,4K的塊大小,那么需要(1024 * 1024)/4=262144個(gè)數(shù)據(jù)塊,即需要262144個(gè)指針,創(chuàng)建文件的時(shí)候需要初始化這些指針,刪除文件的時(shí)候需要回收這些指針,影響性能。現(xiàn)代的文件系統(tǒng)都支持Extents的功能,簡(jiǎn)單點(diǎn)說,Extent就是數(shù)據(jù)塊的集合,以前一次分配一個(gè)數(shù)據(jù)塊,現(xiàn)在可以一次分配一個(gè)Extent,里面包含很多數(shù)據(jù)塊,同時(shí)inode里面只需要分配指向Extent的指針就可以了,從而大大減少了指針的數(shù)量和層級(jí),提高了大文件操作的性能。
inode數(shù)量固定: 在ext2/3/4系列的文件系統(tǒng)中,inode的數(shù)量都是固定的,壞處是如果存很多小文件的話,有可能造成inode被用光,但磁盤還有很多剩余空間無法被使用的情況,不過它也有一個(gè)好處,就是一旦磁盤損壞,恢復(fù)起來要相對(duì)簡(jiǎn)單些,因?yàn)閿?shù)據(jù)在磁盤上布局相對(duì)要固定簡(jiǎn)單。
xfs
和ext4相比,xfs不支持下面這些功能
- 不支持日志(Journal)校驗(yàn)碼
- 不支持無日志(No Journaling)模式
- 不支持文件創(chuàng)建時(shí)間
- 不支持?jǐn)?shù)據(jù)日志(data journal),只有元數(shù)據(jù)日志(metadata journal)
但xfs有下面這些特性
- 支持的***文件和分區(qū)都達(dá)到了8EB
- inode動(dòng)態(tài)分配,從而不受inode數(shù)量的限制,再也不用擔(dān)心存儲(chǔ)大量小文件導(dǎo)致inode不夠用的問題了。
- 更大的xattr(extended attributes)空間,ext2/3/4及btrfs都限制xattr的長(zhǎng)度不能超過一個(gè)塊(一般是4K),而xfs可以達(dá)到64K
- 內(nèi)部采用Allocation groups機(jī)制,各個(gè)group之間沒有依賴,支持并發(fā)操作,在多核環(huán)境的某些場(chǎng)景下性能表現(xiàn)不錯(cuò)
- 提供了原生的dump和restore工具,并且支持在線dump
btrfs
btrfs是一個(gè)和ZFS類似的文件系統(tǒng),支持的功能非常多,據(jù)說將來會(huì)替換ext4成為L(zhǎng)inux下的默認(rèn)文件系統(tǒng)。這里列舉一些重要的功能
- 支持的***文件和分區(qū)達(dá)到了16EB
- 支持COW(copy on write)
- 針對(duì)小文件和SSD做了優(yōu)化
- inode動(dòng)態(tài)分配
- 支持子分區(qū)(Subvolumes),子分區(qū)可以單獨(dú)掛載
- 支持元數(shù)據(jù)和數(shù)據(jù)的校驗(yàn)(crc32)
- 支持壓縮,去重
- 支持多個(gè)磁盤和分區(qū),可動(dòng)態(tài)擴(kuò)展
- 支持LVM,RAID的功能(有了btrfs,就不再需要lvm和軟raid了)
- 增量備份和恢復(fù)
- 支持快照
- 將ext2/3/4轉(zhuǎn)換成btrfs(反過來不行)
btrfs***的缺點(diǎn)就是由于其COW的實(shí)現(xiàn)方式,導(dǎo)致碎片化問題比較嚴(yán)重,不太適合頻繁寫的場(chǎng)景,比如數(shù)據(jù)庫(kù)、虛擬機(jī)的磁盤文件等。不過大部分場(chǎng)合不需要擔(dān)心,btrfs有在線的碎片整理工具。
如何選擇
下表僅供參考
文件系統(tǒng) | 適用場(chǎng)景 | 原因 |
---|---|---|
ext2 | U盤 | U盤一般不會(huì)存很多文件,且U盤的文件在電腦上有備份,安全性要求沒那么高,由于ext2不寫日志(journal),所以寫U盤性能比較好。當(dāng)然由于ext2的兼容性沒有fat好,目前大多數(shù)U盤格式還是用fat |
ext3 | 對(duì)穩(wěn)定性要求高的地方 | 有了ext4后,好像沒什么原因還要用ext3,ext4現(xiàn)在的問題是出來時(shí)間不長(zhǎng),還需要一段時(shí)間變穩(wěn)定 |
ext4 | 小文件較少 | ext系列的文件系統(tǒng)都不支持inode動(dòng)態(tài)分配,所以如果有大量小文件需要存儲(chǔ)的話,不建議用ext4 |
xfs | 小文件多或者需要大的xttr空間,如openstack swift將數(shù)據(jù)文件的元數(shù)據(jù)放在了xttr里面 | xfs支持inode動(dòng)態(tài)分配,所以不存在inode不夠的情況,并且xttr的***長(zhǎng)度可以達(dá)到64K |
btrfs | 沒有頻繁的寫操作,且需要btrfs的一些特性 | btrfs雖然還不穩(wěn)定,但支持眾多的功能,如果你需要這些功能,且不會(huì)頻繁的寫文件,那么選擇btrfs |
另外,ext系列文件系統(tǒng)內(nèi)部結(jié)構(gòu)相對(duì)簡(jiǎn)單一些,出問題后恢復(fù)相對(duì)容易。
結(jié)束語
本篇沒有比較它們的性能,在通常情況下,他們之間沒有太大的性能差別,只有在特定的場(chǎng)景下,才能看出區(qū)別,如果對(duì)性能比較敏感,建議根據(jù)自己的使用場(chǎng)景來測(cè)試不同的文件系統(tǒng),然后根據(jù)結(jié)果來選擇。