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
我將我的個人見解轉貼一次如下:
剛巧昨天我在 news 上也討論過 link 的問題,茲錄如下:
因此,不管是 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 兄的說明吧...