1.Linux的文件系統特性
linux的正統文件系統是ext2,對於linux 的文件通常除了實際內容外,通常含有非常多的屬性,例如文件權限(rwx)和文件屬性(擁有者、用戶組、時間參數等)。文件系統通常會將這兩部分存放到不同的區塊,權限和屬性放到inode(unix系統中的一種數據結構)中,而實際的數據放入數據區塊中。除此之外,還有一個超級區塊(super block)會記錄整個文件系統的整體信息,包括inode、數據區塊的總量,使用量,剩余量。
linux的文件系統是采用索引式的文件系統,如下圖例如某個文件的inode為1,inode會記錄文件的世紀內容在區塊4,7,13中,這樣linux就可以方便的讀取出文件的內容。這種文件系統的好處在於讀取速度較快,但是犧牲了部分存儲空間用來存放block的區號。

除了索引式文件系統之外,像我們平時采用的U盤是采用FAT文件系統,這種文件系統沒有inode,每一個數據區塊都記錄了到下一個區塊的號碼,因此它的讀取方法類似1->4->7->13。因為這種特性,文件系統只能一個區塊一個區塊讀出來,但是如果文件太過於分散,消耗的時間就會很多。因此,需要經常的進行碎片整理,將同一個文件所屬的區塊集合在一起。

2.linux的ext2文件系統
文件系統在一開始就將inode和數據區塊規划好了,除非重新格式化,否則inode與數據區塊固定后就不再變動。並且采用多個區塊群組的方式。每個區塊群組都有獨立的inode,數據區塊,超級區塊系統。

1.數據區塊(data block)
數據區塊是用來放置文件數據的地方,ext2文件系統中支持的區塊大小有1k,2k,4k三種。在格式化時區塊的大小就固定了,且每個區塊都有區號。要注意的一點是,不同的區塊大小所支持的最大文件系統容量和最大單一文件容量並不相同。
Block大小 | 1KB | 2KB | 4KB |
---|---|---|---|
最大單一文件限制 | 16GB | 256GB | 2TB |
最大磁盤容量限制 | 2TB | 8TB | 16TB |
除此之外,ext2文件系統的區塊還有一些限制
- 區塊的大小和數量在格式化完成之后無法修改
- 每個區塊內最多只能放置一個文件的數據
- 如果文件大於區塊的大小,一個文件將占用多個區塊
- 如果文件小於區塊的大小,該區塊的剩余容量將無法被使用(被浪費)
所以,如何選擇區塊大小也是一門學問。如果我們的系統需要存放很多大的文件,而選擇了較小的區塊,就會占用過多的區塊,降低讀寫性能。如果我們選擇較大的區塊,而小文件太多則會浪費過多的磁盤空間。
2.inode表(inode table)
上面我們已經提到inode將會記錄文件的屬性、權限和該文件實際內容存放信息。基本上,inode 記錄數據如下所示
- 文件的讀寫屬性(read,write,excute)
- 文件的擁有者和用戶組(owner, group)
- 文件的大小
- 文件的時間參數(ctime, atime, mtime)
- 文件的特性標識(SUID, SGID等)
- 文件實際內容的指向
除此之外,inode還有一些特點
- 每個inode的大小固定128B
- 每個文件只會有一個inode
- 文件系統建立的文件數量與inode的數量有關
- 文件系統讀取文件時要先找到inode,分析inode所記錄的權限和用戶是否相符,若符合再讀取區塊內容
可能會有一個疑問,inode的大小只有128B,但是記錄一個數據區塊就需要4B(指針的大小),好像能存儲的數據非常小,那遇到很大的文件怎么記錄呢?ext2文件系統很聰明的將記錄區塊的區域定義為12個直接,一個間接,一個雙間接,一個三間接記錄區。

我們可以計算一下一個inode最大能記錄的文件大小,以1KB的區塊為例子
- 12個直接記錄區:\(12\times 1K = 12K\)
- 1個間接記錄區:\(1K\times \frac{1K}{4B}= 256K\)
- 1個雙間接記錄區:\(1K \times (\frac{1K}{4B})^2 = 256^2K\)
- 1個三間接記錄區:\(1K\times(\frac{1K}{4B})^3 = 256^3K\)
將四個記錄相加\(12K+256K+256^2K+256^3K = 16GB\),與上文我們的表格1K對應的最大單一文件容量是相符的。
3.超級區塊(super block)
超級區塊是記錄整個文件系統相關信息的地方,主要記錄
- 數據區塊與inode的總量
- 未使用與已使用的inode與數據區塊數量
- 數據區塊與inode的大小
- 文件的掛載時間,最近一次寫入數據的時間,最近一次校驗磁盤的時間等文件系統的相關信息
- 一個有效位信息,記錄文件是否被掛載
4.文件系統描述(filesystem description)
用於描述每個區塊群組的開始和結束的區塊,和每個區段分別介於哪一個區塊之間。
5.inode和區塊對照表(inode/block bitmap)
用來記錄哪些區塊或者inode是空的,便於新建文件。在刪除文件的時候,也會將對照表中對應位置標記為未使用。
6.dumpe2fs
:查詢ext系列超級區塊信息的命令
這是我在我的雲服務器(centOS 6)上運行之后的截圖
3.Linux的XFS文件系統
為什么CentOS要從ext文件系統xfs文件系統?
ext文件系統在linux上支持度較為完整,但是在當下磁盤容量越來越大的情況下,每一次格式化都是預先分配全部的inode和區塊將會耗費大量的時間。特別是在虛擬化應用越來越廣泛的當下,作為虛擬化磁盤來源的巨型文件(單一文件都好幾十個G)也越來越常見,這種巨型文件在處理上需要考慮性能問題。因此從CentOS 7.x開始,文件系統已經轉向xfs這種適合高容量磁盤和巨型文件,且性能較佳的文件系統。
XFS文件系統
XFS文件系統也是一個日志式文件系統,在數據的分布上,分為數據區(data section),文件系統活動登錄區(log section),實時運行區(realtime section)
-
數據區(data section)
XFS的數據區和我們之前談到的ext系列一樣,包括inode,數據區塊,超級區塊等數據。這個數據區也和ext系列的快組類似,也分為多個塊組,不過xfs稱作AG(allocation groups)。並且它的inode和區塊都是需要時才進行動態分配,因此格式化操作很快。
-
文件系統活動登錄區(log section)
也稱作日志區,文件的變化會記錄下來,知道該變化完整地寫入數據區后,該條記錄才會結束。如果文件系統因為某些緣故而損壞,系統會檢驗這里,看看在系統down掉之前,文件系統正在進行的操作。這樣可以保證文件系統的一致性
因為系統所有文件操作都會記錄在這個區塊,因此這個區塊的磁盤活動非常頻繁,一般會采用SSD作為XFS的日志區。
-
實時運行區(realtime section)
當有文件要被建立時,XFS會在這個區段里面找到數個extent區塊,將文件放置在這個區塊內,等到分配結束,再寫入data section的inode和數據區塊里。