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 是也。就好比宋七力有一個本尊﹐同時也有好些分身﹐但如果一旦本尊毀掉﹐那分身也跟著滅亡﹐道理是一樣的。 |
代碼: |
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 兄的說明吧...