Linux檔案的硬鏈結與軟連線

2021-07-31 02:30:59 字數 2309 閱讀 6986

linux檔案系統下有兩個特殊的檔案,分別叫硬鏈結檔案和軟連線檔案。硬鏈結檔案是一種引用計數的運用,軟連線可以理解為windows下面的快捷方式。

[lzk@localhost ~]$ stat file

file: `file'

size: 32 blocks: 8 io block: 4096 regular file

device: 802h/2050d inode: 5740 links: 1

access: (0664/-rw-rw-r--) uid: ( 500/ lzk) gid: ( 500/ lzk)

access: 2017-04-23

22:22:23.452294600 +0800

modify: 2017-04-23

22:21:55.415294411 +0800

change: 2017-04-23

23:11:31.365292371 +0800

links的初始值為1,沒當我們為它建立乙個硬鏈結,它的值就會加1。每當刪除乙個硬鏈結檔案,它的值就會減1。

指令ln用來建立硬鏈結檔案。

ln

[原始檔]

[硬鏈結檔案]

從上例可以看到,當乙個檔案links(引用計數)不為1的時候,我們刪除乙個原始檔或者硬鏈結檔案並不會刪除檔案資料。當links為1的時候,再刪除就會將資料刪除。

### 關於硬鏈結的限制

以下內容摘自:

linux系統中的硬連線有兩個限制:不能跨越檔案系統和不允許普通使用者對目錄作硬連線。至於第乙個限制,很好理解,而第二個就不那麼好理解 了。 對任何乙個目錄用ls -l 命令都可以看到其連線數至少是2,這也說明了系統中是存在硬連線的,而且命令ln -d 也可以讓超級使用者對目錄作硬連線,這些都說明了系統限制對目錄進行硬連線只是乙個硬性規定,並不是邏輯上不允許或技術上的不可行。那麼作業系統為什麼要進 行限制呢?答案可能有兩個。

先來說第乙個,如果引入了對目錄的硬連線就有可能在目錄中引入迴圈,那麼在目錄遍歷的時候系統就會陷入無限迴圈當中。也許您會說,符號連線不也可以引入循 環嗎,那麼為什麼不限制目錄的符號連線呢?原因就在於在linux系統中,每個檔案(目錄也是檔案)都對應著乙個inode結構,其中inode資料結構 中包含了檔案型別(目錄,普通檔案,符號連線檔案等等)的資訊,也就是說作業系統在遍歷目錄時可以判斷出符號連線,既然可以判斷出符號連線當然就可以採取 一些措施來防範進入過大的迴圈了,系統在連續遇到8個符號連線後就停止遍歷,這就是為什麼對目錄符號連線不會進入死迴圈的原因了。但是對於硬連線,由於操 作系統中採用的資料結構和演算法限制,目前是不能防範這種死迴圈的。

在說明第二個原因之前,先來看看檔案的dentry結構在系統空間中長什麼樣子和它們是怎麼存放在系統空間的。dentry結構主要包含了檔名,檔案的inode號,指向父目錄dentry結構的指標和其他一些與本次討論無關的指標,這裡關鍵是那個指向父目錄的指標;系統中所有的dentry結構都 是按雜湊值存放在雜湊表中的,這裡的雜湊演算法很重要,它是取檔名和檔案的父目錄dentry結構的位址一起雜湊運算出雜湊值的。現在假設有兩個目錄 /a和/b,其中/b是我們通過ln -d命令建立起來的對/a的硬連線。這個時候核心空間中就會存在乙個/a的dentry結構和乙個/b的dentry結構,由上面的知識可知,/a和/b 目錄下面的每乙個檔案或目錄都各自有對應的dentry結構(因為雖然/a目錄下面的檔名沒有改變,但是因為dentry結構有指向父目錄dentry 的指標和計算雜湊值時考慮了父目錄dentry結構的位址,這個時候dentry結構就分身乏術了),而且這種繼承還會影響到所有子目錄下面的檔案,這樣 下來就會浪費很多系統空間了,特別是如果被硬連線的目錄中存在大量檔案和子目錄的時候就更加明顯了。這也許是第二個原因。

## 軟連線

軟連線又叫做符號鏈結,它類似於windows系統的快捷方式。與硬鏈結不同的是,它沒有引用計數,並且它擁有自己的inode。也就是說,軟連線檔案的inode與原始檔不同。

如何實現鏈結的呢?我們可以理解為,軟連線檔案也是乙個文字檔案,不過它裡面包含了原始檔的位置資訊。如下圖:

我們可以用ln指令的-s選項建立乙個檔案的軟連線。

Linux檔案鏈結命令 軟連線與硬鏈結

ln命令 該命令在檔案之間建立鏈結。這種操作實際上是給系統中已有的某個檔案指定另外乙個可用於訪問它的名稱。對於這個新的檔名,我們可以為之指定不同的訪問許可權,以控制對資訊的共享和安全性的問題。如果鏈結指向目錄,使用者就可以利用該鏈結直接進入被鏈結的目錄而不用打一大堆的路徑名。而且,即使我們刪除這個鏈...

linux硬鏈結與軟連線

linux通過鏈結來為檔案向使用者程式提供多個入口,linux鏈結有兩種 一種稱為硬鏈結 hard link 另一種稱為符號鏈結 symbolic link 也常被稱為軟鏈結,預設情況下,命令產生硬鏈結。硬鏈結通過索引節點 inode 進行鏈結,這樣多個檔名指向同乙個索引節點,也就使得乙個檔案可以擁...

Linux 軟連線與硬鏈結

檔案都有檔名與資料,這在 linux 上被分成兩個部分 使用者資料 user data 與元資料 metadata 使用者資料,即檔案資料塊 data block 資料塊是記錄檔案真實內容的地方 而元資料則是檔案的附加屬性,如檔案大小 建立時間 所有者等資訊。在 linux 中,元資料中的 inod...