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) 是有可能的。

另外關於

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!