linux硬鏈接與軟鏈接的聯繫與區別

我們知道文件都有文件名與數據,這在 Linux 上被分成兩個部分:用戶數據 (user data)元數據 (metadata)

用戶數據,即文件數據塊 (data block),數據塊是記錄文件真實內容的地方;
元數據則是文件的附加屬性,如文件名、文件大小、創建時間、所有者、文件所在的inode等信息。
在 Linux 中,元數據中的 inode 號(inode 號即索引節點號)纔是文件的唯一標識而非文件名。文件名僅是爲了方便人們的記憶和使用,系統或程序通過 inode 號尋找正確的文件數據塊。如圖1:
image001.jpg圖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:
image002.jpg圖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://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/index.html#major2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章