在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對應的文件刪除會導致軟鏈接失效,另外軟鏈接還可以跨系統而硬鏈接只能在一個系統之下!