一文看懂linux软链接与硬链接

一文看懂linux软链接与硬链接

Posted by ivo on September 21, 2018

先做一道题,通过这道题来说明一下

echo hello > a
ln a b
ln -s a c
rm a
echo world > a

此时 cat b,cat c 他们的内容分别是什么

下面是分析过程

第一步 echo hello > a 将hello这个字符重定向到a这个文件里面,因为没有a这个文件,所以后创建一个a文件,与之对应的会有一个文件a的inode值,此时假设这个值是155666(通过ls -i a可以看到)

第二步 ln a b 是用a的inode创建一个硬链接b,此时这两个文件的inode值都是一样的155666,只是这一个inode对应了两个文件名一个叫a,一个叫b。文件名称不一样但是文件内容是一样的,此时任意修改a或b保存后都会对文件内容造成修改,都会影响到另一个文件访问时候文件的内容。但是删除a还可以用b来访问文件。inode与文件名有对应关系,当没有文件名与inode对应的时候系统就会回收这个inode号码还有block

第三步 ln -s a c 用a作为源创建了一个软连接,此时 ab的inode一致 155666,但是c会与他们不一样假设这个值是 147649,此时a文件或b文件的内容是c文件的路径,所以此时cat a b c 内容都是hello

第四步 rm a 删除a文件 因为inode 155666与b还有对应关系,所以cat b的话内容依旧是hello,但是文件c是文件a的路径此时c的inode还是 147649这个inode下没有真实的内容,所以此时cat c 会得到cat: c: No such file or directory

第五步 echo world > a 将world这个字符重定向到a文件里面,和第一步一样是新创建了一个文件,所以会产生引得inode与文件来对应,所以此时a文件的inode会发生变化。但是此时因为没有其他的操作所以b的inode还是155666,c的inode还是147649,c依旧a文件的路径。那么此时cat b的话,b对应的是inode 155666里面的文件内容所以 cat b得出的结果是第一步时候创建的文件的内容hello。cat c因为c一直是a文件的路径,它一直指向的a的文件名而不是a的inode所以此时cat c的结果是第五步生成的a文件的内容 world。

综上,软链接指向的文件的名称,它是以文件名来指向的。硬链接则指向的是文件的inode值。

参考链接http://www.ruanyifeng.com/blog/2011/12/inode.html