软链接和硬链接
硬链接和软链接是文件系统中链接文件的两种方式。
笼统来说,硬链接就是多个文件名对磁盘数据的共同引用,软链接就是存储一个文件路径,通过该路径可以获取磁盘数据,可以理解为快捷方式。
如果只是想简单了解,上述描述已经够用了,下面的就可以不用看了。
一下只是较为详细的说明下硬链接的引用和删除有关的内容,至于其他的跨文件系统/卷啥的,这里不会提及。
硬链接和软链接最初是出现在Unix中的。后来又Linux对其进行继承和完善,Windows系统中最初是不存在任何形式的链接方式的,后来NTFS文件系统的出现,Windows系统出现了硬链接和符号链接(软链接),但Windows和Linux在硬链接和软链接的实现上还是有所区别的。
硬链接
硬链接只能链接文件,为了防止循环引用。
Linux中的硬链接
在Linux中的硬链接是多个文件共享一个inode(文件元数据标识符),指向相同的数据块,既通过该inode可以获取到磁盘数据。
(文件名是用户可见的标识符,而inode是文件系统内部的数据结构,我们是看不到的,用于存储文件元数据和数据块位置。每一个inode都是独一无二的。文件元数据既文件的描述信息,包括文件权限、类型、大小等,数据块位置既文件内容在磁盘上的物理存储位置。)
对于共享同一个inode的所以硬链接,它们的地位是平等的,删除任何一个,都不会影响到磁盘数据的消失,对于磁盘数据的删除,Linux的文件系统采用了链接计数的方式,既当有一个硬链接指向了磁盘数据对应的inode,其对应的链接计数就会+1,如果删除了一个硬链接,就删除了一个文件名对inode的引用,链接计数就会-1,当链接计数位0是,磁盘数据才会真正被删除。
由于硬链接是多个文件共享同一个inode,而inode存储着数据块位置,所以通过任意一个硬链接的文件名修改磁盘数据,通过其他硬链接访问到的数据都是被修改过的。
语法
ln <源文件> <硬链接名称>
1 | ln file.txt hardlink.txt |
Windows中的硬链接
Windows中的硬链接是根据NTFS的特性,允许多个文件名可以指向同一个文件数据。和Linux的硬链接类似,只不过Windows中采用的MFT条目,而不是inode。
所以一个硬链接的删除是不会导致文件数据的删除的,因为还存在其他硬链接的指向,同时通过一个硬链接的修改其他获取到的也是修改过的数据。
语法
mklink /H <硬链接名称> <源文件>
1 | mklink /H hardlink.txt file.txt |
软链接
软链接允许链接目录,但仍会造成循环引用,需要手动处理。
Linux和Windows中的软链接是一个独立的文件存储着目标文件的路径字符串。当存储的目标文件被删除,此软链接失效,成为悬空链接,再次通过软链接访问系统会报错。
但Windows中的软链接需要管理员权限,而Linux中不需要。
Linux创建软链接命令
ln -s <源文件或目录> <软链接名称>
1 | ln -s /path/to/file.txt symlink.txt |
Windows创建软链接命令
mklink <软链接名称> <源文件>
1 | mklink symlink.txt file.txt |
软链接和硬链接的区别
Linux中,软链接不直接共享硬链接的inode,而是通过存储的目标文件路径间接访问,是路径的别名。而硬链接直接共享inode,是文件实体的多个别名。
Windows中,把上述的inode概念改为MFT条目就行了。中存储着目标文件的路径,类似于快捷方式,当访问软链接时,会从磁盘数据中找到目标路径,再通过目标路径获得源文件,再访问真实数据,当目标路径的源文件被删除,软链接的指向不存在,系统就会报错。