Linux磁盤、Ext文件系統、目錄樹

硬盤組成與讀寫


 

硬盤,拆過機的同志應該知道就是一塊小剛體嘛。拆過主機硬盤和筆記本硬盤也應該知道不一樣的硬盤的接口是不同的,主機的硬盤通常會有一條線鏈接到主板而筆記本的硬盤直接有插槽。這個概念只是爲了引發硬盤有不一樣的種類存在,當咱們在linux系統中輸出命令fdisk -l的時候,大體會有設備名稱等信息。其中有可能有/dev/sd[a-p][1-15]或者/dev/hd[a-d][1-63]等等,前者表示SCSI,SATA,USB等接口的磁盤文件名,後者表示IDE接口磁盤文件名(這個比較老了)。html

磁盤會有多個概念,爲了方便理解,先設定一個場景,假定咱們在吃雞遊戲的地圖上,這個地圖只有一個圓柱大樓,每層樓都是一個環形操場跑道。node

  • track磁道,就是操場上的某一條跑道。
  • cylinder柱面,就是縮毒的時候毒邊界所在的跑道,這指的是每層樓的處在毒邊界的跑道。
  • Sector扇區,就是若是把跑道劃成不一樣小格的話,這麼說吧,就是把環形甜甜圈切成好多小塊,每一個小塊近似於小矩形,這個矩形就是扇區。
  • Head磁頭,如上圖就是每層樓都有一隻手臂讀取某一跑道上的數據。

這是個人電腦的磁盤分佈,一個扇區是512bytes,一次io讀取是8個扇區能讀到4KB。總的容量很明顯是由255盤面*n柱面*m扇區(512bytes)構成的。linux

磁盤是如何讀取數據的呢,咱們知道買磁盤是有轉速指標的,因此咱們能夠設想磁頭不動當靠旋轉就能夠得到某柱面的全部磁道的數據。其實磁盤IO步驟就是如此。git

  1. 尋道時間,磁頭徑向移動到達指定的磁盤位置
  2. 旋轉延遲,等到指定的扇區到達磁頭下
  3. 存取時間,讀取目標扇區的數據

時間花費,1w轉的磁盤旋轉一圈是不到6ms,存取也就是零點幾毫秒否則磁盤都轉過去了是否是還要等一圈再來讀取。。因此咱們能夠猜到尋道時間是最長的大概是3-15ms。github

所以進行磁盤分區的時候,咱們劃分標準是以柱面做爲分區partition的最小單位。否則按照盤面來分區,那尋道時間的比重會增長天然增長了IO時間。能夠看到上圖,按照扇區連續性進行了分區。數據庫

咱們應該清楚,如今只是分區完成,每個區能夠有本身獨立的文件系統進行管理它所分配到的區域。有不一樣的文件系統體制,咱們假定分配到的區域每一扇區給個序號從1到100。對於FAT格式,一個文件表示形式是鏈表的樣式,多是8->6->7->67->5等等,對於ext2格式,它將1-4做爲一個inode的節點表明了一個文件,存儲了這個文件的實際數據存儲的block序號(5,6,7,8,67),咱們成爲索引式文件系統。緩存

以上說的概念能夠這麼理解,地球就是一塊硬盤,每個國家就是一個分區,每個國家本身的文件系統格式能夠是資本主義也能夠是社會主義。spa

 

Ext2文件系統(inode)


 

雖然咱們標題說的是Ext2文件系統,可是圖片放的是Ext4文件系統,區別只是GDT而已,爲了跟進時代加進來無妨。操作系統

先談談該圖的整體概念,Entire disk=MBR+Partition table+Partitions.  Partition=boot sector+block group.  block group=super lock+Group Descriptors+Reserved GDT Blocks+Data Block Bitmap+inode Bitmap+inode Table+Data Blocks.設計

其實這裏設計到了啓動操做系統的過程,這個之後再詳細描述。大概思路是當咱們通過了通電自檢等進入BIOS到指定到磁盤啓動,第一扇區是MBR和Partition table,分區表只有64B,咱們知道磁盤分區最低單位是柱面,柱面範圍是0-255,八個bit就能夠表示,因此16B表示一個分區範圍。一個磁盤理論上只能四個分區,因此爲了拓展容許有3個主分區和一個擴展分區,這個擴展分區能夠擁有多個邏輯分區。那麼咱們分好的每個分區就是一個文件系統了。每個分區都預留的boot sector是載入操做系統內核的引導代碼,它的副本將放在MBR中,固然說雙系統你可能更容易理解,每一個分區能夠指定一個系統,可是隻有一個boot loader能放在MBR中,其中linux的boot loader能夠釋放權限加載別的文件系統的boot sector從而加載雙系統了。

