歡迎您光臨本站 註冊首頁

深入理解硬鏈接和軟鏈接

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

  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中的快捷鍵一樣.


[火星人 ] 深入理解硬鏈接和軟鏈接已經有463次圍觀

http://coctec.com/docs/linux/show-post-52241.html