漫談Linux標准的文件系統(Ext2/Ext3/Ext4)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM