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 来存放新的






