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