当前位置: 首页 > article >正文

【Linux】理解Linux中硬链接和软链接

Linux中硬链接和软链接

  • 0 引言
  • 1 硬链接(Hard Link)
    • 1.1 让文件之间产生硬链接关系
    • 1.2 不能给目录创建硬链接
  • 2 软链接(Sort Link)
    • 2.1 让文件产生软链接关系
    • 2.2 目录也可以产生软链接关系
    • 2.3 软链接的应用场景
  • 3 总结

0 引言

在之前的文章中:Linux EXT2文件系统,我们讲到每个文件都有自己的一个inode,并且inode表里面并没有存储文件的名称,也就是说OS想识别一份文件,只要知道inode即可。那么文件名其实是给用户使用的,也就是说,每个文件名都有一个inode与之对应,这种对应关系本质上是一种硬链接,与之对应的还有软链接。下面将解释什么是硬链接和软链接。

1 硬链接(Hard Link)

硬链接是指通过索引结点来进行链接。
而这个索引结点就是我们的inode,通过硬链接的文件,inode是相同的,也就是说,一个inode可以对应多个文件。

1.1 让文件之间产生硬链接关系

$ touch test.txt//创建一份测试文件
$ ln test.txt hard_link_test//ln 命令不加参数默认硬链接
$ ll -il//查看文件的inode

在这里插入图片描述
我们可以看到这两个文件的inode是相同的,硬链接数是2
Linux中文件的硬链接数默认是1,因为一份inode与文件名硬链接。
然后我们刚才让test.txt和hard_link_test这两个文件产生了硬链接关系,所以现在是2。

这两份产生硬链接关系的文件中,当我们任意改变一份文件的内容,另外一份文件的内容也会随之改变。
在这里插入图片描述

当我们删除这两份文件中的任意一份,另外一份文件还得以保留。

1.2 不能给目录创建硬链接

需要注意的是,OS不允许我们给目录创建硬链接,虽然OS自己可以给目录创建硬链接,但是OS管理的一般比较好。

Linux的目录其实是一颗多叉树
在这里插入图片描述
如果OS允许我们给目录硬链接的话,就容易产生环形结构,当我们要定位目录下的文件的时候,就不能简单通过文件名去定位了。

$ mkdir test1
$ ln hard_test test1
ln: ‘test1’: hard link not allowed for directory
//不允许给目录硬链接

2 软链接(Sort Link)

Linux中,软链接就像Windows的快捷方式一样。
我们可以把软链接理解成一个链接或是一个路径,通过这个链接或路径我们打开指定的文件。

值得注意的是,上面说的硬链接只能在同一个文件系统下创建,而软链接可以指向不同的文件系统。 软链接的产生可以说就是为了摆脱这个限制的。

同时,目录不能产生硬链接,而可以产生软链接。

2.1 让文件产生软链接关系

$ ln -s test.txt sort_test//ln 加s参数就是软链接

我们可以看到这两份文件的inode并不相同
在这里插入图片描述

2.2 目录也可以产生软链接关系

$ mkdir test1//创建一个目录
$ ln -s test1 sort_test1//软链接该目录

我们可以看到,目录可以产生软链接关系
在这里插入图片描述

和硬链接一样,这两份文件当任意一方的内容发生变化时,另外一方也会同步发生变化。

创建软链接一定要使用绝对路径,不要像上面使用相对路径,否则可能会出问题。

当我们不想使用这个软链接的时候,像Windows系统下一样,直接删除这个快捷方式就好了。
当我们直接把软链接指向的路径文件给删了,这个软链接也就失效了。

在这里插入图片描述

2.3 软链接的应用场景

  1. 有时候我们总是需要执行很多的命令,而且执行的这些命令又是对应不同的目录的路径,有些路径真是又长有难记,敲出整个路径真是费劲,效率也变低了,这时候软链接的作用就体现出来了,把这些又长又臭的路径创建一个软链接到当前的路径下,是不是路径简单多了。
  2. 当我们想使用第三方库的时候,方便链接库。

3 总结

硬链接和软链接的区别就在于
1.硬链接产生的inode相同,软链接不同。
2.硬链接只能在同一文件系统使用,软链接可以指向不同的文件系统。
3.OS不允许我们将目录硬链接,软链接可以。
4.硬链接的文件,删除了一份,另外一份还得以保留。软链接的话,不能删除被指向的文件,否则软链接失效。

虽然硬链接和软链接的文件,都会随内容同步变化,但是在实际应用中硬链接使用的比较少,更多的是使用软链接。


http://www.kler.cn/a/7062.html

相关文章:

  • C指针之舞——指针探秘之旅
  • spi 回环
  • 物联网——UNIX时间戳、BKP备份寄存器、RTC时钟
  • PyTorch数据集方法
  • 搭建Spring gateway网关微服务
  • Linux下编译MFEM
  • 蓝桥杯真题2021c++省A题解
  • Vue3+vite2 博客前端开发
  • 【Verilog基础】二进制比较器
  • 一文讲清深力科工业与能源行业首选大电流 600V HVIC 高低边驱动产品SLM21814CJ-DG代替UCC27714DR 特性简述
  • 并发编程(十)-ScheduledThreadPoolExecutor源码分析
  • 代码随想录Day44
  • 蓝桥杯模板题目
  • 企业电子招投标采购系统——功能模块功能描述+数字化采购管理 采购招投标
  • 30 个常用 JavaScript 知识点总结
  • chatgpt大模型赋能人形机器人之我见
  • MySQL主从复制之多主多从部署流程—2023.04
  • ORACLE数据库 定时全量备份
  • 使用树状图可视化聚类
  • 48掌握私有云平台 OpenStack 的基本服务和使用方法,包括 Nova、Glance
  • 使用uniapp连接mqtt时,遇到了无限重连如何解决
  • Python创建虚拟环境(virtualenv和venv)
  • 【Linux:程序地址空间--原来操作系统也喜欢画大饼】
  • 入职时,公司要求自己带电脑,每月给100元补贴,如果不接受就不能入职!
  • 【面向对象语言三大特性之 “多态”】
  • springboot(08)使用japidocs自动生成接口文档