linux中的硬链接和软链接,从linux的文件系统和文件节点这个角度来看,还是比较清晰的。
要查看关于linux文件系统和文件节点inode的介绍,可以看我的这一篇博客。
linux的文件系统结构、superblock和inode节点等介绍
下面就讲一讲linux中的硬链接和软链接。
1、硬链接
命令:ln file1 f_hard_link; 如下图,图里写明了创建硬链接的命令、创建前后文件链接数目的变化以及文件系统中节点数目的变化。硬链接本质:硬链接是一个特殊的文件,它本身并不创建inode,而是直接指向原文件的inode,相当于原本的文件多了一个文件名。硬链接名和原本的文件名指向同一个文件。这也就是为什么创建硬链接后,文件本身的链接数增加了1,文件系统的节点数目并没有变化。后边有示意图。一些要注意的点: 硬链接不会创建inode和block。而是直接使用原文件的inode。硬链接不可以跨越分区,不可以跨越设备。原因是硬链接本质是直接指向inode的,inode是各分区、各设备单独的。硬链接不能指向目录,原因是硬链接指向目录时,是指向了目录的inode。实际上硬链接需要指向目录下的每一个文件,那么每次目录下边文件更新,有增加或者删除文件时,包括目录里的子目录。硬链接都需要做对应的改变,这种情况十分复杂,目前就都不支持。删除原文件之后,实质上删除的是原文件名,硬链接还可以访问文件数据。原因是删除原文件名时,因为原文件的inode上引用数大于0,还有硬链接的这个引用,文件本体并不会被删除。
2、软链接
创建命令: ln -s file1 f_soft_link。实例截图如下,也同样截取了软链接创建前后节点数目的变化。由上图可以看出,软链接实际上是新建了一个inode,也就是说,是新建了一个链接类型的文件。它有自己的inode和block,block里存放的是原文件的路径。这也是它和硬链接不同的地方。
一些点:
软链接可以理解为一个快捷方式或者一个指针,指向原文件的地址。软链接会新建inode和block。删除原文件,软链接就无法正常使用了,如果重新创建一个文件,相同路径相同名字,软链接就可以继续访问。可以指向目录、可以跨分区。可以使用相对路径,但是这个相对路径一定要是相对于软链接文件的相对路径。
3、两者对照理解:
看下图,这个图还是比较能说明的。看这个图应该就能理解上边那些特性的原因了。
软链接有自己的inode和block,block里是原文件的路径。删除原文件,软链接的block里就指向null了,也就不能使用了。
硬链接直接用原文件file的inode,删除file,inode上还有引用数,就不会被删除,硬链接仍然可以打开文件。
下边这个图,是查看当前文件的inode,最左侧那一列就是文件的inode编号,可以看到,硬链接和原文件的inode编号是一样的,也就是说,他们指向同一个inode。
