天天看點

詳解 Linux 中的硬連結與軟連結

在 Windows 中安裝應用程式,通常安裝向導會提示是否建立桌面快捷方式。如果選擇同意建立,安裝完成後會在桌面上看到對應應用程式的圖示,如果想要使用這個應用程式隻需要輕按兩下桌面上的快捷方式即可,這就是 Windows 中的快捷方式。Linux 連結檔案類似于 Windows 中的快捷方式,Linux 連結檔案分為硬連結和軟連結,不過在具體介紹 Linux 中的硬連結和軟連結之前,先來看看 Linux 檔案系統中檔案的具體結構。

在 Linux 檔案系統中,一個檔案被分成兩個部分:中繼資料(metadata)與使用者資料(user data)。中繼資料為檔案的附加屬性,如索引節點(Inode)、檔案大小、檔案建立時間、檔案所有者等。「中繼資料中并不包含檔案名,檔案名僅僅是為了友善使用者使用。Linux 檔案系統為每一個儲存在磁盤分區中的檔案(無論什麼類型)都配置設定一個索引節點号(Inode Number),索引節點号是檔案在一個檔案系統中的唯一辨別,不同檔案所對應的索引節點号是不相同的;」 使用者資料,即檔案資料塊(data block),檔案資料塊中以二進制的形式記錄着檔案的真實内容。

詳解 Linux 中的硬連結與軟連結

如果想要檢視對應檔案的索引節點号可以使用

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,而索引節點号為檔案的唯一辨別,「是以源檔案和硬連結檔案是僅檔案名不同的相同檔案,建立檔案的硬連結相當于為檔案又起了一個新的檔案名。」

詳解 Linux 中的硬連結與軟連結

此時的 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 個位元組。

詳解 Linux 中的硬連結與軟連結

軟連結檔案的資料塊中僅僅存放着源檔案的索引節點号,這也是為什麼源檔案為 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 會使用特殊的顔色将軟連結檔案與其它檔案進行區分,如果删除了源檔案,軟連結失效則軟連結檔案也會呈現失效的顔色;
詳解 Linux 中的硬連結與軟連結

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

  • 一是友善管理,例如可以把一個複雜路徑下的檔案連結到一個簡單路徑下友善使用者通路;
  • 另一方面就是解決檔案系統磁盤空間不足的情況。例如某個檔案檔案系統空間已經用完了,但是現在必須在該檔案系統下建立一個新的目錄并存儲大量的檔案,那麼可以把另一個剩餘空間較多的檔案系統中的目錄連結到該檔案系統中,這樣就可以很好的解決空間不足問題;

硬連結與軟連結的差別

最後來簡單總結一下硬連結和軟連結的差別:

詳解 Linux 中的硬連結與軟連結
參考:
  1. http://www.itheima.com/
  2. https://www.linuxprobe.com/soft-hard-links-comments.html
詳解 Linux 中的硬連結與軟連結

【資料分析】Numpy中常用随機函數的總結

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

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

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

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