一.软硬链接操作
1.软连接
touch 创建一个文件file.txt ,对该文件创建对应的软链接改怎么做呢?
ln -s file.txt file-soft.link .给对应文件创建软连接。
软连接本质就是一个独立的文件,因为我们对应的软连接有独立的inode,他和他指向的file.txt的inode是不同的。
如下图:
我们把字符串写入file.txt中,查看两个文件的内容,都能看到该字符串,说明实际在用户层使用我们的软连接,等同于我们的目标文件。软链接是通过名字引⽤另外⼀个⽂件,但实际上,新的⽂件和 被引⽤的⽂件的inode不同
2.硬链接
硬链接的使用方法,对文件file.txt怎么创建硬链接?
ln file.txt file-head.link.给对应的文件创建硬链接。
硬链接本质上不是一个独立的文件,没有独立的inode,而是相同的inode,不同的文件文件名。
在Linux中可以让多个文件名指向同一个inode。
如上面图片所示,权限后面这个数字是什么呢?没创建硬链接时,数字为1,创建硬链接后数字变成2,这个我们先引出来,后面说!!
Linux中搞懂操作是没什么用的,就跟之前创建进程,等待进程,说了操作,接口讲完没有用,最关键的是他在干什么?下面我们来认识如何理解软硬链接!!!
二.如何理解软硬链接
a.软硬链接有独立的inode,所以一定要有独立的属性和内容,软链接内容上,保存的是目标文件的路径,在Windows中,相当于一个软件在桌面上的快捷方式,所以平时用的这些快捷方式也是一个软连接文件,Linux中,软连接就是指向文件的快捷方式!!
b.硬链接,不是独立的文件,没有独立的inode,硬链接本质就是一组文件名和已经已经存在的文件的inode的映射关系!!!
c.所以当我们建立了软连接,就是相当于在当前目录下建立了一个软连接文件,快捷方式,而其中,我们建立一个硬链接,就是在我们当前所处的目录当中新增加一个文件名和要链接文件的inode的映射关系,所以最终,我们就会发现,这个硬链接文件,他所查到的inode和目标文件inode是一样的了,这个就是硬链接!!!
d.文件权限后面对应的数字是什么呢?创建硬链接文件前,目标文件数字为1,创建硬链接文件后,目标文件变成2?
根据前面讲的文件系统内容,知道了,一个目录也是文件,他的内容保存的是该目录下文件的文件名和inode的映射关系,所以在我们当前目录中,新建一个普通文件,题目文件名不在inode中保存,普通文件的文件名是在我们的文件所处的目录文件他的内容中保存的,创建一个硬链接文件,换句话说,就是在当前目录中有两个文件名,他们两个都会映射到同一个inode,这像什么呢?inode特别像一个指针一样的东西,所以当我们想使用文件名找文件的时候,我们都知道Linux下是通过inode找文件,两个文件的inode相同,所以本质上就是相当于有两个文件名指向同一个inode,换句话说,我作为一个inode,作为一个文件,什么时候在系统上算真正的删除呢?是不是要在整个系统里,没有任何文件名字符串和我这个文件inode的有映射关系时,也就是这个文件没有名字了,这个时候对应的文件就应该被删除了,可是我们怎么知道有多少个文件名通过ionde编号,来和我对应的文件的inode来产生关系呢?答案是在我们inode中,存在一个引用计数的东西,int ret_count,也就是说,今天在一个特定的目录下有一个文件名映射的inode是该文件,ret_count就会++,再有一个文件名和这个文件inode有映射关系,再++,所以我们对应的这个数字,称之为inode本身的引用计数,被称之为硬链接数!!!
e.如果我们对目标文件进行删除会怎么样?
对目标文件进行删除,硬链接还在,里面的内容还能打印出来,这个文件并没有被删除,所以这个删除做了一个什么工作?对目标文件进行重命名的工作,所有平时建立一个普通文件本质上都在不断进行建立硬链接,建立一个文件,本质就是硬链接文件,因为你的文件名和你的inode映射关系就相当于一份,所以删除,目标文件就减少一份,再把剩余的硬链接删除掉,引用计数变为0,文件系统中就会把你对应的这个inode直接删掉了。
删除目标文件,软链接就会变红,因为软链接文件中存的是目标文件的路径,目标文件找不到,软连接也就找不到了。
总结:
其实软链接说到底,其实就相当于,软链接就是一个普通文件,他的内容保存的是目标文件的路径,所以目标文件删除了变成红色,是因为这个软链接文件保存的目标文件的路径没有了,找不到了,而所谓的硬链接就相当于在当前目录下保存一下文件名和inode的映射关系,没有创建新的文件。
三.为什么要有软硬链接呢?各种应用场景
软链接:
a.如果我们创建一个可执行程序code.exe,在命令行上要执行该文件是 ./code.exe 如果我们想要 ./code 就直接可以执行,我们该怎么办?
之前说过,可以把当前路径增加到环境变量或者把可执行文件拷贝到系统默认路径下,就可以不带 ./ 直接执行。
现在我们学了软链接,就可以在当前路径下直接创建软链接:
ln -s code.exe code这样就创建了一个软链接,就直接可以 ./code 直接执行该可执行程序。
如果想不加 ./ 呢?
可以在 /usr/bin/ 路径下建立软链接,/usr/bin/ 是系统存放可执行文件的默认路径,这样就直接进行code就可以执行,创建快捷方式,直接建立软链接,就可以指向目标程序了。
删除一个软链接文件:一个rm 一个unlink
b.如果可以执行程序藏在一个比较深的路径下,比如 ./dir1/dir2/dir3/ 里,我们要在当前所处的路径使用可执行程序,就必须带一串路径,所以我们可以在当前路径下创建软链接。
c.我们也可以给一个目录形成一个软链接,比如 /usr/inlude/ 我想查看头文件,就可以给这个目录创建一个软链接。
d.软链接就是为了快速定位文件,以最简单的方式进入!!!
e.作用:快捷方式
最主要用途:快速找到指令,快速找到对应的库
硬链接:
a.在一个目录里创建一个普通文件和一个目录,普通文件的引用计数是1,是因为在当前目录中只有一个文件名与该inode有映射关系,那为什么新建一个目录,他的引用计数是2呢?进入这个目录中,再新建一个目录,引用计数为什么变成3了呢?
因为在目录里面有一个 . 文件和 .. 文件,之前说过,一个点表示当前目录,两个点表示上级目录,那么一个点凭什么表示当前目录他自己,一个点他是一个文件名,他所映射的inode和当前所处的目录的映射的inode是一样的!!文件名不同但指向的文件是一样的,所以一个点就表示当前工作路径,所以再在新建的目录中创建一个新目录,里面有两个点的文件名,他映射的inode与上级目录映射的inode相同,所以此时就有三个文件名指向同一个文件,所以,引用计数是3,所以我们在Linux中,在每一个目录下都要有一个 . 和 .. 呢?就是为了进行路径切换!!!
b.创建一个文件,在一个目录比如 /tmp/ 下,给这个文件创建一个硬链接,这时,如果误操作,把原本文件进行了删除,但是没关系,因为我们在特定的路径下,有一个该文件的硬链接文件,我们照样可以通过该硬链接文件拿到该文件的内容,这意味着什么?这意味着,在Linux下,对文件做备份,只需要建立硬链接文件就可以了,不需要拷贝了!!!
c.我们现在可以对普通文件做硬链接,那么我们可不可以对目录进行建立硬链接呢?
Linux中,不允许对目录新建硬链接文件,因为主要怕,新建硬链接形成一些环状路径,进而导致系统出现问题,但是目录里面 . 和 .. 不都是当前目录和上级目录的硬链接文件吗?这该怎么理解呢?不怎么理解,因为这是Linux特殊进行处理的!!!
目录创建硬链接形成环状路径的危害
- 文件系统遍历异常:文件系统的遍历算法通常是基于树形结构进行的,假设可以对目录创建硬链接形成环状路径,当系统或应用程序尝试遍历目录树时,就可能陷入无限循环,无法正常完成遍历操作,导致程序挂起甚至系统崩溃。
- 元数据更新混乱:目录的硬链接会使得目录的元数据(如目录的链接数、修改时间等)管理变得极为复杂且容易出现混乱。例如,当通过一个硬链接对目录进行修改时,很难确定应该如何正确更新其他硬链接所指向的同一目录的元数据,可能导致文件系统的元数据不一致,进而影响文件系统的稳定性和可靠性。
- 权限管理复杂:在 Linux 中,权限是基于文件和目录的 inode 进行管理的。如果存在目录硬链接形成的环状结构,权限的继承和传播会变得非常复杂,可能导致权限漏洞或错误的权限设置,威胁系统安全。