1. 程式人生 > >對Inode、Hard Link以及Soft Link的理解

對Inode、Hard Link以及Soft Link的理解

第一個 nbsp 圖1 lock image pla files 地址 logs

一、EXT2/EXT3等文件系統的分區格式

  Linux的文件系統從EXT2開始將文件的屬性和文件的實際內容分開存儲,文件的屬性由inode存儲,文件的內容由block存儲。

  系統在對磁盤進行分區格式化的時候,分區被以block大小為單位分割成多個塊,block的大小可以為1KB、2KB或4KB;分區裏的各個塊被統一編號,然後被劃分成各個區域,圖1描述了一個分區的劃分情況:

技術分享

圖1 分區劃分情況

  各區域解釋:

  Boot Sector:啟動扇區,利用這個多個分區的啟動扇區可以實現多系統。

  Block Group:區塊群組,由於文件系統可能很大,達到上百GB,將所有的inode和block放在一起管理是不明智的;因此ext2/ext3等文件系統將分區內的inode和block分成多個區塊群組(Block Group),分開管理;區塊群組內包含Super Block、Partition Description、Block Bitmap、Inode BitMap、Inode Table、Data Block;其中Super Block在第一個區塊群組內一定存在,在後續的區塊群組內則可能存在也可能不存在,如果存在,則是作為第一個區塊群組內的Super Block的備份。

  Filesystem Description:分區文件系統的描述區塊,用於描述各個Block Group開始與結束的block塊號,以及描述每個Block Group內各個區段的開始與結束的block塊號。

  Block BitMap:block位圖,用於判斷Data Block內哪些Block已經被使用,哪些Block處於空閑狀態可以使用。

  Inode BitMap:inode位圖,用於判斷Inode Table內哪些inode已經被使用,哪些inode處於空閑狀態可以使用。

  Inode Table:inode表,用於存放inode,各個inode也被統一編號。

  Data Block:

用於保存文件以及目錄實際內容的block。

二、EXT2/EXT3等文件系統中目錄與文件的存儲

  在ext2/ext3等文件系統中,目錄的存儲和文件的存儲形式差別不大:每一個目錄和文件都對應一個inode,每個inode都指向一個或多個block;目錄的inode指向的block內存儲的是目錄下的子目錄名或文件名與相應的inode的對應關系,如圖2中2號和65531號等inode;文件的inode指向的block存儲文件的實際內容,如圖2中787883號和788042號等inode。

  圖2是根據一個實際的Linux系統作出的一個示意圖,圖中的淡綠色區域代表圖1中的Inode Table區域,淡藍色區域代表圖1中的Data Block區域,圖中塊的大小和塊的數量不代表實際情況。這個文件系統掛載到了“/”目錄上,一般一個文件系統最頂層的inode編號為2,這裏2號inode指向的block區域中存儲了“/”目錄下的子目錄名以及文件名和它們對應的inode編號,其中的“vmlinuz.old”是一個軟鏈接文件,它對應的inode指向的block存儲了所鏈接的文件的相對的路徑。

技術分享

圖2 文件系統存儲方式示意圖

三、軟鏈接與硬鏈接

  如上所述,每個目錄或文件都對應一個inode,但是它們對應的Inode也有可能為同一個inode;在同一個文件系統中,如果兩個或多個文件的Inode相同,則可以稱它們互為彼此的“硬鏈接”。

  硬鏈接是某個目錄的inode指向的block區域中的一條記錄,這個記錄的inode部分的值與相同文件系統內的某個目錄下的一條或多條記錄的inode部分的值相同。因而,創建一個硬鏈接就是在某個表中增加一條記錄,不會消耗inode,一般也不會消耗block的數量,除非當前存儲記錄的block滿了,重新找一塊block來記錄這條記錄。

  對於硬鏈接有兩個地方值得註意:

  1.硬鏈接不能跨文件系統:一般情況下,Linux系統不能區分來自不同文件系統的相同的Inode編號,一個文件的Inode號碼只能是自己所在的文件系統內的Inode的編號。例外的情況是掛載點的Inode,當一個文件系統掛載到某個掛載點時,系統會屏蔽其原有的Inode,然後記錄這個掛載點和文件系統的對應關系,當使用到這個掛載點時,系統能根據記錄找到正確的文件系統。

  2.不能創建目錄的硬鏈接:從圖2中看,在某一個目錄的Block塊中增加一條記錄,該記錄的Inode編號為某個目錄的Inode編號是可行的,但是這樣有可能在文件樹中形成環,導致很多依賴遍歷文件樹的程序無限循環下去,因此目前為止,不能創建目錄的硬鏈接。

  圖2中,“/home/”目錄下的.bashrc文件和hard_bashrc文件指向同一個Inode:788041,hard_bashrc是在“/home”目錄下通過命令:”ln .bashrc hard_bashrc“建立的。

  軟鏈接是一個新的文件,該文件中記錄了一個文件或目錄的路徑。如果查看軟鏈接文件的大小,會發現為它記錄的路徑字符串的大小。創建一個軟鏈接會生成一個新的文件,因此會消耗inode和block的數量。

  軟鏈接文件會被標記為“鏈接文件”,程序使用它時,會根據它記錄的路徑去找到真正的文件;因此既可以創建目錄的軟鏈接也可以跨文件系統創建軟鏈接。

  圖2中“/home/“目錄下的”soft_bin“文件為“/bin”這個目錄的軟鏈接,這個文件是在“/home/”目錄下通過命令:“ln -s /bin ./soft_bin"創建的。

本文更新地址:http://www.cnblogs.com/hc101/p/7257507.html

對Inode、Hard Link以及Soft Link的理解