硬鏈接和軟鏈接

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



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



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



OK,既然要“溝通”,“鏈接”自然而然就提出來了。繞了個大圈,終於得以言歸正傳,有了上述的背景知識,不管是硬鏈接還是軟鏈接對於我們來說已是板上魚肉。所謂硬鏈接(hard link, 也稱鏈接[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 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產生新的硬鏈接:無論使用任一文件名對文件的任何改動,該文件的所有直接或間接[2]鏈接文件都會隨之而改變,最後所有信息都保持一致。



將文件名與索引節點分開,然後採用硬鏈接的技術使得管理文件變得更方便,效率更高。例如重命名,進程並不需要打開該文件,只需改動某個目錄項的內容即可。還有刪除一個文件也是如此,將相應的目錄項刪除,該文件的鏈接數減1,如果刪除目錄項後該文件的鏈接數爲零,這時系統才把真正的文件從磁盤上刪除。



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

1、不允許給目錄創建硬鏈接;

2、只有在同一文件系統中的文件之間才能創建鏈接。

篇幅關係,不再贅述。





爲了克服以上限制,引入符號鏈接(symbolic link,也稱軟鏈接)。符號鏈接實際上是一種特殊的文件類型,這種文件包含了另一個文件的任意一個路徑名。這個路徑名指向位於任意一個文件系統的任意文件,甚至可以指向一個不存在的文件。系統會自動把對符號鏈接的大部分操作(如讀、寫等)變爲對源文件的操作,但某些操作(如刪除等)就會直接在符號鏈接上完成。在ln中加選項-s便產生一個文件的符號鏈接。
   總之:硬鏈接就是讓多個不在或者同在一個目錄下的文件,同時能夠修改同一個文件,其中一個修改後,所有有與其有硬鏈接的文件都一起修改了。
     軟鏈接就是與window中的快捷鍵一樣。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章