並且實際並非每個Block Group都是如此排布,太多super block說實話浪費空間,冗餘的超級塊和組描述符的副本只保留在組號爲 0 或組號爲 3,5,7 的倍數的塊組中。同時還會有純粹的數據存儲塊,只有後四者。

  • 圖中Group 0 padding 只存在於Block Group 0 中,實際上它就是boot sector
  • Super Block,記錄整個文件系統相關的信息,是整個文件系統的首腦。記錄了inode、block等信息包括修改掛載時間等。因此它有備份Block。
  • Group Descrptor,文件系統描述符,具體記錄inode的位置範圍,block的位置範圍等

  • Reserved GDT Blocks。用於文件系統將來的拓展 
  • Data Block Bitmap。用於記錄塊組內部數據塊的使用狀況。
  • inode Bitmap。用於記錄 inode table 中的 inode 的使用狀況。
  • inode table。每個文件的meta信息就是一個inode,這個table表示該塊內能指示的全部文件表。
  • Data Block。文件的meta信息指向的實際存儲內容數據段。

超級塊信息

Group Block,注意信息有所不一樣

G0是起始的primary superblock,G1是存有super block,G2是純粹數據存儲。

 

inodeTable

  • 每個文件僅佔有一個inode而已。文件系統可以建立的文件數量和inode的數量有關係。
  • 一個inode文件信息中,包括了訪問的模式權限,全部者和組,大小,create time,access time,last modification time,deletion time,pointer,flag等。其中時間屬性在原來ext3以前是32bytes,後來進行擴展到64bytes,使得有效時間從2038延長到了2466年。
  • 就算是ext4中inode節點達到了256B(之前是128B),彷佛也沒法記錄該文件中那麼多block節點,因此前12個是直接block索引,而後還有間接、雙間接、三間接索引,原理就是以block存儲block。因此看圖大概能明白。

Block data

這是block塊的一種線性目錄結構,它表述了存儲的特殊數據表示格式,例如是目錄文件的block,它將目錄下的文件名及其對應的inode號記錄在目錄的block中。

 

目錄樹


 

咱們知道目錄也是一個文件,一個文件的文件名由目錄文件存儲,文件系統新建一個目錄時會分配一個inode與至少一個block給該目錄,inode記錄目錄的相關權限和屬性,分配到的block記錄目錄下的文件名和該文件名佔用的inode號碼信息。因此indoe自己不記錄文件名,文件名記錄在目錄的block中,所以新增/刪除/重命名文件名與目錄的w權限有關。那麼由於文件名記錄在目錄的block中,所以當咱們要讀某一個文件,必須通過目錄的inode與block而後才能找到哪一個待讀取的文件的inode才能讀到block數據。

目錄樹是由根目錄讀起,系統經過掛載點的掛載信息就能夠找到掛載點的inode號碼,一般一個文件系統的最頂層indoe號碼是2(1是指向不佔空間的proc目錄),而後經過根目錄一層層往下讀。

如圖咱們訪問/etc/passwd須要經過/+rx權限(r是讀,x是進入該目錄)而後一步步找到下一個inode節點。

 

 

其餘


 

  • Ext3文件系統加入了日誌文件系統,有點像數據庫的日誌模式,當系統要寫入文件數據以前先記錄,而後實際寫入,跟新中間數據(super block等),結束後再日誌中寫上完成。
  • 文件系統的操做通常會有緩存,是爲了不頻發的IO,能夠經過sync強迫內存中設置爲Dirty的文件回寫到磁盤。
  • 掛載點,一個文件系統和目錄樹結合的操做成爲掛載,掛載點必定是目錄,該目錄爲進行該文件系統的入口。以下圖,不一樣的目錄對應inode都爲初始的2,是不一樣的文件系統。

  • VFS

 

 

參考

磁盤、分區及Linux文件系統 [Disk, Partition, Linux File System]

Ext4 文件系統簡要總結

相關文章
相關標籤/搜索