linux文件系統之文件系統介紹

前言

如何快速高效的尋到在硬盤存儲的數據,於是文件系統就誕生了。文件系統是邏輯層面的,那麼文件系統是如何管理好硬件層提供的磁盤空間的?

文件系統的技術方案

  • 1.連續分配 創建文件時,分配一組連續的數據塊。然後再單獨的地方存儲文件信息
  • 2.鏈式分配 將文件塊像鏈表一樣管理起來,每個塊放指針,指針指向下一個文件塊位置
  • 3.索引分配 通過文件索引找到存放文件的信息的數據塊(數據庫中有文件名,數據塊位置等),然後再找到數據塊的位置

現在,大部分文件系統採用索引分配方案
優點:
1.能夠保持好大部分文件的局部性
2.滿足文件插入,刪除的高效
3.隨機讀寫不需要沿着指針前行
缺點
1.會有較多的磁盤尋道次數
2.索引表本身管理複雜,會帶來額外的系統開銷

ext2文件系統

ext類有ext2、ext3、ext4文件系統,是ext類版本的升級
這裏介紹ext2文件系統,當然它是屬於索引分配的

基本概念

  1. 塊. 即Block, 數據存儲的最小單元, 每個塊都有一個唯一的地址, 從0開始編號, 起源於第一個可以用來存儲數據的扇區
  2. 超級塊. 超級塊保存了各種文件系統的meta信息, 比如塊大小信息。他位於文件系統的2號和3號扇區(物理地址), 佔用兩個扇區大小
  3. 塊組. 所有的塊會劃分成多個塊組, 每個塊組包含同樣多個塊, 但是可能整個文件系統整個塊數不是塊組的整數倍, 所以最後一個塊組包含的個數可能會小於其他塊

總體結構

文件系統
1.DataBlock 數據塊
即Block, 數據存儲的最小單元, 每個塊都有一個唯一的地址, 從0開始編號, 起源於第一個可以用來存儲數據的扇區;

2.inode Table inode節點表
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信息

  1. 塊大小, 每個塊組包含塊數, 總塊數, 第一個塊前保留塊數, inode節點數, 每個塊組的inode節點數
  2. 卷名, 最後掛載時間, 掛載路徑, 文件系統是否乾淨, 是否要調用一致性檢查標識
  3. 空間inode節點和空閒塊的記錄信息, 在分配inode節點和新塊的時候使用

7.0-1扇區 引導扇區
如如果沒有引導代碼,則這兩個扇區爲空,全部用0填充

總結

內容很多,剛剛這一遍下來,其實心裏還沒有清楚每一個區塊的作用,還需要實際的例子來演示一把,由於怕篇幅過長,就放到下一篇啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章