檔案系統
在理解檔案系統之前,我們先來看一下關於磁碟方面的內容。
磁碟的儲存結構
-
盤面:
一個磁碟由多個碟片組成,每個碟片都由兩面,它的每一個面都可以儲存資料,這就是盤面。
-
磁軌:
在一個盤面上會被劃分為一個一個的“圈”,這個“圈”就對應這一個個的磁軌。
-
扇區:
從盤面中心開始,延伸出兩條線,在這兩條線之間磁軌被劃分為一個個的扇形,這就是扇區。一般來說每個扇區儲存資料的容量是相同的,因此最內側的資料密度大,最外側的資料密度小。
-
磁頭:
有多少個盤面就有多少個磁頭,每個磁頭連在同一個磁臂上。
-
柱面:
其實就是磁軌,只不過是由相對位置相同的磁軌組成。
那麼如何在磁碟中定位一個扇區呢?
首先先確定在哪一個柱面,然後再選擇磁頭(也就是定位盤面),最後就可以定位扇區。這種方法稱為CHS定位法。
為什麼要先選擇柱面而不是盤面呢?
磁頭在不同柱面之間移動需要磁碟的機械臂進行大幅度的物理位移,這個過程相對較慢。當讀取連續的資料時,若是採取先盤面的方式,它需要頻繁的移動磁頭來切換磁軌,而若是採取先柱面的方式,那麼只要確定了磁軌,那麼只需要切換磁頭就可以了,沒有物理位移。
磁碟的邏輯結構
磁碟在物理上是圓形的,但是在邏輯上我們通常將它抽象為線性結構,這樣更易於管理。如下圖
這樣我們就可以將磁碟看成是一個陣列,每個扇區對應一個陣列下標。這種地址為LBA
地址。LBA
地址透過一些簡單的計算既可以得到CHS
地址。
檔案系統
一般來說訪問磁碟的基本單位是512位元組,但是依舊很小,IO次數頻繁。作業系統的檔案系統會定製的進行多個扇區的讀取,比如說1KB,2KB,4KB為單位(可以設定)。你哪怕只想讀取或修改1bit,依舊需要將4KB的資料讀取到記憶體。
但是這樣是不是浪費了記憶體空間呢?此時就誕生了一項新的技術,區域性性原理。當訪問某個資料時,它周圍的資料也有可能被訪問。
綜上,記憶體被劃分為了一個個4KB大小的空間,叫做頁框。磁碟中的檔案(尤其是可執行檔案),也是按照4KB劃分好的塊,叫做頁幀。將資料從磁碟載入到記憶體,就是將頁幀填到頁框中。
假設一個磁碟有400GB,為了便於管理。可以按照分治的思想,將400GB的空間劃分為一個個比較小的區域。這就是常說的分割槽和分組。
-
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
作業系統查詢一個檔案的時候,統一使用的都是inode編號。但是我們平時在使用的都是檔名啊,這又是為什麼呢?這是因為不僅僅檔案有inode編號,目錄也有,因為目錄也是一個檔案。inode結構體中有一個指向資料塊的指標,目錄的資料塊中放的是當前目錄下檔名和inode的對映關係。
軟硬連結
軟連結
軟連結就相當於Windows系統下的快捷方式,使用ln -s [目標檔案或目錄路徑] [軟連結檔名]
建立軟連結。
當然也可以在其他目錄下為這個程式建立一個軟連結,如下
硬連結
推薦使用
unlink [連結名稱]
去除連結(使用rm
命令同樣可以)
使用ln [目標檔案或目錄路徑] [軟連結檔名]
建立硬連結。
兩者的區別
軟連結和硬連結的核心區別就是看是否有獨立的inode
。
如上,軟連結它有自己獨立的inode
編號,可以被當作獨立的檔案看待,它儲存了所指向檔案的檔案路徑。而硬連結沒有獨立的inode,說明它一定沒有自己的屬性集合和內容集合,一定用的是其他檔案的inode和內容。也就是說,建立硬連結本質就是在指定的路徑下,新增檔名和inode編號的對映關係。
當刪除mytest
這個檔案時,ln_mytest
也就是軟連結受到了影響,而mytest_ln
並沒有受到影響,只是硬連結數目變了。說明了一個檔案檔案是否被刪除與他的硬連結數有關,當一個檔案的硬連結數變為0時,才表示他被真正的刪除。
目錄下的“.”和“..”
為什麼當我們建立一個檔案的時候它的硬連結數是1,而建立一個目錄的時候它的硬連線數是2呢?
普通檔案容易理解,就是inode和檔名本身就有一個對映關係,所以是1。既然目錄也是檔案,那麼目錄除了inode和檔名的對映關係外應該還有一個對映關係。這個對映關係就是目錄下的"."。如下圖
那“..”又是什麼意思呢?請看下圖,我們在empty
目錄下建立一個目錄。會發現它的硬連結數變成了3,進入到新建立的目錄中,發現這個目錄下的".."就是empty
目錄的inode
。這就說明“..”也是empty
目錄的硬連結。這也很好的解釋了為什麼我們執行cd ..
命令的時候能返回到上級目錄。