深入理解硬連結和軟連結 (轉)

worldblog發表於2007-12-13
深入理解硬連結和軟連結 (轉)[@more@]

深入理解硬連結和軟連結

 :namespace prefix = o ns = "urn:schemas--com::office" />

  和都提供了連結命令ln。顧名思義,ln是將兩個名(此說法不大準確)彼此連結起來,使得無論使用哪一個檔名都可訪問到同一檔案。這是我們用ln命令所要達到的目的,但是從技術上講,只有軟連結是連結兩個檔名,硬連結不在此列之中。要透徹理解連結的含義,就必須要分清檔案與檔名的區別。而要區分檔案與檔名,我們就得知道檔案如何管理檔案。看似很普通的命令,其技術背景卻一點兒也不簡單。

 

檔案系統如何管理檔案涉及範圍太大,不可能也不必要在此全部敘述,但我們只需知道以下技術要點即可。在Linux中,檔案的外延很大,我們常識中的“檔案”(例如一篇文件等)是檔案, 目錄、裝置等也都是檔案。這些檔案種類繁多,數量巨大,萬一重名怎麼辦,檔案系統是如何區分並管理它們的呢?限制重名?這當然不行!我們來看看Linux是如何做的。原來Linux的檔案系統為每一個檔案分配了一個我們稱為節點(Inode)的資料結構,在這個索引節點內有一個全系統獨一無二的索引節點號,檔案系統正是靠這個索引節點號來識別一個檔案。另外檔案系統用來管理檔案的所有資訊都包含在索引節點之中。

 

好了,給每個檔案分配一個唯一的number,檔案系統就知道某個檔案究竟是張三的檔案還是李四的檔案。但是檔案的真正使用者——我們人類也要用該number去識別檔案嗎?呵呵,若此為真,不知是人玩還是電腦玩人羅。因此我們要用我們的方式去區分各個檔案,給每一個檔案起一好聽易記的名字,同一地點(即同一目錄)不能有兩個名字一樣的檔案。地點若不同,允許重名。至此,人類有人類識別檔案的方法,電腦(檔案系統)有電腦的做法,喔喔,問題又來了,二者是要“水火不容”呢,還是“溝通無限”呢?這還用問,當然是後者啦。

 

OK,既然要“溝通”,“連結”自然而然就提出來了。繞了個大圈,終於得以言歸正傳,有了上述的背景知識,不管是硬連結還是軟連結對於我們來說已是板上魚肉。所謂硬連結(hard link, 也稱連結/editor/Editor.htm#_ftn1" name=_ftnref1>[1])就是一個檔案的一個或多個檔名。再說白點,所謂連結無非是把我們人類使用的檔名和電腦(檔案系統)使用的節點號連結起來。因此我們可以用多個檔名與同一個檔案進行連結,這些檔名可以在同一目錄或不同目錄。一個檔案有幾個檔名(用ln命令實現多個檔名),我們就說該檔案的連結數為幾。由定義可知,此連結數可以是1, 這表明該檔案只有一個檔名。

 

需要特別指出的是,在info ln的幫助資訊中所說的硬連結與我的理解是有差別的,先看info是如何講硬連結。“A "hard link" is another name for an existing file; the link and the original are indistinguishable.”(一個“硬連結”是一個現有檔案的別名;連結檔案與被連結檔案是無法區別的。)哇喔,好象亂套了,誰對誰錯?誰都沒錯,二者角度不同。Info是就ln命令而論的“硬連結”,注意了,info中的硬連結也是打了雙引號的,我估計此有特殊含義。“連結檔案與被連結檔案是無法區別的”,沒錯,因為它們都指向同一個索引節點嘛。現在我與info主要差別在於,我認同而info不認同以下觀點:對於一個擁有檔名的檔案,在沒有用過ln命令的情況下,該檔案仍存在硬連結,且連結數為1。理論需要實踐來證明,在Linux中用ls –l命令獲得該目錄下檔案的詳細資訊,格式如下:

-rwxr-xr-x  1    root   1024  Apr 30 17:06  filename

上述格式中黑體加下劃線的“1”代表檔名filename的檔案的連結數為1。做個實驗,在同一目錄(不同目錄也行)使用ln命令:

  ln filename filename2

然後再使用ls –l命令,會得到下面的資訊:

-rwxr-xr-x  2  root   root   1024  Apr 30 17:06  filename

-rwxr-xr-x  2  root   root   1024  Apr 30 17:06  filename2

很明顯,原來檔名為filename的檔案現在擁有了兩個檔名,連結數變為2, 除此之外其它一切資訊都沒變,所以說“連結檔案與被連結檔案是無法區別的”。下面的事實讓我懷疑有沒有必要用ln產生新的硬連結:無論使用任一檔名對檔案的任何改動,該檔案的所有直接或間接連結檔案都會隨之而改變,最後所有資訊都保持一致。

 

將檔名與索引節點分開,然後採用硬連結的技術使得管理檔案變得更方便,更高。例如重新命名,程式並不需要開啟該檔案,只需改動某個目錄項的內容即可。還有刪除一個檔案也是如此,將相應的目錄項刪除,該檔案的連結數減1,如果刪除目錄項後該檔案的連結數為零,這時系統才把真正的檔案從上刪除。

 

認識了硬連結究竟是怎麼一回事,理解硬連結的兩個限制就容易多了。

1、不允許給目錄建立硬連結;

2、只有在同一檔案系統中的檔案之間才能建立連結。

篇幅關係,不再贅述。

 

 

為了克服以上限制,引入符號連結(symbolic link,也稱軟連結)。符號連結實際上是一種特殊的檔案型別,這種檔案包含了另一個檔案的任意一個路徑名。這個路徑名指向位於任意一個檔案系統的任意檔案,甚至可以指向一個不存在的檔案。系統會自動把對符號連結的大部分操作(如讀、寫等)變為對原始檔的操作,但某些操作(如刪除等)就會直接在符號連結上完成。在ln中加選項-s便產生一個檔案的符號連結。



在討論符號連結的之前,連結一般理解為硬連結。

如ln file1 file2; ln file2 file3,我稱file3為file1的間接連結檔案。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992776/,如需轉載,請註明出處,否則將追究法律責任。

相關文章