Linux軟鏈接與硬鏈接實戰解析
- 2019 年 10 月 6 日
- 筆記
1.硬鏈接
一般情況下,文件名和inode號碼是"一一對應"關係,每個inode號碼對應一個文件名。但是,Unix/Linux系統允許,多個文件名指向同一個inode號碼。
這意味著,可以用不同的文件名訪問同樣的內容;對文件內容進行修改,會影響到所有文件名;但是,刪除一個文件名,不影響另一個文件名的訪問。這種情況就被稱為"硬鏈接"(hard link)。

執行ln a.c a.c.bak
後,硬鏈接數加1。

每創建一個硬鏈接,硬鏈接數加1,並不會增加額外的空間。軟鏈接是原文件的快捷方式。

45360233表示inode值,類似於C語言中的指針,指向了物理硬碟的一個區塊,文件系統會維護一個引用計數,只要有文件指向這個區塊,它就不會從硬碟上消失。
兩個inode值一樣,都指向同一個區塊。
inode學習
文件數據都儲存在"塊"中,那麼很顯然,我們還必須找到一個地方儲存文件的元資訊,比如文件的創建者、文件的創建日期、文件的大小等等。這種儲存文件元資訊的區域就叫做inode,中文譯名為"索引節點"。這是Linux文件系統管理文件的方式。在建立文件系統時,會建立一個索引節點表,裡面包含一定數量的索引節點。每當建立一個文件時,就會為他分配一個索引節點號,相當於文件的地址。
每個inode都有一個號碼,作業系統用inode號碼來識別不同的文件。
這裡值得重複一遍,Unix/Linux系統內部不使用文件名,而使用inode號碼來識別文件。對於系統來說,文件名只是inode號碼便於識別的別稱或者綽號。
表面上,用戶通過文件名,打開文件。實際上,系統內部這個過程分成三步:首先,系統找到這個文件名對應的inode號碼;其次,通過inode號碼,獲取inode資訊;最後,根據inode資訊,找到文件數據所在的block,讀出數據。
使用ls -i
命令,可以看到文件名對應inode號碼。
inode的特殊作用
由於inode號碼與文件名分離,這種機制導致了一些Unix/Linux系統特有的現象。
- 有時,文件名包含特殊字元,無法正常刪除。這時,直接刪除inode節點,就能起到刪除文件的作用。
- 移動文件或重命名文件,只是改變文件名,不影響inode號碼。
- 打開一個文件以後,系統就以inode號碼來識別這個文件,不再考慮文件名。因此,通常來說,系統無法從inode號碼得知文件名。
第3點使得軟體更新變得簡單,可以在不關閉軟體的情況下進行更新,不需要重啟。因為系統通過inode號碼,識別運行中的文件,不通過文件名。更新的時候,新版文件以同樣的文件名,生成一個新的inode,不會影響到運行中的文件。等到下一次運行這個軟體的時候,文件名就自動指向新版文件,舊版文件的inode則被回收。
2.軟鏈接
假設有個文件a.c與b.c,那麼文件a.c和文件b.c的inode號碼雖然不一樣,但是文件b.c的內容是文件a.c的路徑。讀取文件b.c時,系統會自動將訪問者導向文件a.c。因此,無論打開哪一個文件,最終讀取的都是文件a.c。這時,文件b.c就稱為文件a.c的"軟鏈接"(soft link)或者"符號鏈接(symbolic link)。
創建一個軟鏈接,加-s參數,ln -s a.c b.c

查看上述inode值,發現軟鏈接文件的inode值不同。並且它的文件屬性上也有一個 l
的 flag,這就說明它與之前我們創建的兩個文件根本不是一個類型。
當刪除原文件a.c時候,查看硬鏈接文件不變,但是查看軟鏈接的文件b.c,會發現報錯。


之前的硬鏈接沒有絲毫地影響,因為它 inode
所指向的區塊由於有一個硬鏈接在指向它,所以這個區塊仍然有效,並且可以訪問到。
然而軟鏈接的 inode
所指向的內容實際上是保存了一個絕對路徑,當用戶訪問這個文件時,系統會自動將其替換成其所指的文件路徑,然而這個文件已經被刪除了,所以自然就會顯示無法找到該文件了。
最後,我們復原a.c,再來看b.c。

發現,a.c與a.c.bak的inode不一樣,因為此時是新文件,自然inode不一樣,同樣文件內容也不同。而當查看軟鏈接的b.c文件的時候,此時沒報錯,說明復原了b.c。

文件夾軟鏈接:

文件夾硬鏈接:

綜上可以發現,凡是文件都可做軟或硬鏈接,但是文件夾則是只能做軟鏈接。
3.總結
1.硬鏈接是通過索引節點進行的鏈接。在Linux中,多個文件指向同一個索引節點是允許的,像這樣的鏈接就是硬鏈接。硬鏈接只能在同一文件系統中的文件之間進行鏈接,不能對目錄進行創建。如果刪除硬鏈接對應的源文件,則硬鏈接文件仍然存在,而且保存了原有的內容,這樣可以起到防止因為誤操作而錯誤刪除文件的作用。由於硬鏈接是有著相同 inode 號僅文件名不同的文件,因此,刪除一個硬鏈接文件並不影響其他有相同 inode 號的文件。
2.軟鏈接(也叫符號鏈接)與硬鏈接不同,文件用戶數據塊中存放的內容是另一文件的路徑名的指向。軟鏈接就是一個普通文件,只是數據塊內容有點特殊。軟鏈接可對文件或目錄創建。(快捷方式指的就是軟鏈接)。
軟鏈接主要應用於以下兩個方面:一是方便管理,例如可以把一個複雜路徑下的文件鏈接到一個簡單路徑下方便用戶訪問;另一方面就是解決文件系統磁碟空間不足的情況。例如某個文件文件系統空間已經用完了,但是現在必須在該文件系統下創建一個新的目錄並存儲大量的文件,那麼可以把另一個剩餘空間較多的文件系統中的目錄鏈接到該文件系統中,這樣就可以很好的解決空間不足問題。刪除軟鏈接並不影響被指向的文件,但若被指向的原文件被刪除,則相關軟連接就變成了死鏈接。
3.硬鏈接使用場景少。
You generally should not use hard links anyway
也就是不建議使用硬鏈接,確實應用場景不多,但存在即合理,有時用其拷貝文件防止誤刪。
參考資料:
1.https://www.linuxprobe.com/soft-hard-links-comments.html
2.inode理解