软链接和硬链接
如何建立软连接?
ln [-s] target link
软链接是通过名字引用另外一个文件,相当于 Windows 上的快捷方式。

那么软链接的文件和被链接的文件的 inode 是否一样呢?软链接的意义是什么?下面进行对比。
如何建立硬链接?
ln target link

可以看见硬链接的文件 redir-hard 和 test 的文件大小是一样的,相当于 test 的备份。那么二者的区别是什么呢?
区别与原理

可以看见软链接的文件 redir-soft 和 test 的 inode 是不一样的,且文件大小很小。而硬链接文件 redir-hard 和 test 的 inode 是一样的,但是文件大小是一样的。
软连接是一个独立的文件,因为它有独立的 inode。既然是一个独立的文件,文件 = 属性 + 内容,属性有独立的 inode,那么内容存的是什么呢?软连接指向的文件的路径字符串。
硬连接不是一个独立的文件,因为它没有独立的 inode。本质是在指定目录下,建立新的文件名和目标 inode 的映射关系,并没有在系统层面创建新的文件。我们可以发现 test 的链接数会由 1 变为 2。并且硬链接是链接文件的备份,那和 cp 有什么区别呢?
一个 inode 可以被几个文件名(目录项)引用,那么数字就是几。这是否意味着文件实际上在底层用了引用计数的方法。实际上底层就是这样使用的,每增加一个硬链接,链接数 +1;删除一个,链接数 -1。只有当链接数变为 0 时,inode 才会被真正释放,文件数据才会被删除。而对于 cp 是拷贝其内容,是一个独立的文件,即有自己的 inode,有自己的文件大小,并不会影响被拷贝文件的硬链接数。
那么,硬链接一个文件是否会多占空间呢?并不会,硬链接只是改变硬链接数,都指向同一个 inode,底层的数据块只有一份,文件内容只存储一份。
注意:可以给目录/普通文件设置软连接。但硬连接,用户层面不允许对目录设置硬连接!为什么呢?
假设 find 查找 note29 目录的某个文件,而 note29 硬链接 home 目录,当打开 note29 时,又通过 note29 回到 home 目录,从而导致无限循环下去,无法终止,形成路径回环问题。
那为什么 OS 允许 . .. 两个文件 硬链接 目录 啊?这两个是做了特殊处理的,当 find 查找时,会对 . 和 .. 进行特殊处理。




