歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> 關於Unix >> 軟鏈接與硬鏈接的區別

軟鏈接與硬鏈接的區別

日期:2017/3/6 15:29:36   编辑:關於Unix
hard link 與 soft link 弟最近想要搞懂 hard link 和 soft link ,於是查了 study area 裡面的資料 (包含網頁與討論區部份),接著弟又查了書上的資料和網路上面的資料,發覺網頁的解釋部份有點問題。另外再看到這一個討論串,也發現了一些問題。首先是 網頁

hard link 與 soft link

弟最近想要搞懂 hard link 和 soft link,於是查了 study area 裡面的資料 (包含網頁與討論區部份),接著弟又查了書上的資料和網路上面的資料,發覺網頁的解釋部份有點問題。另外再看到這一個討論串,也發現了一些問題。首先是網頁的部份:
引言回覆:
如果用 hard link 的話﹐檔案系統會再建立一個 inode﹐其指向的磁碟位置和原來的檔案位置一樣﹐而所有指到這個位置的 inode 都會更新其 link 指標﹐hard link 越多﹐指標越多。
.......................
那 soft link 又是什麼呢﹖和 hard link 不一樣的地方是﹕它並不是以 inode 指向相同的磁碟空間﹐而是單純的指向原來的 inode 而已﹐如果原來的 inode 移除了﹐那這個 link 就變為無主孤魂了﹐也就是所謂的 dead link 是也。就好比宋七力有一個本尊﹐同時也有好些分身﹐但如果一旦本尊毀掉﹐那分身也跟著滅亡﹐道理是一樣的。

這邊有關 inode 的部份似乎講反了。
hard link 並沒有另外建立一個 inode,而是增加一個 directory entry,內容為原始檔案的 inode number、這個 hard link 的檔案名稱和其他相關資訊,所以 hard link 的 inode number 跟原始檔案的 inode number 是一樣的。在建立 soft link 的時候才會建立一個新的 inode 指到原始檔案的 inode,所以 soft link 的 inode number 跟原始檔案的 inode number 不一樣。這也是為甚麼 hard link 只能指向同一個檔案系統裡面的檔案,因為每個檔案系統都有它自己一系列的 inode,兩個不同的檔案系統可能有相同的 inode number。而 soft link 具有完整的 pathname,所以他可以跨越不同的檔案系統。範例:
代碼:
octapult@mydebian:~/temp$ ls -li
總計 0
octapult@mydebian:~/temp$ dd if=/dev/zero of=test bs=128 count=1
讀入了 1+0 個區段
輸出了 1+0 個區段
128 bytes transferred in 0.001447 seconds (88456 bytes/sec)
octapult@mydebian:~/temp$ df -i
檔案系統 Inode (I)已用 (I)可用 (I)已用% 掛載點
/dev/hda1 904960 127338 777622 15% /
octapult@mydebian:~/temp$ ln test 1
octapult@mydebian:~/temp$ df -i
檔案系統 Inode (I)已用 (I)可用 (I)已用% 掛載點
/dev/hda1 904960 127338 777622 15% /
octapult@mydebian:~/temp$ ln -s test 2
octapult@mydebian:~/temp$ ls -li
總計 8
517530 -rw-r--r-- 2 octapult octapult 128 2002-11-23 01:36 1
517531 lrwxrwxrwx 1 octapult octapult 4 2002-11-23 01:37 2 -> test
517530 -rw-r--r-- 2 octapult octapult 128 2002-11-23 01:36 test
octapult@mydebian:~/temp$ df -i
檔案系統 Inode (I)已用 (I)可用 (I)已用% 掛載點
/dev/hda1 904960 127339 777621 15% /



再來是關於這個討論串的部份:

hard link 本來就會佔空間,不包含檔案名稱的話,就要用掉 8 bytes,檔案名稱一個字元一個 byte,所以總長度並不固定。假設一個 block 為 4K bytes、一個 hard link 平均為 16 bytes 的話,建立超過 256 個 hard link 的話,就需要再另外增加一個 data block 來存放新的 hard link 了,所以建立新的 hard link 的時候,du -b 的結果會增加一個 block (4K bytes) 是有可能的。

