­

詳解 Linux 中的硬鏈接與軟鏈接

  • 2020 年 11 月 2 日
  • AI

在 Windows 中安裝應用程式,通常安裝嚮導會提示是否創建桌面快捷方式。如果選擇同意創建,安裝完成後會在桌面上看到對應應用程式的圖標,如果想要使用這個應用程式只需要雙擊桌面上的快捷方式即可,這就是 Windows 中的快捷方式。Linux 鏈接文件類似於 Windows 中的快捷方式,Linux 鏈接文件分為硬鏈接和軟鏈接,不過在具體介紹 Linux 中的硬鏈接和軟鏈接之前,先來看看 Linux 文件系統中文件的具體結構。

在 Linux 文件系統中,一個文件被分成兩個部分:元數據(metadata)與用戶數據(user data)。元數據為文件的附加屬性,如索引節點(Inode)、文件大小、文件創建時間、文件所有者等。「元數據中並不包含文件名,文件名僅僅是為了方便用戶使用。Linux 文件系統為每一個保存在磁碟分區中的文件(無論什麼類型)都分配一個索引節點號(Inode Number),索引節點號是文件在一個文件系統中的唯一標識,不同文件所對應的索引節點號是不相同的;」 用戶數據,即文件數據塊(data block),文件數據塊中以二進位的形式記錄著文件的真實內容。

如果想要查看對應文件的索引節點號可以使用ls -i指令:

chenkc:~$ vim hello.txt
chenkc:~$ cat hello.txt
AI機器學習與深度學習演算法
chenkc:~$ ls -i hello.txt 
1837900 hello.txt

硬鏈接

在 Linux 中允許多個文件名指向同一個索引節點號,而硬鏈接(hard link, 也稱鏈接)指的是通過索引節點號進行的鏈接。可以通過ln指令為文件創建硬鏈接:

ln 源文件 鏈接文件

為 hello.txt 文件創建兩個硬鏈接:

chenkc:~$ ln hello.txt hardlink_hello.txt
chenkc:~$ ln hello.txt hardlink_hello2.txt
chenkc:~$ ls -il
total 675432
1837900 -rw-r--r--  3 chenkc chenkc        56 8-р с 24 21:34 hello.txt
1837900 -rw-r--r--  3 chenkc chenkc        56 8-р с 24 21:34 hardlink_hello.txt
1837900 -rw-r--r--  3 chenkc chenkc        56 8-р с 24 21:34 hardlink_hello2.txt
...

源文件和兩個硬鏈接文件的索引節點號都為 1837900,而索引節點號為文件的唯一標識,「因此源文件和硬鏈接文件是僅文件名不同的相同文件,創建文件的硬鏈接相當於為文件又起了一個新的文件名。」

此時的 hello.txt、hardlink_hello.txt 以及 hardlink_hello2.txt 擁有相同的索引節點號,查看文件內容也會發現為同一個文件:

chenkc:~$ cat hello.txt
AI機器學習與深度學習演算法
chenkc:~$ cat hardlink_hello.txt
AI機器學習與深度學習演算法
chenkc:~$ cat hardlink_hello2.txt
AI機器學習與深度學習演算法

執行ls -il指令後發現在表示文件類型以及許可權的 10 個字元之後有一個數字 3,對於文件來說 3 表示硬鏈接數,每一個硬鏈接數都可以看成是文件的一個文件名,此時inode:1837900的文件擁有 3 個文件名。

假設我們現在刪除硬鏈接對應的源文件 hello.txt:

chenkc:~$ rm -rf hello.txt
chenkc:~$ cat hardlink_hello.txt
AI機器學習與深度學習演算法
chenkc:~$ cat hardlink_hello2.txt
AI機器學習與深度學習演算法

「如果刪除硬鏈接對應的源文件,硬鏈接文件仍然存在,這是因為硬鏈接是有著相同索引節點號僅文件名不同的文件,因此,刪除一個硬鏈接文件並不影響其他有相同索引節點號的文件。我們可以為重要的文件創建硬鏈接,這樣即使錯誤操作誤刪了文件,也不會重要文件造成影響。」 當文件沒有任何文件名指向的時候,文件也會被刪除,也就是此時的硬鏈接數為 0。硬鏈接相當於為文件創建了一個新的文件名,當刪除其中一個鏈接的時候並不影響索引節點本身以及其它鏈接到該索引節點的文件名,所以這些鏈接是相對獨立的,這也是為什麼 Linux 中僅僅標識文件硬鏈接的數目,並沒有顯示的標識文件是否為硬鏈接文件的原因。

