Linux 鏈接文件

一、簡介

1、在Linux中有兩種鏈接文件,一種叫做硬鏈接,它是在某個目錄下新建一個文件名鏈接到某inode號碼的關聯記錄而已,注意,它只是通過文件系統的inode鏈接來產生新的文件名,而不是產生新的文件;而另一種是類似Windows中的快捷方式功能的文件,它是創建一個獨立的文件,而這個文件會讓數據的讀取指向它鏈接的那個文件的文件名,叫做符號鏈接。

二、硬鏈接

1、由Ext2文件系統我們知道每個文件都會佔用一個inode,文件的內容由inode指向的block來保存。要讀取文件的內容,需要通過目錄記錄的文件名來指向到該文件的inode,從而讀取文件內容。

硬鏈接就是多個文件名對應到同一個inode號碼。如下圖,目錄/tmp/ln01的inode號碼是11號,該inode指向的block中存有一個叫做/tmp/ln01/passwd的文件名,該文件名的inode號碼是33號,33號的inode指向的block就是直接保存了文件內容。現在有一個叫做/tmp/ln02的目錄,該目錄的inode號碼是22號,22號inode指向的block中保存了一個叫做/tmp/ln02/passwd_hd的文件名,而該文件名的inode號碼也恰恰是33號,與/tmp/ln01/passwd文件名的inode號碼一樣,這兩個文件名都對應了同一個inode號碼,所以這兩個文件名就是鏈接到同一個文件內容了,這就是硬連接。

2、創建硬鏈接及硬連接的特性

創建硬鏈接的方式爲:ln 源文件 產生的鏈接文件。如上圖所示,/tmp/ln02/passwd_hd是創建的一個硬鏈接,它只是在/tmp/ln02目錄下添加一個/tmp/ln02/passwd_hd的文件名而已,只是這個文件名的inode號碼是已經存在了的33號inode,只要在加入這個文件名時,/tmp/ln02目錄的block還能夠存儲該文件名,就不會爲/tmp/ln02目錄增加額外的block來存儲該目錄中的文件名,此時創建的硬鏈接就不會額外增加新的inode和block。但是如果在/tmp/ln02目錄中加入該文件名時恰恰使得/tmp/ln02目錄的block不夠存儲/tmp/ln02目錄下的文件名時就會增加額外的block來存儲/tmp/ln02目錄中的文件名,這時候創建的硬鏈接纔會增加額外的block。如下圖:

創建了硬鏈接文件/tmp/ln02/passwd_hd,它與文件/tmp/ln01/passwd的inode都是1317167號,且注意觀察,這兩個文件除了文件名不一樣之外,其它信息都是一樣的,因爲它們鏈接到同一個inode。文件屬性中所屬用戶前面那個數字就是代表有多少個文件名鏈接到這個inode號碼,可以發現在創建了硬連接後該數字由1變成了2。且創建了該硬連接之後,該文件系統的inode使用情況和bock的容量使用情況都沒有發生改變。

硬連接除了以上的特性之外,還有如下的特性:

  • 不能跨文件系統;
  • 不能鏈接到目錄;因爲如果是鏈接到目錄,則除了目錄外,目錄中的所有文件都還需要做鏈接。
  • 如果有多個文件名鏈接到同一個inode,刪除任何一個文件名後,只要還有文件名鏈接到該inode,那麼該inode和inode指向的block都還是存在的,還可以通過另一個文件名來讀取數據。
  • 不論使用哪個文件名來對文件內容進行編輯,最終結果都會寫入到相同的block中,所以都能進行數據的修改。

三、符號鏈接

1、符號鏈接會創建一個獨立的文件,這個文件會讓數據的讀取指向它鏈接的那個文件的文件名。如下圖所示,創建了一個符號鏈接文件/tmp/ln02/passwd_so,它鏈接到/tmp/ln01/passwd文件,在創建該符號鏈接文件時,它會在該文件所在的目錄/tmp/ln02的block中增加該符號鏈接的文件名,併爲該文件分配新的inode(44號),然後還會爲該inode(44號)分配新的block,該block中就保存了符號鏈接所真正鏈接的文件的文件名,所以就會指向真正鏈接的文件的文件名所在的目錄的inode(11號),因爲要讀取某個文件類型,需要通過目錄記錄的文件名來指向到該文件的inode,從而讀取文件內容嘛。

2、符號鏈接的創建及特性

創建符號鏈接的方式爲:ln -s 源文件 產生的鏈接文件。如下圖所示,從結果中就能發現/tmp/ln01/passwd和/tmp/ln02/passwd_so兩個文件分別指向了不同的inode號碼,所以它們是兩個獨立的文件存在,系統爲符號鏈接文件/tmp/ln02/passwd_so分配了新的inode和block,系統的inode和block使用情況均發生了變化。而且符號鏈接文件/tmp/ln02/passwd_so的右邊寫上了目標文件的文件名/tmp/ln01/passwd。這時從44號inode讀取到鏈接文件的內容僅僅是目標文件的文件名,根據文件名鏈接到正確的目錄去取得目標文件的inode,然後就能讀取目標文件的數據了。所以,當目標文件被刪除後,符號鏈接文件就會打不開,就是因爲找不到目標文件的文件名了。

這裏的符號鏈接文件/tmp/ln02/passwd_so的大小爲16byte,爲什麼呢?因爲它的block中存放的目標文件的文件名“/tmp/ln01/passwd”共有16個字符,每個字符佔用1byte,所以大小爲16byte。

當修改符號鏈接文件時,改動的是源文件。除了對文件做符號鏈接之外,符號鏈接還可以用於目錄,比如:ln -s /bin /root/bin,當進入到/root/bin這個目錄時其實就是進入到/bin這個目錄內。

三、關於目錄的鏈接數量

1、我們知道當使用ls -i命令查看某個文件或者目錄時,第一列屬性值表示的是該文件或者目錄的inode號碼,而第三列屬性值表示有多少個文件鏈接到這個inode號碼。當新建一個空的目錄時,會爲該目錄分配一個inode號碼,而該空目錄中會存在兩個目錄,那就是“.”與“..”目錄,而該空目錄的目錄名與“.”實際是一樣的,都是表示該目錄,所以新建一個空目錄時會有兩個目錄名鏈接到該目錄的inode號碼,而“..”表示該空目錄的上層目錄,所以新建一個空目錄時會增加一個目錄名鏈接到該目錄的上層目錄的inode號碼,如下圖:

 

 

發佈了60 篇原創文章 · 獲贊 10 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章