通过我们前面理解文件系统的基础上,我们来理解软硬链接,在我们学习文件的时候我们会见到各种链接文件,其中链接文件分为两种,一种叫软连接,一种叫硬链接。
下面我们新建一个log文件,要对log这个文件进行软链接我们该如何实现呢?
所以此时我们就用这一条命令
ln -s? log log.soft.link
使用后者链接前者。回车之后:
此时我们再执行这条指令
ll -li
我们发现log这个文件的inode没有发生变化,1054696和1054697是两个独立的文件,这个log.soft.link我们就称之为软链接。
下面我们再创建一个hello 文件,然后对这个文件进行硬链接:
此时我们就看到这两个文件进行硬链接之后inode是一样的。所以我们得出一个结论:软链接是一个独立的文件,硬链接没有独立的inode编号。
软链接其实就是类似于windows系统下的快捷方式,软链接内容是指向的目标文件的路径。
我们除了可以直接通过这个谷歌浏览器的快捷方式来打开它,同时也可以通过该快捷方式的目标文件的路径找到这个可执行程序双击之后打开它。
为什么要有快捷方式呢?因为我们平常要运行一个程序都是通过找到.exe这个程序双击之后运行起来,但是一般我们的可执行程序的路径可能都比较深,不方便用户进行查找,所以我们可以通过软链接的方式把这个可执行程序的路径作为软链接文件的内容,然后把这个软链接文件(其实就是快捷方式)放到我们经常使用的桌面上就可以快速找到它,那么在linux下也有这样的例子,下面我们可以进行一下简单的测试:
下面我们新建一个.c文件:
然后在myproc.c这个 文件里面写简单的测试代码:
下面我们对这些代码进行编译一下,然后运行:
未来我们做的一些项目,或者是企业做的一些项目,它不是把这个myproc.exe文件暴露在外部,它可能是把整个项目有一个特定的目录配置成的,比如说一般项目proj下都有bin目录,conf目录,log目录,一般可执行程序都是在bin目录下的。
所以项目一般都是这么打包的。
下面我们如果想访问这个项目的可执行程序,我们要执行可执行程序还得这么去运行:
如果我们用一个文件对这个可执行程序进行软链接:
这样就可以更方便的运行用户需要的可执行程序或者项目了。所以我们就可以通过在外部对可执行程序进行软连接进行快速定位指定的文件了。所以软链接的应用场景就是可以快速定位文件,这是其一。如何去理解软链接呢?类似于windows的快捷方式,独立文件,有独立的inode.软链接的内容是指向的目标文件的路径。
下面我们来谈谈硬链接:
硬链接不是一个独立的文件!硬链接是什么?
硬链接就是在指定目录内部的一组映射关系:文件名<——>inode的映射关系!
这里我们相当于是对同一个文件进行了不同的取名,所以这个数字2和1应该是对应的inode于文件名之间进行映射的数量 ,当我们删除hello之后数字2变成了1,所以一个文件什么时候会被删除呢?答案是没有文件名和inode进行映射时(也就是说没有人用这个文件了),那么在文件系统层面,目标文件怎么知道没有文件名指向我了呢?inode内部有引用计数,表明有几个文件名映射关系。
文件名在目录里面具有唯一性,其实我们可以把文件名看成一个指向inode的指针,一旦有新的文件名指向inode,那么inode对应的引用计数那个变量就可以++,直到该引用计数变为0的时候说明这个文件被删除了。我们把这个引用计数的变量叫做硬连接数。
下面我们再来对硬链接的一些使用场景进行测试:
我们新建了一个newfile文件,同时在新建一个目录newdir,那么我们发现,为什么新建一个文件的硬链接数是1,而我们新建一个目录的硬链接数是2。这个普通文件只有一个硬链接数其实我们很容易理解,因为这个inode只有这一个文件名与之建立映射,而这个新目录newdir的硬链接数为什么是2呢?
当我们进入newdir这个目录执行ll -lia这条命令,我们就可以看到两个隐藏文件,一个是.? , 另一个叫做 .. 。 而.是指的当前目录,另一个..指的是上级目录,而这个当前目录.其实就是指的newdir对应的inode这个文件,所以与inode建立映射关系的有newdir 和 .
而如果我再从newdir目录下建立一个新的目录dir,然后我们就会发现,这三个文件的inode都是一样的,所以自然该inode的硬链接数就是3了。
区别就是软链接是一个真正的文件,有自己的文件名,inode和属性,内容。而硬链接就是文件名与inode建立的一个映射关系。而用户无法对目录建立硬链接。