1. 程式人生 > 實用技巧 >linux硬連結與軟連結的聯絡與區別

linux硬連結與軟連結的聯絡與區別

我們知道檔案都有檔名與資料,這在 Linux 上被分成兩個部分:使用者資料 (user data) 與元資料 (metadata)。

使用者資料,即檔案資料塊 (data block),資料塊是記錄檔案真實內容的地方;
元資料則是檔案的附加屬性,如檔名、檔案大小、建立時間、所有者、檔案所在的inode等資訊。
在 Linux 中,元資料中的 inode 號(inode 號即索引節點號)才是檔案的唯一標識而非檔名。檔名僅是為了方便人們的記憶和使用,系統或程式通過 inode 號尋找正確的檔案資料塊。如圖1:

          圖一

可以用stat命令ls -i檢視inode號。

[yangxjsun@ubuntu workspace]$ls
c1  c2  test  test.txt
[yangxjsun@ubuntu workspace]$stat test.txt 
  檔案:
'test.txt' 大小:6 塊:8 IO 塊:4096 普通檔案 裝置:801h/2049d Inode:2099625 硬連結:1 許可權:(0664/-rw-rw-r--) Uid:( 1000/yangxjsun) Gid:( 1000/yangxjsun) 最近訪問:2018-03-24 16:58:43.693982883 +0800 最近更改:2018-03-24 16:58:35.981917820 +0800 最近改動:2018-03-24 16:58:35.981917820 +0800 建立時間:- [yangxjsun@ubuntu workspace]$mv test.txt hello.txt [yangxjsun@ubuntu workspace]$stat hello.txt 檔案:
'hello.txt' 大小:6 塊:8 IO 塊:4096 普通檔案 裝置:801h/2049d Inode:2099625 硬連結:1 許可權:(0664/-rw-rw-r--) Uid:( 1000/yangxjsun) Gid:( 1000/yangxjsun) 最近訪問:2018-03-24 16:58:43.693982883 +0800 最近更改:2018-03-24 16:58:35.981917820 +0800 最近改動:2018-03-24 16:59:17.190260081 +0800 建立時間:- [yangxjsun@ubuntu workspace]$

可以看到改變檔名之後inode不變。


為解決檔案的共享使用,Linux 系統引入了兩種連結:硬連結 (hard link) 與軟連結(又稱符號連結,即 soft link 或 symbolic link)。連結為 Linux 系統解決了檔案的共享使用,還帶來了隱藏檔案路徑、增加許可權安全及節省儲存等好處。那麼軟硬連結有什麼區別呢?請看圖2:

      圖二

硬連結:硬連結是新的目錄條目,其引用系統中的現有檔案。檔案系統中的每一檔案預設具有一個硬連結。為節省空間,可以不復制檔案,而建立引用同一檔案的新硬連結。新硬連結如果在與現有硬連結相同的目錄中建立,則需要有不同的檔名,否則需要在不同的目錄中。指向同一檔案的所有硬連結具有相同的許可權、連線數、使用者/組所有權、時間戳以及檔案內容。指向同一檔案內容的硬連結需要在相同的檔案系統中。
簡單說,硬連結就是一個 inode 號對應多個檔案。就是同一個檔案使用了多個別名(上圖中 hard link 就是 file 的一個別名,他們有共同的 inode)。
建立硬連結:ln命令為現有檔案建立新的硬連結。
ln 現有檔案硬連結(檔名) 一個或多個新硬連結

[yangxjsun@ubuntu workspace]$ls -l newfile.txt 
-rw-rw-r-- 1 yangxjsun yangxjsun 6 3月  24 17:40 newfile.txt
[yangxjsun@ubuntu workspace]$ln newfile.txt newfile-hlink.txt 
[yangxjsun@ubuntu workspace]$ls -l newfile.txt newfile-hlink.txt 
-rw-rw-r-- 2 yangxjsun yangxjsun 6 3月  24 17:40 newfile-hlink.txt
-rw-rw-r-- 2 yangxjsun yangxjsun 6 3月  24 17:40 newfile.txt

可以看出,新硬連結建立後,無法區別哪一現有硬連結是原始連結。

