天天看點

硬連結和符号連結

1.inode

      首先了解inode(索引節點)。

      硬碟中的塊(Block)是記錄檔案内容資料的區域,inode則是記錄該檔案屬性及其放置在哪個Block之内的資訊。是以,系統為每個新建立的檔案配置設定一個inode,每個檔案都有一個唯一的inode号。在Linux中,系統要存取某個檔案時,要先從inode table找到該檔案的inode進而找到存放資料的Block才能對資料進行操作。一個inode大小為128Byte,inode數量一開始已被設定好,通常為"硬碟大小/機關容量",這個機關容量比Block大一些較佳,如Block為4K,機關容量設為8K左右。

    一個分區被格式化為一個檔案系統後,會有inode table與資料區域兩大塊,一個用來記錄檔案屬性及該檔案放置的Block塊,一個用來記錄檔案内容。

2.硬連結

      連結分兩種:硬連結(hard link)與符号連結(symbolic link)。

      UNIX檔案系統提供了一種将不同檔案連結至同一個檔案的機制,我們稱這種機制為連結。它可以使得單個程式對同一檔案使用不同的名字。這樣的好處是檔案系統隻存在一個檔案的副本。系統簡單地通過在目錄中建立一個新的登記項來實作這種連結。該登記項具有一個新的檔案名和要連接配接檔案的inode号(inode與原檔案相同)。

      硬連結是直接建立在inode table上的inode,建立硬連結指向一個檔案的時候,會更新inode table上面的引用計數值。舉個例子,一個檔案被連結了兩次(硬連結),這個檔案的計數值是3,而無論通過3個檔案名中的任何一個通路,效果都是完全一樣的,但是如果删除其中任意一個,都隻是把計數值減1,不會删除實際的内容,(任何存在的檔案本身就算是一個硬連結)隻有計數值變成0,也就是沒有任何硬連結指向的時候才會真實的删除内容。

      系統讀取某個檔案時,會先讀inode table,然後根據inode資訊到相應Block區域将資料取出。硬連結其實就是一個指向inode的目錄項,系統不為它配置設定新的inode。一個檔案隻有在硬連結數減為0且沒有程序使用時,核心才将該檔案内容從磁盤上删除。不論一個檔案有多少硬連結,在磁盤上隻有一個描述它的inode,隻要該檔案的連結數不為0,該檔案就保持存在。

      硬連結兩大限制:

      硬連結不能連結目錄。因為目錄本身僅有inode,無内容Block塊。而inode會連結到Block塊,是以硬連結不能連結目錄。

      硬連結不能跨檔案系統。因為不同檔案系統有不同的inode table。

      進一步說明: 

      硬連接配接檔案實際上并不是一種新的檔案類型,兩個檔案互為對方的硬連接配接。兩個檔案除了名稱或/和檔案目錄不同外,其它部分完全相同,更改了一個檔案,另一個的檔案長度、内容、更改時間等都将相應發生變化,更改了一個檔案的權限位mode,另一個也會發生同樣的變化。 因為這些資訊都儲存在FCB即檔案控制塊中,FCB有放在inode中。

      注意連結的引用計數字段count,互為硬連結的兩個檔案的count值都是2,表明有兩個inode指向同一檔案的inode。      

3.符号連結

      符号連結(symbolic link)又稱為軟連結,它是指向另一個檔案的特殊檔案,這種檔案的資料部分僅包含它所要連結檔案的路徑名。軟連結是為了克服硬連結的不足而引入的,軟連結不直接使用inode号作為檔案指針,而是使用檔案路徑名作為指針(軟連結:檔案名 + 資料部分-->目标檔案的路徑名)。軟體有自己的inode,并在磁盤上有一小片空間存放路徑名。是以,軟連結能夠跨檔案系統,也可以和目錄連結!其二,軟連結可以對一個不存在的檔案名進行連結,但直到這個名字對應的檔案被建立後,才能打開其連結。

      若原檔案删除了,則該軟連結則不可以通路,而硬連結則是可以的。

4.建立連結指令ln

      可以使用ln指令建立硬連結和符号連結,示例如下:

$ touch myfile    

$ ln myfile myfile-hardlink    

$ ln -s myfile myfile-symlink    

$ ls -li myfile*    

292007 -rw-rw-r--    3 francois francois 0 Mar 25 00:07 myfile    

292007 -rw-rw-r--    3 francois francois 0 Mar 25 00:07 myfile-hardlink    

292008 lrwxrwxrwx    2 francois francois 6 Mar 25 00:09 myfile-symlink

      可以通過指令ln來建立連結。ln 預設建立的是硬連結。給ln指令加上-s選項,則建立軟連結。如果[連結名]已經存在但不是目錄,将不做連結。

      建立硬連結和符号連結檔案之後,使用ls -li指令檢視檔案資訊,選項-li會顯示各個檔案關聯的inode。從上面的例子可以看出,myfile和myfile-hardlink的inode号皆為292007,意味着兩者在硬碟中實際上是同一個檔案。符号連結myfile-symlink的inode号則與之不同。另外,硬連結隻是顯示為檔案(-),而符号連結則識别成連結(l),且權限全部放開。由此無法判斷能否通路該符号連結所指檔案,隻有嘗試通路這個符号連結或檢視連結目标資訊之後才知道結果。

      軟連結的連結對象可以是任意檔案或目錄,可以連結不同檔案系統的檔案。和Windows下的快捷方式差不多。連結檔案甚至可以連結不存在的檔案,稱之為“斷鍊”,連結檔案甚至可以循環連結自己。

      軟連結中連結引用計數字段count表明自身的檔案硬連結個數,與連結的對象無關。

繼續閱讀