Linux學習筆記之Linux文件系統詳解

0x00 機械硬盤

機械磁盤由磁頭(head)、磁道(track)、柱面(cylinder)、扇區(sector)和盤片(platter)組成。其中,磁頭懸浮在盤片上,而且每張盤片上下各有一個磁頭;每張盤片的磁道數是相同的,每張盤片相同位置的磁道組成柱面;而每個磁道由數量相同的扇區組成,咱們知道離主軸越遠的扇區面積越大,而扇區大小通常爲512B,必然致使存儲密度越低,這樣作明顯浪費空間,爲了解決問題,咱們將磁盤密度改成等密度結構,這就意味着外圍磁道的扇區數量要大於內圈的數量。java

  • 物理圖

  • 邏輯圖

  • 數據讀取流程

假設目標扇區和當前磁頭位置不在同一個磁道上,首先,磁頭從一個磁道移動到另外一個磁道,同時,盤片也在旋轉,此時,雖然磁頭到達了該磁道,可是尚未到達目標扇區,所以還須要等待,最後讀取紅色區域。node

 

0x01 文件

基於上述介紹的機械磁盤,咱們如何訪問磁盤扇區?經過訪問(柱面,磁頭,扇區)肯定一個扇區,可是用戶是沒法直接訪問扇區的,操做系統將扇區抽象成文件! 所以,文件是咱們操做操做系統最小的單位。windows

2.1 文件系統設計

文件系統採用分層設計,最底層的是設備,接着是IO控制(設備驅動),基本文件系統(向設備驅動程序發出命令),文件組織模塊(負責文件的邏輯塊和物理塊,以及管理空閒空間),邏輯文件系統(管理元數據)spa

 

2.2 文件系統的實現

文件系統的實現包括磁盤結構和內存結構,即咱們將文件以什麼結構存儲於磁盤,以什麼結構存儲於內存。操作系統

  • 磁盤結構

這裏以Linux中的Ext2的磁盤結構爲例,須要注意的是咱們須要對硬盤進行格式化生成以下圖所示的磁盤結構。其中,主引導扇區(0柱面、0磁頭、1扇區,大小爲512B)由MBR(Main Boot Record,主引導記錄,大小爲446B)和各個分區組成。MBR又包含位於磁盤最前邊的一段引導代碼即Boot Loader、磁盤分區表和魔數。磁盤分區表記錄的是分區信息,魔數指定哪一個分區爲活動分區,也就是說把控制權交給這個活動分區的操做系統。須要注意的是圖中我只化了2個分區,而在實際狀況下咱們最多能夠化4個分區,這裏說明一下爲何最多隻能化4個分區,咱們知道一個扇區的大小是512B,其中主MBR就佔用了446B,結束標誌佔用2B,因此分區表的大小就只有64B,而每一個分區信息用16B表示,所以硬盤只能劃分爲4個主分區。設計

因爲每一個分區均可以安裝操做系統,所以每一個分區中都有引導塊,引導塊是包含引導操做系統所須要的信息。因爲分區容量很大,所以,咱們會將分區進一步劃分爲各個塊組,塊組包含超級塊、塊組描述、磁盤塊位圖、inode位圖、inode表以及數據塊,其中,超級塊(superblock)描述的是整個分區的詳細信息,如分區的塊數、塊的大小、空閒塊的數量和指針、空閒FCB的數量和指針,須要注意的是同一個分區中的塊組中的超級塊信息是同樣的,只有塊組0 的超級塊會被加載到內存,並且因爲每一個塊組都保留超級塊信息,保證了磁盤高可用;塊組描述記錄inode表的起始位置、數據塊的起始位置、空閒inode表和空閒數據塊;磁盤塊位圖管理的是空閒磁盤塊;inode位圖管理空閒的inode;inode表存放inode信息。3d

 

  • 內存結構

 咱們每次打開一個文件,即open 文件,須要發起操做系統調用,系統調用會查看一個表:系統範圍打開的文件表,每一個進程會維護打開的文件表,索引號指向的是系統範圍打開的文件表,這個索引號在Linux上稱爲文件描述符,在windows上稱爲文件句柄。指針

 

 

0x02 文件存儲

3.1 連續存儲blog

  • 順序訪問速度快,隨機訪問速度也快,例如:訪問Hello.java,磁頭定位到編號爲1的磁盤塊,接着順序讀取編號爲二、3磁盤塊。可是,容易出現碎片。
  • 注意:圖中的每一塊表示邏輯塊

 

3.2 鏈式存儲

  • 增、刪內容很快;
  • 順序訪問速度還好,可是隨機訪問速度很慢。

 

 

3.3 折中方案 - 索引存儲

因爲連續存儲和鏈式存儲都存在一些缺點,所以咱們的先輩們想出了一個折中方案即索引存儲。首先有一個磁盤塊(索引節點)不存實際數據,它存放的是元數據和這些數據應該存放在哪些磁盤塊的信息。例以下圖中的索引節點20,它存放的元數據包含權限、全部者和時間戳,數據信息包含磁盤一、三、十二、1三、19。索引

  • 優勢:順序訪問和隨機訪問速度很快
  • 缺點:須要一個額外的空間,即索引節點存儲了大量的信息。

 

經過一個索引節點是否是能夠解決全部問題呢?因爲一個節點的大小是有限的,當出現一個特別大的文件,一個索引節點不放不了這麼多磁盤塊信息,那應該怎麼辦?咱們將索引節點劃分爲若干個區域,元數據區域保持不變,磁盤索引區域劃分爲直接塊和間接塊,直接塊表示經過索引直接找到數據塊,間接塊表示索引指向的是另外一個索引節點。

0x03 文件讀取過程

以查找/tmp/Test.log爲例,首先獲取根目錄/的inode號,通常狀況下根目錄的inode號是固定的,假設爲1,經過inode號找到根目錄屬性和它的磁盤塊,而後從硬盤中讀取第405磁盤塊,該磁盤塊內容中包含tmp的inode號,以此類推,最終找到Test.log的磁盤塊。

相關文章
相關標籤/搜索