软链接
使用指令ln -s 被链接的文件 生成的软链接文件
便可以创建软连接文件,ln是link的简写表明当前要创建链接文件,s是soft的简写表明当前创建的链接文件为软链接文件,然后加上被链接的文件,最后写上生成的链接文件的文件名比如说下面的图片:
这里生成了一个软链接文件,并且使用ls -l指令显示文件时会将这个文件所链接的文件也显示出来,使用指令ls -li指令
可以查看每个文件对应的inode
通过上面的图片可以看到软链接文件有一个属于自己的inode ,并且soft_mycode.link文件的属性也和源文件mycode不相同,比如说soft_mycode.link的权限为0777文件大小为6但是mycode文件的权限为0775大小为8360,那么这就说明当我们使用ln指令-s指令创建软连接文件时操作系统会给我们创建一个文件,这个文件有自己的属性和inode,虽然这个soft_mycode.link文件是新创建的,但是这个文件的执行结果却和源文件mycode是一样的比如说下面的图片:
那么这就是创建软链接的方法以及软连接的部分属性。
硬链接
单独使用ln不加选项就可以创建硬链接文件:ln 源文件 生成的硬链接文件
比如说下面的图片:
使用ls -li指令查看inode可以看到下面的现象:
我们发现硬链接文件的inode和原文件是一样的,但是软链接创建出来的文件inode和源文件是不一样的,所以软硬链接最根本的区别是:是否具有独立额度inode。软链接具有独立的inode可以被当做独立的文件看待,硬连接没有独立的inode所以不能被当做独立的文件来看待,硬连接的文件的inode和各种属性都和源文件相同,往源文件里面输入内容时源文件的大小不仅会发生改变而且硬链接文件的大小也会发生改变,比如说下面的操作:
一开始mycode.c文件大小为146,hard_mycode.link文件的大小也为146,我们使用vim工具往mycode.c文件里面写入数据之后mycode.c文件的大小变成了263,但是hard_mycode.link文件的大小也变成了263,但是上述操作对软连接执行一遍的话是不会发生改变,因为软连接链接的是生成的可执行程序,mycode可执行程序的大小为8360,soft_mycode.link文件的大小为6,使用make指令生成一个新的mycode程序再看看这里的属性的话就可以看到mycode可执行程序的大小发生了变化,但是soft_mycode.link文件的大小却没有任何变化:
那么这就更加说明了一点使用ln指令创建硬链接文件时根本没有创建新文件(因为没有分配独立的inode并且文件的性质还和源文件一摸一样),既然没有创建文件那么硬链接文件一定没有自己的属性集合和内容集合,所以他用的是源文件的inode和内容,之前我们讲过目录的数据块里面记录着文件名和inode的映射关系,而创建硬链接文件本质上就是在目录的数据块里面添加一个新文件名,并把该文件名指向的inode填入源文件的inode,所以一个inode可能会被多个文件名指向,所以在inode里面有个计数器,如果有一个文件指向这个inode的话,这个计数器的值就会加1,我们把一个对象里面有一个变量,这个变量用来表示有多少文件指向我的变量称为引用计数,也可以把他称为硬连接数,比如说当前的有两个文件名指向inode为1181179的文件
那么这个文件的计数器的值就为2,当我们吧mycode.c文件删除再查看文件属性时可以发现hard_mycode.link文件的链接数就变成了1
但是硬连接文件的内容和大部分属性都和之前没有变化,说明之前删除文件的时候并没有真正删除,只是删除了指向inode的一个文件名,只有当一个文件的硬链接数变成0时才会真正的删除一个文件,上述的过程也可以看做成给文件换了一个名字。删除源文件硬连接文件可以正常使用,但是删除软链接的源文件,软连接便无法正常使用比如说下面的操作,给一个文件创建一个硬链接和软链接,然后删除源文件就可以看到下面的现象:
硬链接可以正常使用,但是软链接已经发出警告无法正常使用了,而上面的删除并不是真正的删除文件名虽然不存在了但是文件的inode依然是存在的,那么这就说明软连接在查找源文件时根本不是通过文件的inode查找文件而是通过文件名来查找的文件,而在树状结构中查找一个文件名的方式就是通过绝对路径或者相对路径的方式进行查找,软连接也是一个文件他也有对应的数据块,所以在软连接文件的数据块里面就只保存着原文件的路径,这就是为什么删除源文件的文件名但是不删除inode软连接会失效的原因。
软连接的作用:
软链接的作用就是快速的执行另外一个路径的程序建立快捷方式。比如说当前的路径为:
我们可以创建一个mycode.c文件并往这个文件里面写入一些代码使其能够生成一个可执行程序,比如说下面的代码:
然后我们就可以前往一个其他路径比如说在当前路径下再创建一连串的目录,并前往最深处的目录,比如说当前的路径如下:
我们可以在这个路径下创建一个软链接,这个链接指向的是上面生成的那个程序:
那么我们就可以在当前路径中执行其他路径的程序,执行的结果如下:
这就是软连接的作用:创建其他路径的快捷方式。
硬链接的问题
为什么普通文件的硬连接的数是1?因为一个普通文件本身有一个文件名和自己的inode具有一个映射关系。那为什么新创建的目录文件的硬连接数是2呢?比如说下面的图片:
因为目录里面有两个隐藏文件 .和..
其中.
文件的inode和当前目录的inode是一样的都是1181184
而..
文件的inode又和上级目录的inode也是一样的都是1181178
所以这也是为什么.
可以表示当前目录,而cd ..
可以回到上级目录的原因。但是用户不能给目录创建软硬链接因为操作系统不相信用户。但是操作系统相信自己所以.
和..
就是给目录创建的硬连接。那么这就是本篇文章的全部内容希望大家能够理解。