inode: ext文件系统的每个目录与文件都有一个inode与之对应,inode里保存了文件和目录实际存储内容的data block的号码,简而言之就是inode是一个文件索引
硬链接: 建立一个与源文件inode相同的文件,也就是说文件名不同,inode相同,data block也相同,运用编程语言的思想,一个文件和他的硬链接可以理解为是一个对象(文件)的两个引用(文件名)。所以我们修改其中一个文件,另一个文件看到的内容也会跟着变化,当我们删除其中一个文件,另一个文件的内容也不受影响。(ps: 目录是不可设置硬链接的,原因是对目录建立硬链接,会使的目录下的所有文件和目录也建立硬链接,造成很大的复杂度。但是新建目录的时候 . 和 .. 这两个目录实际上是当前目录和上级目录的硬链接,我们新建目录的时候查看目录的连接数便可看出来)
例如我们执行以下shell
alexis@idiotic-youth:~/tests$ ls -li total 0 524759 -rw-rw-r-- 1 alexis alexis 0 Nov 7 17:07 test alexis@idiotic-youth:~/tests$ ln test test2 alexis@idiotic-youth:~/tests$ ls -li total 0 524759 -rw-rw-r-- 2 alexis alexis 0 Nov 7 17:07 test 524759 -rw-rw-r-- 2 alexis alexis 0 Nov 7 17:07 test2 alexis@idiotic-youth:~/tests$ rm test2 alexis@idiotic-youth:~/tests$ ls -li total 0 524759 -rw-rw-r-- 1 alexis alexis 0 Nov 7 17:07 test alexis@idiotic-youth:~/tests$
请注意看粗体字部分,当我们建立hard link后,test和test2的inode是一样的,这代表他们使用相同的data block,并且连接数加1,说明这个inode一共有两个文件指向它。删除test2以后,test不受影响,inode连接数减1。其原理如下图
当删除test2以后
软链接: 建立一个与源文件的inode不同的文件,它是一个特殊的文件,文件里包含的是指向原始文件的绝对路径,相当于windows的快捷方式,当我们访问链接文件时,相当与跳转到了源文件,当我们修改软链接文件时,源文件也会跟着被修改,删除源文件,软链接便会失去作用。
参见如下示例
alexis@idiotic-youth:~/tests$ ln -s test test2 alexis@idiotic-youth:~/tests$ ls -li total 0 524759 -rw-rw-r-- 1 alexis alexis 0 Nov 7 17:07 test 560971 lrwxrwxrwx 1 alexis alexis 4 Nov 7 19:12 test2 -> test alexis@idiotic-youth:~/tests$ rm test alexis@idiotic-youth:~/tests$ ls -li total 0 560971 lrwxrwxrwx 1 alexis alexis 4 Nov 7 19:12 test2 -> test
建立软链接并不会增加源文件的连接数,当删除源文件后,链接文件会用特殊颜色标志出来,其原理如下图
当源文件test被删除以后,则变成下图,以至于test2无法打开