1. 程式人生 > >檔案系統-硬連結與軟連結的區別

檔案系統-硬連結與軟連結的區別

  • 硬連結:若一個 inode 號對應多個檔名,則稱這些檔案為硬連結。換言之,硬連結就是同一個檔案使用了多個別名(見 圖 2.hard link 就是 file 的一個別名,他們有共同的 inode)。硬連結可由命令 link 或 ln 建立。
  • 軟連線:若檔案使用者資料塊中存放的內容是另一檔案的路徑名的指向,則該檔案就是軟連線。軟連結就是一個普通檔案,只是資料塊內容有點特殊。軟連結有著自己的 inode 號以及使用者資料塊

詳細介紹

我們知道檔案都有檔名與資料,這在 Linux 上被分成兩個部分:使用者資料 (user data) 與元資料 (metadata)。使用者資料,即檔案資料塊 (data block),資料塊是記錄檔案真實內容的地方;而元資料則是檔案的附加屬性,如檔案大小、建立時間、所有者等資訊。在 Linux 中,元資料中的 inode 號(inode 是檔案元資料的一部分但其並不包含檔名,inode 號即索引節點號)才是檔案的唯一標識而非檔名。檔名僅是為了方便人們的記憶和使用,系統或程式通過 inode 號尋找正確的檔案資料塊。圖 1.展示了程式通過檔名獲取檔案內容的過程。
圖1. 通過檔名開啟檔案
這裡寫圖片描述

清單1:移動或重新命名檔案
這裡寫圖片描述

在 Linux 系統中檢視 inode 號可使用命令 stat 或 ls -i
清單 :1.中使用命令 mv 移動並重命名檔案 glibc-2.16.0.tar.xz,其結果不影響檔案的使用者資料及 inode 號,檔案移動前後 inode 號均為:2485677。

為解決檔案的共享使用,Linux 系統引入了兩種連結:硬連結 (hard link) 與軟連結(又稱符號連結,即 soft link 或 symbolic link)。連結為 Linux 系統解決了檔案的共享使用,還帶來了隱藏檔案路徑、增加許可權安全及節省儲存等好處。若一個 inode 號對應多個檔名,則稱這些檔案為硬連結。換言之,硬連結就是同一個檔案使用了多個別名(見 圖 2.hard link 就是 file 的一個別名,他們有共同的 inode)。硬連結可由命令 link 或 ln 建立。
如下是對檔案 oldfile 建立硬連結。

 link oldfile newfile 
 ln oldfile newfile

由於硬連結是有著相同 inode 號僅檔名不同的檔案,因此硬連結存在以下幾點特性:

檔案有相同的 inode 及 data block; 只能對已存在的檔案進行建立; 不能交叉檔案系統進行硬連結的建立;
不能對目錄進行建立,只可對檔案建立; 刪除一個硬連結檔案並不影響其他有相同 inode 號的檔案。

清單2. 硬連結特性展示

這裡寫圖片描述

清單 3. 查詢有相同 inode 號的檔案:

這裡寫圖片描述

值得一提的是,Linux 系統存在 inode 號被用完但磁碟空間還有剩餘的情況。我們建立一個 5M 大小的 ext4 型別的 mo.img 檔案,並將其掛載至目錄 /mnt。然後我們使用一個 shell 指令碼將掛載在 /mnt 下 ext4 檔案系統的 indoe 耗盡(見清單 4)。

清單 4. 測試檔案系統 inode 耗盡但仍有磁碟空間的情景

這裡寫圖片描述

硬連結不能對目錄建立是受限於檔案系統的設計(見 清單2對目錄建立硬連結將失敗)。現 Linux 檔案系統中的目錄均隱藏了兩個個特殊的目錄:當前目錄(.)與父目錄(..)。檢視這兩個特殊目錄的 inode 號可知其實這兩目錄就是兩個硬連結(注意目錄 /mnt/lost+found/ 的 inode 號)。若系統允許對目錄建立硬連結,則會產生目錄環。

軟連結與硬連結不同,若檔案使用者資料塊中存放的內容是另一檔案的路徑名的指向,則該檔案就是軟連線。軟連結就是一個普通檔案,只是資料塊內容有點特殊。軟連結有著自己的 inode 號以及使用者資料塊(見 圖 2.)。因此軟連結的建立與使用沒有類似硬連結的諸多限制:

軟連結有自己的檔案屬性及許可權等;
軟連結可對檔案或目錄建立;
刪除軟連結並不影響被指向的檔案,但若被指向的原檔案被刪除,則相關軟連線被稱為死連結(即 dangling link,若被指向路徑檔案被重新建立,死連結可恢復為正常的軟連結)。

圖 2. 軟連結的訪問
這裡寫圖片描述

清單 5. 軟連結特性展示
這裡寫圖片描述

當然軟連結的使用者資料也可以是另一個軟連結的路徑,其解析過程是遞迴的。但需注意:軟連結建立時原檔案的路徑指向使用絕對路徑較好。使用相對路徑建立的軟連結被移動後該軟連結檔案將成為一個死連結(如下所示的軟連結 a 使用了相對路徑,因此不宜被移動),因為連結資料塊中記錄的亦是相對路徑指向。

當前系統已掛著的檔案系統型別,除上述使用的命令 df,還可使用命令 mount 或檢視檔案 /proc/mounts。

命令 ls 或 stat 可幫助我們區分軟連結與其他檔案並檢視檔案 inode 號,但較好的方式還是使用 find 命令,其不僅可查詢某檔案的軟連結,還可以用於查詢相同 inode 的所有硬連結。(見清單 8.)
清單 6. 使用命令 find 查詢軟連結與硬連結

這裡寫圖片描述

系統根據磁碟的大小預設設定了 inode 的值(見清單 9.),如若必要,可在格式檔案系統前對該值進行修改。如鍵入命令 mkfs -t ext4 -I 512/dev/sda4,將使磁碟裝置 /dev/sda4 格式成 inode 大小是 512 位元組的 ext4 檔案系統。
清單 7. 檢視系統的 inode 值
這裡寫圖片描述