Ext
全稱Linux extended file system, extfs,即Linux擴展文件系統,Ext2就代表第二代文件擴展系統,Ext3/Ext4以此類推,它們都是Ext2的升級版,只不過為了快速恢復文件系統,減少一致性檢查的時間,增加了日志功能,所以Ext2被稱為索引式文件系統,而Ext3/Ext4被稱為日志式文件系統。
備注:Linux支持很多文件系統,包括網絡文件系統(NFS)、Windows的Fat文件系統。
查看Linux支持的文件系統:ls -l /lib/modules/$(uname -r)/kernel/fs
查看Linux支持的文件系統(已載入到內存中):cat /proc/filesystems
核心設計
數據存放區
這些元素相對穩定,磁盤格式化后,就固定下來了。
- inode(索引節點)
記錄文件的權限、屬性和數據所在塊block
的號碼,每個文件都有且僅有一個的inode
,每個inode
都有自己的編號,可以把inode
簡單地理解為文檔索引。
備注:在磁盤格式化后,inode的大小和數量都已經固定了,大小均為128Bytes(新的Ext4和xfs為258Bytes)。讀取文件時,先讀取inode里面記錄的文件屬性和權限,匹配正確后,才會讀取文件內容(block)。在Linux系統中,實際使用inode來識別文件,而不是文件名,類似於用戶標識和昵稱的設計。
- inode table
存儲文件系統的所有inode編號的表格 - block(數據區塊)
存儲的文件內容,也叫數據區塊(data block),每個block
都有自己的編號,Ext2
支持的單位block
容量僅為1k、2k、4k。
備注:為了方便inode的記錄,在磁盤格式化后,block的大小都已經固定了。每一個塊只能存放一個文件的數據,若文件太大,將占用多個block;若文件太小,block剩余空間就不能被使用了,就會導致磁盤空間浪費,所以在磁盤分區后,文件系統格式化前,請先仔細想想文件系統的預計使用情況。
查看文件或者文件系統的狀態
stat [options] [filename]
查看系統各個文件系統的inode使用情況
df -i
中介數據(metadata)
這些元素是為了維持文件系統狀態而設計出來的,當新增、編輯、刪除文檔時,都需要變更這些狀態信息。
- superblock(超級塊)
記錄文件系統(filesystem)的整體信息,包括inode/block
的總量、使用量、剩余量、大小、以及文件系統的格式和相關信息。
備注:整個文件系統的基本信息全部記錄在superblock,它的大小一般為1024Bytes,如果它死掉,將會花費大量的時間去補救哦!!!
- block group(區塊群組)
試想一下,假如我們的磁盤容量高達數百G,當我們格式后,inode和block會非常龐大,為了便於管理,Ext文件系統在格式化時,引入了區塊群組(block group)的概念,每個區塊群組都保持獨立inode/block/superblock,擁有固定數量的block,這樣就分成了一群一群最基礎的子文件系統。
備注:superblock對於文件系統太重要了,但是文件系統的superblock又只有一個,所以除了第一個block group含有superblock外,后續block group都可能會含有備份的superblock,目的就是為了避免superblock單點無法救援的問題。
- block bitmap(區塊對照表)
一個block只能被一個文件使用,當我們新增文件時,肯定需要使用新的block來記錄文件數據。那么如何快速地知道,哪些block是新的?哪些block是已經使用了的?block bitmap就是這樣被設計出來,記錄所有使用和未使用的block號碼。同樣的,當我們刪除文件時,先從block bitmap中找到對應的block號碼,然后更新標志為未使用,最后釋放block。 - inode bitmap(inode 對照表)
和block bitmap一樣的設計理念,只不過它記錄地是已使用和未使用的inode號碼,這里就不再敖述了。 - group descriptor
描述每個區段(block group)開始和結束的block號碼,以及說明每個區段(inodemap、blockmap、inode table)分別介於哪些block號碼之間。
列出目前系統所有被格式化的設備:blkid
挑選一個已格式化好的設備,查看文件系統的詳細信息: dumpe2fs /dev/vda1
備注:通過上面的Magic簽名為0xEF53,說明我們的磁盤分區是一個標准的ext2和ext3文件系統。類似於通過文件開頭的Magic,可以判斷文件類型一樣。
示例說明
1. inode的作用
當用戶搜索或者訪問一個文件時,UNIX 系統通過 inode 表查找正確的 inode 編號。在找到 inode 編號之后,相關的命令才可以訪問該 inode ,並對其進行適當的更改。
示例
例如使用vi
來編輯一個文件。當您鍵入vi<filename>
時,在inode表中找到inode編號之后,才允許您打開該inode 。在 vi 的編輯會話期間,更改了該inode中的某些屬性,當您完成操作並鍵入 :wq 時,將關閉並釋放該 inode 。通過這種方式,如果兩個用戶試圖對同一個文件進行編輯, inode 已經在第一個編輯會話期間分配給了另一個用戶 ID (UID),因此第二個編輯任務就必須等待,直到該 inode 釋放為止。
備注:大家可以參考百度百科。
2. block的重要性
通過上面的分析,我們知道block是文件數據存儲的原子單位,且每一個block只能存儲一個文件的數據。當格式化一個文件系統時,如果選擇不當,就會造成大量的磁盤空間浪費。
示例
假如文件系統選擇的block為4k,存儲10000個小文件,每個500bytes,請問此時浪費了多少磁盤空間容量?
每個文件浪費的磁盤容量 = 4096 - 500 = 3596bytes,10000個文件浪費的磁盤容量 = 10000 * 3596 ~=34M,實際文件容量 = 10000 * 500 ~=4.7M,沒有對比就沒有傷害啊,實際存儲容量不到5M,就浪費了34M,浪費率680%,而且文件越多浪費越嚴重。
備注:從原理上分析,只有當實際文件容量剛好等於系統最小存儲單位容量時,磁盤不會存在浪費的情況,但這是理想情況,那么我們選擇最小的block不就行了,沒毛病。不過,此時又有新的問題產生了,大型文件會占用過多的block,造成inode記錄過多的block號碼,文件系統的讀寫性能就會下降,所以說凡事都要有個度,把握好這個度,才能從整體上提高文件系統的性能和利用率。
3. inode和block與文件大小的關系
數據實際存儲在block,為了能夠快速地讀取文件,每個文件都對應一個inode索引文件,記錄所有的block編號,但是inode的大小只有128bytes或256bytes(ext4),如果一個文件太大,block數量很有可能會超過inode可記錄的數量,為此,inode記錄block號碼的區域被設計為12個直接、一個間接、一個雙間接、一個三間接記錄區。
備注:所謂的間接就是拿一個block來作為block號碼記錄區,只有最后一個間接才會真正用來記錄block號碼,其他的間接層,都只是依次引用。
計算單文件最大容量
每個block號碼為數字,需要占據4bytes。
-
假設block的單位容量為1K,每個block能記錄的block號碼為1k/4=256。
- 12個直接容量 = 12 * 1k =12k
- 單間接容量 = 256 * 1k = 256k
- 雙間接容量 = 256 * 256 * 1k = 65536k
- 三間接容量 = 256 * 256 * 256 * 1k = 16777216k
- 單文件最大總量 = 12個直接容量 + 單間接容量 + 雙間接容量 + 三間接容量 = (12 + 256 + 65536 + 16777216) / (1024 * 1024) = 16.06G
-
假設block的單位容量為2K,每個block能記錄的block號碼為2k/4=512。
- 12個直接容量 = 12 * 2k =24k
- 單間接容量 = 512 * 2k = 1024k
- 雙間接容量 = 512 * 512 * 2k = 524288k
- 三間接容量 = 512 * 512 * 512 * 2k = 268435456k
- 單文件最大總量 = 12個直接容量 + 單間接容量 + 雙間接容量 + 三間接容量 = (24 + 1024 + 524288 + 268435456) / (1024 * 1024) = 256.50G
-
假設block的單位容量為4K,每個block能記錄的block號碼為4k/4=1024。
- 同理,單文件最大總量 = 12個直接容量 + 單間接容量 + 雙間接容量 + 三間接容量 = 4.00T
Linux標准的文件系統限制表
備注:當block單位容量為4K時,由於文件系統本身的限制(2T),所以才與計算的結果不太吻合。
查看磁盤和文檔的容量
1. 查看文件系統的整體磁盤容量
df [-ahikHTm] [目錄或文件名]
2. 查看目錄和文件容量
du [options] []
查看目錄geekbuying下所有目錄的容量
du -sm geekbuying/*
統計當前目錄容量
du -sm 單位M
總結
Ext家族是Linux支持度最廣、最完整的文件系統,當我們格式化磁盤后,就已經為我們規划好了所有的inode/block/metadate等數據,這樣系統可以直接使用,不需要再進行動態的配置,這也是它最優秀的特點,不過這也是它最顯著的缺點,磁盤容量越大,格式化越慢,centos7.x已經選用xfs作為默認文件系統,xfs是一種適合大容量磁盤和處理巨型文件的文件系統。
延伸閱讀
https://en.wikipedia.org/wiki/Unix_filesystem
https://en.wikipedia.org/wiki/Inode
https://en.wikipedia.org/wiki/Unix_filesystem#/media/File:Standard-unix-filesystem-hierarchy.svg
https://en.wikipedia.org/wiki/File:Version_7_UNIX_SIMH_PDP11_Filesystem_Layout.png