硬連結Hard link
由于linux下的檔案是通過索引節點(inode)來識别檔案,硬連結可以認為是一個指針,指向原檔案inode的指針,系統并不為它重新配置設定
inode和建立檔案;即硬連結檔案和原檔案其實是同一個檔案,隻是名字不同。每添加一個硬連結,檔案inode的連結數就加1;删除一個硬鍊
接,inode的連結數減1,檔案内容依然存在,直到inode的連結數為0,才删除inode對應的檔案。
可以用ln指令來建立硬連結。文法:
用法:
第一種:為 existingfile 建立硬連結,檔案名為 newfile 。
第二種:在 directory 目錄中,為 existingfile-list 中包含的所有檔案建立一個同名的硬連結。
常用選項[options]
-f 無論 newfile 存在與否,都建立連結。
-n 如果 newfile 已存在,就不建立連結。
例子:
注意:在建立連結前,file1 顯示的連結數目為1,建立連結後(1)file1和file1hard的連結數目都變為2;(2)
file1和file1hard在inode号是一樣的(3)
file1和file1hard顯示的檔案大小也是一樣。可見進行了ln指令的操作結果:file1和file1hard是同一個檔案的兩個名字,它們具
有同樣的索引節點号和檔案屬性,建立檔案file1的硬連結,就是為file1的檔案索引節點在目前目錄上建立一個新指針。你可以删除其中任何一個,如
rm file2 ,每次隻會删除一個指針,連結數同時減一,隻有将所有指向檔案内容的指針删除,也即連結數減為0時,系統才會把檔案内容從磁盤上删除。
硬連結的不足:
不可以在不同檔案系統的檔案間建立連結
隻有超級使用者才可以為目錄建立硬連結
軟連結Soft link(符号連結symbolic link)
軟連結也叫符号連結,它是指向另一個檔案的特殊檔案,這種檔案的資料部分僅包含它所要連結檔案的路徑名。軟連結是為了克服硬連結的不足而引入的,軟連結不直接使用inode号作為檔案指針,而是使用檔案路徑名作為指針(軟連結:檔案名+ 資料部分–>目标檔案的路徑名)。軟連結有自己的inode,并在磁盤上有一小片空間存放路徑名。是以,軟連結能夠跨檔案系統,也可以和目錄連結!其二,軟連結可以對一個不存在的檔案名進行連結,但直到這個名字對應的檔案被建立後,才能打開其連結。
軟連結克服了硬連結的不足,沒有任何檔案系統的限制,任何使用者可以建立指向目錄的符号連結。因而現在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網絡對檔案進行連結,如同Windows下的快捷方式。
給ln指令加上-s選項,則建立軟連結。如果[連結名]已經存在但不是目錄,将不做連結。[連結名]可以是任何一個檔案名,也可以是一個目錄,并且
允許它與原檔案不在同一個檔案系統中。如果[連結名]是一個已經存在的目錄,系統将在該目錄下建立一個或多個與原檔案同名的檔案,此建立的檔案實際上是指
向原檔案的符号連結檔案。
例子:
總之,建立軟連結就是建立了一個新檔案。當通路連結檔案時,系統就會發現它是個連結檔案,系統讀取連結檔案找到真正要通路的檔案然後打開。
軟連結的缺點:
因為軟連結檔案包含的是原檔案的路徑資訊,是以當原檔案從一個目錄移到其他目錄中,再通路連結檔案,系統會提示找不到,而硬連結就沒有這個缺陷,你想怎麼移就怎麼移;還有它要系統配置設定額外的空間用于建立新的索引節點和儲存原檔案的路徑,其實很小。
差別總結
軟連結與硬連結的差別不僅僅是在概念上,在實作上也是不同的,整理如下:
對于硬連結,原檔案和硬連結檔案公用一個inode号,這說明他們是同一個檔案,而對于軟連結,原檔案和軟連結檔案擁有不同的inode号,表明他們是兩個不同的檔案;
在檔案屬性上軟連結明确寫出了是連結檔案,而硬連結沒有寫出來,因為在本質上硬連結檔案和原檔案是完全平等關系;
連結數目是不一樣的,軟連結的連結數目不會增加;
檔案大小是不一樣的,硬連結檔案顯示的大小是跟原檔案是一樣的,因為是等同的嘛,而這裡軟連結顯示的大小與原檔案就不同了,file1大小是48B,而file1soft是5B,這裡面的5實際上就是“file1”的大小。
在同一檔案系統下,可以建立軟連結或硬連結(同檔案系統不同目錄下也可以)。
連接配接計數count:
前面我們介紹了,檔案的連結計數域表明本系統中共有幾個檔案目錄項和本檔案的inode相同,也就是本檔案共有幾個硬連結。如上面的例子中AAA和AAAhard檔案的count值都是2。
那麼對于目錄,其count域的含義是什麼呢?目錄的count同樣表示共有多少個目錄項指向此目錄,不過要詳細說明必須進一步解釋VFS檔案系統的結構,為簡單起見,隻要這樣了解就行了:(count-2)等于本目錄包含的直接子目錄數(就是隻包括兒子,不包括孫子)。
例如:如果一個目錄/ln的count域為5,那麼/ln目錄一定包含3個子目錄。
操作實驗
以下晴楓做了個實驗,把上文提到的硬連結和軟連結的差別體驗了一遍,明白上面的原理也就很容易了解下面操作的結果了