Linux 中軟 - 硬鏈接的特性

硬和軟是一對反義詞,相信很多同學在剛接觸硬鏈接、軟鏈接時都會被這對反義詞帶入理解概念的誤區。那麼如何來理解硬鏈接與軟鏈接呢?

硬鏈接與軟連接的概念

鏈接是一種允許多個文件名引用磁盤上單個文件的機制。有兩種鏈接:

硬鏈接會將多個文件名與一個 inode(索引節點)關聯,每個文件至少有一個硬鏈接且所有硬鏈接會共享相同的磁盤數據塊,同時也作爲獨立的目錄條目,當你創建一個硬鏈接後,鏈接計數將增加 1。但需要注意的是無法跨越磁盤創建硬鏈接,因爲 inode 編號僅在給定設備中是唯一的。

 #創建硬鏈接
 ln 文件名 硬鏈接名

操作系統在讀取磁盤時,一次性讀取多個扇區(sector),這些扇區組成了 “塊”(block),塊是文件系統存取的最小單位。默認情況下 8 個 sector,組成一個 4KB 大小的 block。文件數據都存儲在“塊” 中,而文件的元數據(屬主、屬組、創建時間、大小、指向與文件內容關聯的數據塊的指針等)都保存在 “inode” 中,也叫這塊存儲元數據的區域做“索引節點”。操作系統中的每個文件都有一個與之關聯的 inode,Solaris ZFS 除外,它沒有 inode。inode 的工作原理基本上類似於一本書的附錄。

符號鏈接是指向另一個文件的特殊文件類型,其具體內容只是它指向的目標文件的全路徑名稱,一旦符號鏈接所指向的文件被刪除,該鏈接仍然指向文件地址,但只留下一個掛起的鏈接。

 #創建符號鏈接
 ln -s 文件名 符號鏈接名
 #查看所有符號鏈接
 find ./* -type l -ls

示例 1.

如上圖,我們通過 ln 命令創建了 file1 的硬鏈接 file2,通過 “ln -s” 命令創建了 file1 的符號鏈接 file3。接下來通過 “ls -li” 命令可以看出 file1 與 file2 的權限、屬主、屬組、文件大小、修改時間都是相同的,且都指向值爲 “36375454” 的 inode,第三列則表明有 2 個硬鏈接指向這個 inode。注意,符號鏈接 file3 指向了不同的 inode。並且 file3 的文件大小是 5(“file1”的字符長度)。如過以下圖方式創建符號鏈接,則其長度爲 16(“/home/test/file1”的長度)。

示例 2.

如上圖,在刪除原始文件 file1 後,硬鏈接 file2 仍然可以訪問,符號鏈接仍存在,但是已經無法訪問其鏈接的內容了,且目錄變得閃爍,表示此鏈接不可用。

示例 3.

如上圖,當前操作系統的 / dev/sda3 分區掛載在根目錄,/dev/sdb1 分區掛載在 / mnt/sdb1 目錄。在創建 file1 的硬鏈接到 / mnt/sdb1/file2 時產生報錯,提示無法跨設備創建硬鏈接。接下來使用命令 “ln -s file1 /mnt/sdb1/file3” 成功創建符號鏈接,但是方位 file3 時提示找不到文件,通過命令 “ll /mnt/sdb1/file3” 看到 file3 指向的原始文件路徑只有 “file1”,所以無法正常訪問。使用命令“ln -s /home/test/file1 /mnt/sdb1/file4” 重新創建符號鏈接後,可以正常對原始文件進行訪問。

硬鏈接與軟鏈接的異同

gsJvG4

硬鏈接與複製文件有什麼不同?

在同一磁盤中複製和硬鏈接的原理相同,但硬鏈接無法跨磁盤創建,且硬鏈接無法操作目錄。

總結

在 Linux 中,鏈接可以與普通文件一樣被操作,當編輯鏈接時,其實就是在編輯原始文件,而不是副本。硬鏈接與原始文件都是數據在磁盤上的入口。而符號鏈接則是指向原始文件的指針。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/VcoQpcwi4UMoUOebP1fk5A