另外關於 hard link 和 soft link 那一個比較佔空間的問題,就要看我們以甚麼角度去看了。如果純粹以佔用硬碟空間的角度來看的話,應該是 soft link 比較佔空間。hard link 的長度為 8 bytes + 檔案名稱的長度。soft link 至少用掉一個 inode,一個 inode 為 128 bytes,如果pathname 小於 60 characters 的話,剛好可以存進 inode 的 i-block 裡面 (12 x direct blocks 指標、single indirect、double indirect、triple inderect,總共剛好 15 x 4 bytes);假如 pathname 超過 60 characters 的話,還需要多一個 data block (4K bytes) 來存放。可是如果我們以檔案佔用多少 data block 來看的話 (du 指令),hard link 比較佔空間,因為du 並沒有把檔案系統的資料結構所佔的空間算進去,除非 soft link 的 pathname 過長,多佔了一個 data block。

先了解 directory 與 file 的差別吧,見另篇討論:
http://phorum.study-area.org/viewtopic.php?t=17506
我將我的個人見解轉貼一次如下:

    一個 dir 其內容其實就是其下包有哪些 file name(含 sub-dir),及其對應的 inode number 。
    而一個 file 其內容就是本身的資料。
    以 /etc/sysconfig.network 為例。
    從 / partition 讀取 2 號 inode ,可得到 / 的 block ,
    其下可得到 etc 的 inode ,再可的到 /etc 的 block ,
    其下可得到 sysconfig 的 inode ,再可得到 /etc/sysconfig 的 block ,
    其下可的到 network 的 inode ,再可得 /etc/sysconfig/network 的 block ,
    最後讀取 block 就是其內容了。


剛巧昨天我在 news 上也討論過 link 的問題,茲錄如下:

    "閒雲朵朵 朵朵閒雲" <[email protected]> 撰寫於郵件
    news:47CDYV$[email protected]...

    > 補充一下,

    我也來補充一下 ^_^

    > 不常去注意,印象中是這樣的:
    >
    > hardlink 是直接指向硬碟中的同一個區塊,
    > softlink 則是先指向檔案系統中連結的檔案,
    > 再由該檔案去指向硬碟中的區塊.

    hardlink 指向同一個 inode ,
    再從 inode 得知 block 的位址,
    讀取 block 就得知 content 。

    softlink 使用另一 inode ,
    但它只是一個 pointer ,指向另一 path 。

    >
    > hardlink 無法跨越檔案系統, softlink 則可以,
    > 一般而言,是以 softlink 為主,hardlink 比較少用,
    > 因為 hardlink 無法跨越磁碟分割區.

    因為 inode 的關係(不同的 partition 有相同的 inode ),
    所以 hardlink 不能跨 parition 。
    但 softlink 是指向 path ,
    因此只要 mount point 建立好,就可找得到 pointer 所指的 object。

    除了 partition 的差異,
    hardlink 不能 link 目錄,soft link 則可。
    至於為甚麼?我就不清楚了... (請其他朋友幫忙說明一下吧)

    還有,hard link 建立之後,file 本身的 link count 會增加。
    假如將 source file 砍掉,其 block 並不會釋放出來,
    也就是原有 content 還在。
    但若是用 soft link 的話,link count 不變,
    若將 source file 砍掉,pointer 所指的 path 就找不到了,
    也就會得到 file not found 的 error 。
    若 source file 之 link count 在刪除後扣掉為 0 ,
    則原有 block 就會釋放出來,
    content 就有可能被其後使用該 block 的資料覆蓋掉。
    如果 file 本身的 attribute 帶有 s flag,
    那在 deletion 之後其 block 將全部歸零處理,
    就算拿到 disk 重讀該 block 也不能還原資料。
    不過,man chattr 有提到 u flag ,
    在 deletion 時會被 save 起來,以便 undelete 處理。
    不過,不知現階段 linux file system 的 undeletion 是否有 implement 呢?

    一些個人見解,給大家參考。謝謝﹗

    --

    =======
    http://www.study-area.org =======
    飛雪迎春到﹐風雨送春歸
    已是寒崖百丈冰﹐尤有花枝俏
    俏也不爭春﹐只把春來報
    待得山花爛漫時﹐他在叢中笑﹗



因此,不管是 hard link 還是 soft link
都會在 directory 的 content 中增加一行 entry ,
hard link 因為用同一 inode ,因此也是用相同的 block(s) ,故此空間不會多出來。
但 du 卻不管這套,它只單純算出"每一 entry 所代表"的用量而已,卻不管兩個 entries 是否為同一 inode 。
要是 soft link ,因為本身就要消耗 inode table entry,因此肯定回用掉一些空間。
但是否為 data block 上的空間呢?不需要,用掉 inode table 的空間而已。
因為 soft link 只需在 pointer 上記錄 path name 就行,
而具體的 size (如 60 characters )情行如何,請重看 octapult 兄的說明吧...

Copyright © Linux教程網 All Rights Reserved