linux的軟鏈接和硬鏈接

  在linux的文件存儲系統中,文件主要被分爲兩個部分,用戶數據(文件中存的真實內容,就是我們cat時看到的內容,此處爲個人理解可能會有偏差)以及元數據(metadata)。而元數據記錄的則是文件的附加屬性,如文件大小、創建時間、所有者信息、inode等,inode就是linux文件系統中的索引節點號,是文件在系統中的唯一標識,文件名只是給人看的。系統通過文件名打開文件的方式爲:filename -> inode -> data blocks,其中data blocks就是用戶數據。
  對於系統中的文件,爲了解決共享問題,Linux引入了硬鏈接(hard link)和軟鏈接(軟鏈接soft link又稱爲符號鏈接)。
  如何區分軟鏈接和硬鏈接呢?對於文件而言,其實filename -> inode這個鏈接可以理解爲一個硬鏈接,即本身文件名和inode之間的關聯就是一種硬鏈接,由於inode纔是文件的唯一標識,所以沒新增一個硬鏈接,就是新增了一個filename->inode的關聯,例如對~/local/core.log新增一個硬鏈接:

ln ~/local/core.log ~/hard/link/core.log

此時查看文件的信息:

ll -i core.log
2492555 -rw-r--r-- 2 root root 0 Aug  9 20:21 core.log

以上的第三列2就是硬鏈接數量,這裏爲2說明出了文件本身以外還有一個硬鏈接!而第一列內容就是inode的值,對比發現這兩個硬鏈接的inode應該是一樣的,說明他們指向的是同一個文件!
  對於某一個文件的硬鏈接數,只要文件的硬連接數不爲0,則即便刪除任意的硬連接數對真正的文件數據都不會有影響,只有這個文件inode的硬連接數變爲0纔會導致這個文件真正的被刪除,所以就有可能會出現某些同學說的:我特麼明明刪除了文件啊,爲啥空間沒有釋放???遇到空間未釋放也許就是這個文件在別的地方還有硬鏈接!
  那麼有人肯定會問,我文件刪除後,如何判斷是否是因爲這個文件還有硬鏈接而導致空間未釋放的呢?方法如下:
a> 查詢這個已刪除文件的inode:

$ lsof|grep deleted|grep filename
java        685      root  258r      REG               8,48      60686  108266852 filename (deleted)
--More--

以上filename前面一列就是這個文件的inode,有了這個inode之後,就可以查詢它的硬連接數了:

$ find / -inum inode

這樣如果查詢到沒有說明不是因爲硬連接數導致空間未釋放,一般這種情況下就是因爲有程序佔用了文件而導致的。(由於本文引出來的原因就是因爲這個,所以寫着寫着好像有點偏題了。。)
  以上說明了硬鏈接和inode的關係,而對於軟鏈接可以理解爲window下的快捷方式,軟鏈接中其實記錄的是對應文件的路徑,通過硬鏈接找文件時,是直接hard link->inode,而通過軟鏈接找文件則是soft link->filename(hard link)->inode。軟鏈接刪除不會對文件有任何影響,而且文件inode對應的文件刪除會導致軟鏈接失效,另外軟鏈接還可以跨系統而硬鏈接只能在一個系統之下!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章