[yangxjsun@ubuntu workspace]$rm newfile.txt 
[yangxjsun@ubuntu workspace]$ls -l newfile-hlink.txt 
-rw-rw-r-- 1 yangxjsun yangxjsun 6 3月  24 17:40 newfile-hlink.txt
[yangxjsun@ubuntu workspace]$cat newfile-hlink.txt 
hello

即使原始連結被刪除,使用新的硬連結依然可以訪問原內容。

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

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

第三條不能交叉檔案系統進行硬連結的建立,為什麼?
inode 是隨著檔案的存在而存在,因此只有當檔案存在時才可建立硬連結,即當 inode 存在且連結計數器(link count)不為 0 時。inode 號僅在各檔案系統下是唯一的,當 Linux 掛載多個檔案系統後將出現 inode 號重複的現象,因此硬連結建立時不可跨檔案系統。
第四條中不能對目錄建立硬連結,為什麼?
簡單說,如果針對檔案做硬連線,等於針對這個檔案對應的inode又做一個連結。所以硬連結等於是同一個inode對應多個檔名。對於目錄來說,就是儲存這些連結的一個inode。如果針對目錄做硬連結,一個子目錄的硬連結指向父目錄的話,這樣就迴圈了。現 Linux 檔案系統中的目錄均隱藏了兩個個特殊的目錄:當前目錄(.)與父目錄(..)。檢視這兩個特殊目錄的inode號可知其實這兩目錄就是兩個硬連結。若系統允許對目錄建立硬連結,則會產生目錄環。想要深入研究可以移步這裡。

軟連結:(又稱符號連結,即 soft link 或 symbolic link) 軟連結與硬連結不同,若檔案使用者資料塊中存放的內容是另一檔案的路徑名的指向,則該檔案就是軟連線。軟連結就是一個普通檔案,只是資料塊內容有點特殊。軟連結有著自己的 inode 號以及使用者資料塊。(見圖2)軟連線可以指向目錄,而且軟連線所指向的目錄可以位於不同的檔案系統中。
建立軟連線: ln -s 命令建立軟連結

[yangxjsun@ubuntu workspace]$ln -s /home/yangxjsun/workspace/newfile.txt newfile-slink.txt
[yangxjsun@ubuntu workspace]$ls -l newfile.txt newfile-slink.txt 
lrwxrwxrwx 1 yangxjsun yangxjsun 37 3月  24 19:27 newfile-slink.txt -> /home/yangxjsun/workspace/newfile.txt
-rw-rw-r-- 1 yangxjsun yangxjsun  6 3月  24 16:58 newfile.txt
[yangxjsun@ubuntu workspace]$

當原始檔案被刪除之後,軟連結依然會指向該檔案,但目標已消失。這就是”dangling link”

[yangxjsun@ubuntu workspace]$rm newfile.txt 
[yangxjsun@ubuntu workspace]$ls -l newfile-slink.txt 
lrwxrwxrwx 1 yangxjsun yangxjsun 37 3月  24 19:30 newfile-slink.txt -> /home/yangxjsun/workspace/newfile.txt
[yangxjsun@ubuntu workspace]$cat newfile-slink.txt 
cat: newfile-slink.txt: 沒有那個檔案或目錄
[yangxjsun@ubuntu workspace]$

軟連結可以指向目錄。而後軟連線作為目錄使用。可以通過cd正常更改到軟連線目錄。

[yangxjsun@ubuntu workspace]$ln -s /etc/ configs
[yangxjsun@ubuntu workspace]$ls -d configs
configs
[yangxjsun@ubuntu workspace]$cd configs
[yangxjsun@ubuntu configs]$ls 
acpi                           host.conf                ppp
adduser.conf                   hostname                 presage.xml
alternatives                   hosts                    printcap
anacrontab                     hosts.allow              profile
...

軟連結特性:

軟連結有自己的檔案屬性及許可權等;
可對不存在的檔案或目錄建立軟連結;
軟連結可交叉檔案系統;
軟連結可對檔案或目錄建立;
建立軟連結時,連結計數 i_nlink 不會增加;
刪除軟連結並不影響被指向的檔案,但若被指向的原檔案被刪除,則相關軟連線被稱為死連結或懸掛的軟連結(即 dangling link,若被指向路徑檔案被重新建立,死連結可恢復為正常的軟連結)。

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

原文連結:https://blog.csdn.net/yangxjsun/article/details/79681229