前言
如何快速高效的尋到在硬盤存儲的數據,於是文件系統就誕生了。文件系統是邏輯層面的,那麼文件系統是如何管理好硬件層提供的磁盤空間的?
文件系統的技術方案
- 1.連續分配 創建文件時,分配一組連續的數據塊。然後再單獨的地方存儲文件信息
- 2.鏈式分配 將文件塊像鏈表一樣管理起來,每個塊放指針,指針指向下一個文件塊位置
- 3.索引分配 通過文件索引找到存放文件的信息的數據塊(數據庫中有文件名,數據塊位置等),然後再找到數據塊的位置
現在,大部分文件系統採用索引分配方案
優點:
1.能夠保持好大部分文件的局部性
2.滿足文件插入,刪除的高效
3.隨機讀寫不需要沿着指針前行
缺點
1.會有較多的磁盤尋道次數
2.索引表本身管理複雜,會帶來額外的系統開銷
ext2文件系統
ext類有ext2、ext3、ext4文件系統,是ext類版本的升級
這裏介紹ext2文件系統,當然它是屬於索引分配的
基本概念
- 塊. 即Block, 數據存儲的最小單元, 每個塊都有一個唯一的地址, 從0開始編號, 起源於第一個可以用來存儲數據的扇區
- 超級塊. 超級塊保存了各種文件系統的meta信息, 比如塊大小信息。他位於文件系統的2號和3號扇區(物理地址), 佔用兩個扇區大小
- 塊組. 所有的塊會劃分成多個塊組, 每個塊組包含同樣多個塊, 但是可能整個文件系統整個塊數不是塊組的整數倍, 所以最後一個塊組包含的個數可能會小於其他塊
總體結構
1.DataBlock 數據塊
即Block, 數據存儲的最小單元, 每個塊都有一個唯一的地址, 從0開始編號, 起源於第一個可以用來存儲數據的扇區;
2.inode Table inode節點表
- 每個inode會被分配給一個目錄或者一個文件,每個inode包含了128字節,文件的各種meta信息
- 在所有inode中, 1~10號會用作保留給內核使用, 在這些保留節點中, 2號節點用於存儲根目錄信息, 1號表示壞塊, 8號表示日誌文件信息。
- 第一個用戶可見的都是從11號inode開始, 11號節點一般用作lost+found目錄, 當檢查程序發現一個inode節點已經被分配, 但是沒有文件名指向他的時候, 就會把他添加到lost+found目錄中並賦予一個新的文件名
文件項
- inode編號、文件類型、屬主UID、屬主的組GID、文件大小、文件所使用的磁盤塊的實際數目、時間、以及數據塊的信息
注:inode中沒有文件名,只能通過inod找到;stat命令可以查看
目錄項
-
每個目錄對應一個inode節點,該inode節點對應的數據塊裏面會存儲該目錄下所有文件和目錄的信息(meta)
-
每個文件/目錄對應的信息就叫目錄項, 目錄項包含的內容也很簡單, 主要就是文件名和指向該文件名的inode指針, 詳細信息如下
偏移(16進制) | 字節數 | 含義&解釋 |
---|---|---|
00-03 | 4字節 | inode節點號 |
04-05 | 2字節 | 本目錄項的長度字節數 |
06 | 1字節 | 名字長度字節數 |
07 | 1字節 | 文件類型 |
08~ | 不定長度 | 名字的ascii碼 |
3.inode bitmap inode節點位圖
- 由於一個文件系統中會有許多的文件和目錄,都需要inode。那麼如何知道哪些inode塊分配過了,哪些inode塊可使用,就需要遍歷一遍inode Table,爲了提高效率,使用位圖,將已分配的inode映射到bitmap中。
- 默認inode節點位圖和一個數據塊的大小一樣
4.block bitmap 數據塊位圖
- 同樣,那麼多的數據塊爲了方便管理,使用數據塊位圖,默認數據塊位圖和一個數據塊的大小一樣
5.GDT Group Description table 塊組描述表
- 往往會將一個分區,分成多個塊組,也是爲了文件系統內部有方便管理。
- 組描述符表中包含了所有組描述信息,每個塊組佔據32個字節。
- 組描述符在每個塊組中都會備份,但也有特殊情況,只在當塊組號是3,5,7的冪的塊組才保存(稀疏超級塊)
- 數據塊位圖,inode節點位圖,inode節點表的起始位置都在組描述符中表示
偏移(16進制) | 字節數 | 含義&解釋 |
---|---|---|
00~03 | 4 | 塊位圖起始地址(塊號) |
04~07 | 4 | inode節點位圖起始地址(塊號) |
08~0B | 4 | inode節點表起始地址(塊號) |
0C~0D | 2 | 塊組中空閒塊數 |
0E~0F | 2 | 塊組中空閒inode節點數 |
10~11 | 2 | 塊組中的目錄數 |
12~1F | - | 未使用 |
6.Super block超級塊
2-3號扇區(在文件系統第1024-2048字節處),包含各種meta信息
- 塊大小, 每個塊組包含塊數, 總塊數, 第一個塊前保留塊數, inode節點數, 每個塊組的inode節點數
- 卷名, 最後掛載時間, 掛載路徑, 文件系統是否乾淨, 是否要調用一致性檢查標識
- 空間inode節點和空閒塊的記錄信息, 在分配inode節點和新塊的時候使用
7.0-1扇區 引導扇區
如如果沒有引導代碼,則這兩個扇區爲空,全部用0填充
總結
內容很多,剛剛這一遍下來,其實心裏還沒有清楚每一個區塊的作用,還需要實際的例子來演示一把,由於怕篇幅過長,就放到下一篇啦