[Linux]檔案系統

羡鱼OvO發表於2024-11-28

檔案系統

在理解檔案系統之前,我們先來看一下關於磁碟方面的內容。

磁碟的儲存結構

[Linux]檔案系統 [Linux]檔案系統

  1. 盤面:

    一個磁碟由多個碟片組成,每個碟片都由兩面,它的每一個面都可以儲存資料,這就是盤面。

  2. 磁軌:

    在一個盤面上會被劃分為一個一個的“圈”,這個“圈”就對應這一個個的磁軌。

  3. 扇區:

    從盤面中心開始,延伸出兩條線,在這兩條線之間磁軌被劃分為一個個的扇形,這就是扇區。一般來說每個扇區儲存資料的容量是相同的,因此最內側的資料密度大,最外側的資料密度小。

  4. 磁頭:

    有多少個盤面就有多少個磁頭,每個磁頭連在同一個磁臂上。

  5. 柱面:

    其實就是磁軌,只不過是由相對位置相同的磁軌組成。

那麼如何在磁碟中定位一個扇區呢?

首先先確定在哪一個柱面,然後再選擇磁頭(也就是定位盤面),最後就可以定位扇區。這種方法稱為CHS定位法。

為什麼要先選擇柱面而不是盤面呢?

磁頭在不同柱面之間移動需要磁碟的機械臂進行大幅度的物理位移,這個過程相對較慢。當讀取連續的資料時,若是採取先盤面的方式,它需要頻繁的移動磁頭來切換磁軌,而若是採取先柱面的方式,那麼只要確定了磁軌,那麼只需要切換磁頭就可以了,沒有物理位移。

磁碟的邏輯結構

磁碟在物理上是圓形的,但是在邏輯上我們通常將它抽象為線性結構,這樣更易於管理。如下圖

[Linux]檔案系統

這樣我們就可以將磁碟看成是一個陣列,每個扇區對應一個陣列下標。這種地址為LBA地址。LBA地址透過一些簡單的計算既可以得到CHS地址。

檔案系統

一般來說訪問磁碟的基本單位是512位元組,但是依舊很小,IO次數頻繁。作業系統的檔案系統會定製的進行多個扇區的讀取,比如說1KB,2KB,4KB為單位(可以設定)。你哪怕只想讀取或修改1bit,依舊需要將4KB的資料讀取到記憶體。

但是這樣是不是浪費了記憶體空間呢?此時就誕生了一項新的技術,區域性性原理。當訪問某個資料時,它周圍的資料也有可能被訪問。

綜上,記憶體被劃分為了一個個4KB大小的空間,叫做頁框。磁碟中的檔案(尤其是可執行檔案),也是按照4KB劃分好的塊,叫做頁幀。將資料從磁碟載入到記憶體,就是將頁幀填到頁框中。

假設一個磁碟有400GB,為了便於管理。可以按照分治的思想,將400GB的空間劃分為一個個比較小的區域。這就是常說的分割槽和分組。

[Linux]檔案系統
  • Boot Block(啟動塊):是計算機磁碟(如硬碟、軟盤等)上的一個特殊區域,它包含了啟動計算機系統所需的初始指令。大小是確定的。

  • Block Group:檔案系統會根據分割槽的大小劃分為數個Block Group。而每個Block Group都有著相 同的結構組成。

  • Super Block(超級塊)::存放檔案系統本身的結構資訊。記錄的資訊主要有:bolck 和 inode的總量, 未使用的 block 和 inode 的數量,一個 block 和 inode 的大小,最近一次掛載的時間,最近一次寫入資料的 時間,最近一次檢驗磁碟的時間等其他檔案系統的相關資訊。Super Block的資訊被破壞,可以說整個 檔案系統結構就被破壞了。

  • Group Descriptor Table(組描述符表):這個描述符包含塊組的起始塊號(即該塊組從磁碟的哪個物理塊位置開始)、塊組內的塊點陣圖(Block Bitmap)的位置,塊點陣圖用於標記塊組內每個塊的使用狀態(是已使用還是空閒)。

  • Block Bitmap(塊點陣圖):記錄著Data Block中哪個資料塊已經被佔用,哪個資料塊沒 有被佔用。

  • inode Bitmap(inode點陣圖):每個位(bit)對應一個 inode。如果位的值為 1,表示對應的 inode 已被使用;如果位的值為 0,則表示對應的 inode 是空閒的。

  • inode Table:儲存了分組內部所有可用(已使用+未使用)的inode。inode table 中的每個 inode 通常包含多個欄位。其中有檔案模式(File Mode)欄位,用於表示檔案是普通檔案、目錄、符號連結還是其他特殊檔案型別;還有使用者識別符號(UID)和組識別符號(GID)欄位,用於標識檔案的所有者和所屬組;檔案大小(File Size)欄位記錄檔案內容的位元組數;時間戳(Timestamp)欄位,包括檔案的建立時間、最後修改時間和最後訪問時間。

  • Data Blocks:儲存的是分組內部所有檔案的資料塊。

Inode

[Linux]檔案系統

作業系統查詢一個檔案的時候,統一使用的都是inode編號。但是我們平時在使用的都是檔名啊,這又是為什麼呢?這是因為不僅僅檔案有inode編號,目錄也有,因為目錄也是一個檔案。inode結構體中有一個指向資料塊的指標,目錄的資料塊中放的是當前目錄下檔名和inode的對映關係。

軟硬連結

軟連結

軟連結就相當於Windows系統下的快捷方式,使用ln -s [目標檔案或目錄路徑] [軟連結檔名]建立軟連結。

[Linux]檔案系統

當然也可以在其他目錄下為這個程式建立一個軟連結,如下

[Linux]檔案系統

硬連結

推薦使用unlink [連結名稱]去除連結(使用rm命令同樣可以)

使用ln [目標檔案或目錄路徑] [軟連結檔名]建立硬連結。

[Linux]檔案系統

兩者的區別

軟連結和硬連結的核心區別就是看是否有獨立的inode

[Linux]檔案系統

如上,軟連結它有自己獨立的inode編號,可以被當作獨立的檔案看待,它儲存了所指向檔案的檔案路徑。而硬連結沒有獨立的inode,說明它一定沒有自己的屬性集合和內容集合,一定用的是其他檔案的inode和內容。也就是說,建立硬連結本質就是在指定的路徑下,新增檔名和inode編號的對映關係。

[Linux]檔案系統

當刪除mytest這個檔案時,ln_mytest也就是軟連結受到了影響,而mytest_ln並沒有受到影響,只是硬連結數目變了。說明了一個檔案檔案是否被刪除與他的硬連結數有關,當一個檔案的硬連結數變為0時,才表示他被真正的刪除。

目錄下的“.”和“..”

為什麼當我們建立一個檔案的時候它的硬連結數是1,而建立一個目錄的時候它的硬連線數是2呢?

[Linux]檔案系統

普通檔案容易理解,就是inode和檔名本身就有一個對映關係,所以是1。既然目錄也是檔案,那麼目錄除了inode和檔名的對映關係外應該還有一個對映關係。這個對映關係就是目錄下的"."。如下圖

[Linux]檔案系統

那“..”又是什麼意思呢?請看下圖,我們在empty目錄下建立一個目錄。會發現它的硬連結數變成了3,進入到新建立的目錄中,發現這個目錄下的".."就是empty目錄的inode。這就說明“..”也是empty目錄的硬連結。這也很好的解釋了為什麼我們執行cd ..命令的時候能返回到上級目錄。

[Linux]檔案系統

相關文章