硬链接是一个目录条目(在基于目录的文件系统中),它将一个名称与一个文件关联起来。因此,每个文件必须至少有一个硬链接。为文件创建额外的硬链接可以使该文件的内容可以通过额外的路径访问(即通过不同的名称或在不同的目录中)这会导致别名效应(alias effect):进程可以通过任意路径打开文件并修改其内容。相比之下,文件的软链接或“快捷方式”不是指向数据本身的直接链接,而是指向一个硬链接或另一个软链接的引用。
在我看来硬链接可以理解为数据的指针,而软链接则是指针的指针
硬链接
每个目录本身都是一个特殊的文件,只是它包含一个文件名列表。因此,多个硬链接到目录是可能的,这可以创建一个循环目录结构,而不是像树一样的分支结构。因此,有些文件系统禁止对目录创建硬链接。
此外,还有其他一些硬链接限制
-
硬链接只能创建在同一文件系统上。这也很好理解,不同文件系统文件实现都不一样
-
指向单文件硬链接最大数量收到引用计数器大小限制
并且,硬链接存在使处理目录树程序复杂化的问题,比如tar。
兼容posix的操作系统,如Linux、Android、macOS和Windows NT系列,支持对同一个文件的多个硬链接,具体取决于文件系统。例如,NTFS和ReFS支持硬链接,而FAT不支持。
软链接
实现软链接方式有两种
- 慢符号链接:将符号链接信息作为数据存储在普通文件中。该文件包含指向链接目标的文本引用,文件模式位表示该文件的类型是符号链接。
- 快符号链接:允许将目标路径存储在用于在磁盘(inode)上存储文件信息的数据结构中。该空间通常存储分配给文件的磁盘块地址的列表。因此,目标路径较短的符号链接会被快速访问。具有快速符号链接的系统在目标路径超出可用的inode空间时,通常会退回到使用原始方法。
尽管快符号链接在inode中存储链接值会保存一个磁盘块和一个磁盘读取操作,但操作系统仍然需要解析链接中的路径名,这总是需要读取额外的inode,通常还需要读取其他(可能是许多)目录,处理文件的列表和每个文件的inode,直到找到与链接的路径分量匹配的路径。只有当链接指向同一个目录中的文件时,“快速符号链接”才能提供比其他符号链接更好的性能。
绝大多数兼容posix的实现都使用了快速符号链接。但POSIX标准并不要求为符号链接实现与普通文件相同的全部文件状态信息。这使得实现可以使用其他解决方案,例如将符号链接数据存储在目录项中。
在unix中实际是怎么实现
在unix中,文件由数据部分和文件名称补充组成
- 数据部分:关联inode,储存实际数据在哪里、文件权限等信息
- 文件名称部分:携带文件名和inode number
在文件名称部分存在不止一个指向同一个inode number,那么这样的文件称之为硬链接
硬链接只有在所有引用的硬链接文件删除之后,文件数据才会被删除。相比于所有指向的指针消失了,才会被垃圾回收
软链接即使删除了,对引用的文件也没有影响
如果引用的文件被移动、重命名或者删除,那么该软链接会仍然指向旧文件位置
对于某些特殊文件类型,其数据部分携带指向另一个文件的路径,那么操作系统就会认为是路径,从而重定向打开。而这种文件就是软链接
那么对于目录,就是文件的文件名部分与其他文件的文件名部分一起存储的一个特殊的文件。
当构建一个目录时,它最初是由两个特殊文件的文件名(.
和..
)部分填充的。是指向当前目录和当前目录直接父目录的文件的硬链接。
Linux建立软硬链接命令
具体建立软、硬链接操作如下
# 为文件f.file建立软链接
ln -s f.file softlink.file
# 为文件f.file建立硬链接
ln f.file hardlink.file
Ref
- https://en.wikipedia.org/wiki/Hard_link
- https://linuxgazette.net/105/pitcher.html
- https://en.wikipedia.org/wiki/Symbolic_link