軟鏈接

軟鏈接(也稱符號鏈接)可以看成是一個普通的文件, 「只不過這個文件中的數據塊存放的是源文件的索引節點號。」 可以通過為ln指令添加-s(s: soft 的意思)選項創建軟鏈接:

ln -s 源文件 鏈接文件

為 hello.txt 文件創建一個軟鏈接:

chenkc:~$ ln -s hello.txt softlink_hello.txt
chenkc:~$ ls -il
total 675236
1837900 -rw-r--r--  1 chenkc chenkc        36 8-р с 25 18:55 hello.txt
6705 lrwxrwxrwx  1 chenkc chenkc         9 8-р с 25 18:57 softlink_hello.txt -> hello.txt
...

源文件的索引節點號為 1837900,而軟鏈接文件的索引節點號為 6705,顯然源文件和軟鏈接文件並不是同一個文件,其實從兩個文件的大小也可以看出來,其中源文件大小為 36 個位元組,而軟鏈接文件大小僅僅為 9 個位元組。

軟鏈接文件的數據塊中僅僅存放著源文件的索引節點號,這也是為什麼源文件為 36 個位元組,而軟鏈接文件卻有 9 個位元組的原因。「由於軟鏈接只不過是數據塊中存放了源文件的索引節點號,因此刪除軟鏈接文件並不會影響源文件。但是如果刪除源文件,由於軟鏈接文件中指向的索引節點號對應的文件沒有了,所以會導致軟鏈接文件失效。」

chenkc:~$ rm -rf softlink_hello.txt # 刪除軟鏈接文件並不影響源文件
chenkc:~$ cat hello.txt
AI機器學習與深度學習演算法
chenkc:~$ ll hello.txt softlink_hello.txt
-rw-r--r-- 1 chenkc chenkc 36 8-р с 25 19:16 hello.txt
lrwxrwxrwx 1 chenkc chenkc  9 8-р с 25 19:17 softlink_hello.txt -> hello.txt
chenkc:~$ rm -rf hello.txt
chenkc:~$ cat softlink_hello.txt
cat: softlink_hello.txt: No such file or directory
chenkc:~$ ll softlink_hello.txt
lrwxrwxrwx 1 chenkc chenkc 9 8-р с 25 19:17 softlink_hello.txt -> hello.txt # 紅色

軟鏈接不同於硬鏈接,在軟鏈接中刪除源文件會影響到軟鏈接的使用,因此在 Linux 中會有很多地方標識文件是否為軟鏈接:

  • ls -l指令輸出的文件,其中十個字元中的第一個字元代表文件類型,如果文件為軟鏈接文件則為l
  • Linux 會使用特殊的顏色將軟鏈接文件與其它文件進行區分,如果刪除了源文件,軟鏈接失效則軟鏈接文件也會呈現失效的顏色;

「如果軟鏈接文件和源文件不在同一個目錄下,源文件要使用絕對路徑而不能使用相對路徑。」 軟鏈接主要應用在兩個方面:

  • 一是方便管理,例如可以把一個複雜路徑下的文件鏈接到一個簡單路徑下方便用戶訪問;
  • 另一方面就是解決文件系統磁碟空間不足的情況。例如某個文件文件系統空間已經用完了,但是現在必須在該文件系統下創建一個新的目錄並存儲大量的文件,那麼可以把另一個剩餘空間較多的文件系統中的目錄鏈接到該文件系統中,這樣就可以很好的解決空間不足問題;

硬鏈接與軟鏈接的區別

最後來簡單總結一下硬鏈接和軟鏈接的區別:

參考:

  1.  //www.itheima.com/

  2. //www.linuxprobe.com/soft-hard-links-comments.html

【數據分析】Numpy中常用隨機函數的總結

【數據分析】Numpy中的兩個亂序函數

【機器學習】詳解訓練集、測試集以及驗證集

【資源分享】電子書 | 廖雪峰 Python3 教程

【自然語言處理】使用 HanLP 統計二元語法中的頻次