【Linux】开始认识软硬链接

简介: 上篇文章我们学习了文件系统,了解未打开的文件在磁盘中是如何储存的。

给大家一句话:

人生,终究不允许你只做一个旁观者。 – 朱德庸

ᕙ༼◕_◕༽ᕤᕙ༼◕_◕༽ᕤᕙ༼◕_◕༽ᕤ

ᕙ༼◕_◕༽ᕤᕙ༼◕_◕༽ᕤᕙ༼◕_◕༽ᕤ

ᕙ༼◕_◕༽ᕤᕙ༼◕_◕༽ᕤᕙ༼◕_◕༽ᕤ

软硬链接与动静态库

1 前言

上篇文章我们学习了文件系统,了解未打开的文件在磁盘中是如何储存的。

  1. 首先在磁盘中我们都会进行一个磁盘的分区
  2. 每个分区又分为若干的组
  3. 每个组都有若干的 Block Group 进行管理
  4. Block Group :其中有一套文件系统进行管理:
  • super block (超级块):用来记录文件系统的结构信息(统筹管理文件系统),防止数据丢失。不是每个 Block Group 都有超级块。
  • GDT:块组描述符,描述块组属性信息:块多大,有多少个Datablock,使用了多少个… 其本质是管理字块的部分
  • block bitmap:数据块的位图,通过比特位来记录那一个数据块被使用了。
  • inode bitmap:inode的位图,每个bit表示一个inode是否空闲可用。通过比特位表示是否可用
  • inode table:inode 表,用来储存若干个inode。inode里储存文件的基础属性信息,每个文件对应一inode。每个文件都有一个inode编号,通过这个编号确定文件所在的分组。inode里存在Dateblock [ N ],标记该文件使用了哪些数据块。
  • Date block:数据块,每个都是固定大小(一般4KB),储存文件内容。

然后我们怎么寻找一个文件呢:

要找到指定文件 -> 首先要找到所在目录(逆向解析路径) ->找到文件的inode编号 -> 打开文件

操作系统必须通过路径来确定文件!!!


操作系统的命令也是同理,我们使用命令时会在环境变量中的PATH中的路径进行寻找命令(可执行文件)

目录也是文件!目录里储存着文件名与inode编号的映射关系!!!


找到所在目录的过程与找指定文件过程一样,因为目录本质也是文件!就这样进行逆向的路径解析。 (逆向解析的过程会储存在缓存区中,方便下次提高效率)


目录是由进程提供的,内核文件系统提前写入并组织好了。


接下来我们就要来学习软硬链接了

2 软硬链接

2.1 软链接

先来看软连接

我们先创建一个文件用来进行演示

来看奥:

  1. 我们先创建了一个文本文件,里面写入了我们的数据
  2. 然后使用命令ln -s file_target1.txt file_soft.link
  • ln是创建一个链接的命令
  • -s 表示形成软链接
  • 然后是目标文件与形成的链接名
  1. 然后我们就能看到一个带有蓝色高光的软链接形成了,并且具有独立的inode number,说明是一个新的文件。
  2. 软链接里面储存着与被链接文件相同的内容

如果我们删掉目标文件会发生什么呢?

直接就红色高闪报警了,也就找不到目标文件了!

那软链接有什么用呢

我们想要使用myls,就需要这样执行./bin/a/b/c/myls,很是复杂。那么软链接就可以解决这个问题,我们建立一个“快捷方式”-软链接就可以:

我们就可以直接运行这个软链接就可以了:

所以软链接通常就是用来作为快捷方式的!!!可以链接可执行程序,可以链接路径比较深的文件等…

我们来看看Linux下的软链接:

来看一个:

这是一个软链接与目标文件,以后我们可以很平滑的替换目标文件,而保证上层使用不会出错(上层都是使用软链接来使用)。

2.2 硬链接

再来看看硬链接

同样创建一个文件来示范:

来看奥:

  1. 我们先创建了一个文本文件,里面写入了我们的数据
  2. 然后使用命令ln file_target2.txt file_soft.link
  • ln是创建一个链接的命令(这里没有 -s 所以是硬链接)
  • 然后是目标文件与形成的链接名
  1. 然后我们就能看到一个硬链接形成了,与被链接的文件具有相同的inode number,共用一份inode 。而且一个数字改变了(表示硬链接的数量)
  2. 硬链接里面很明显是相同的内容(毕竟inode都一样)

硬链接有什么用呢?

来看奥:

硬链接可以起到一个备份的作用,毕竟是一个独立的文件,并且具有目标文件的属性与数据。只是引用计数变回 1 。

硬链接就是一个文件名和inode的映射关系,建立硬链接,就是在指定目录下,添加一个 新的文件名和inode number的映射关系。


也就做到了备份的作用:

我们创建一个这样的文件夹:

我们可以在这里面进行创建硬链接。

如果在文件被删除的情况下,我们可以在backup中找到备份!!!

再来看个好玩的:

我们新建立的文件的引用数量是 1这很好理解奥,再看:

哎嘿,新建的目录文件为什么引用计数就是2呢?其实就是. .. 这两个文件在我们新建目录是就会创建!我们进入dir来看看:

先不管..引用计数为什么是 4 。. 的引用计数是2 ,并且inode与刚才的dir一张,说明.是对dir的硬链接!我们再来在dir里创建一个目录文件看看:

这时.的引用计数变成了3,为什么呢???因为在otherdir下的..同样指向的是dir

OK?这样刚才的..引用计数为什么是4也就可以理解了!

任何一个目录,该刚开始建立的时候,引用计数一定是2(因为. .. 默认会创建),在该目录下每创建一个新目录,该目录的引用计数都会+1。一个目录下有几个目录 = 引用计数 - 2

那我们可不可以建立目录的硬链接呢???

不可以!!!系统不允许我们对目录进行硬链接!!!为什么?来看:

假如我们创建了一个指向根目录的硬链接

按照Linux操作系统的寻找文件的步骤,想要找到lesson23下的一个文件,就会从/根目录进行深度优先搜索,那么寻找到root.hard的时候,就会返回到/,直接触发无限递归了!!!所以系统不允许我们建立目录的硬链接!!!

那为什么还有. .. ,这难道不是目录的硬链接吗,这难道就不会无限递归吗?

答案是不会!因为. ..名称是固定的,系统可以辨别这两个硬链接,查找时不对. .. 进行处理。甚至我们也删除不了. .. !!!

2.3 总结

根据上面,我们可以总结一下

  1. 软链接是一个独立的文件,具有独立的inode number。文件类型是 l(link)。软链接的内容是目标文件所对应的路径字符串。类似Windows下的快捷方式!
  2. 硬链接不是一个独立的文件,因为没有独立的inode number,用的是目标文件的inode number。是一个文件名与inode的映射关系。
  3. 属性中有一列硬链接数:有多少个文件名字符串通过inode number指向我。
  4. 软链接的作用:类似Windows系统的快捷方式,让我们的访问更加方便
  5. 硬链接的作用:一般来做文件备份!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

相关文章
|
6月前
|
Linux 数据处理 开发者
Linux命令ld.bfd:二进制文件的强大链接器
`ld.bfd`是GNU链接器的变体,利用BFD库处理多种目标文件格式(如ELF, COFF)。它收集文件,解析符号,执行重定位,生成可执行文件。特点包括多格式支持,高效符号管理和诊断信息。常用命令如`ld.bfd -o output file1.o file2.o -lc`。注意文件路径、链接顺序,利用诊断信息和文档,保持工具更新以优化使用。
|
4月前
|
Linux 索引
在Linux中,符号链接与硬链接有何区别?
在Linux中,符号链接与硬链接有何区别?
|
6月前
|
Linux 编译器 数据处理
探索Linux中的`ld`命令:链接器的奥秘
`ld`是Linux中的链接器,将编译后的目标文件链接成可执行或共享库。作为GNU Binutils的一部分,它处理符号引用、重定位,支持多种文件格式和库类型。常用参数包括`-o`指定输出文件,`-l`链接库,`-L`指定搜索路径。编译器驱动程序常用于简化链接过程。理解符号解析、选择静态/动态链接及管理库版本是使用`ld`的关键。使用`--verbose`调试链接问题,并考虑优化选项。
|
6月前
|
Linux 编译器 数据处理
深入了解Linux命令ld.gold:快速链接器的奥秘
`ld.gold`是GNU的快速链接器,设计用于加速大型项目的链接,尤其擅长并行处理和增量链接。它与标准的`ld`高度兼容,可通过`-fuse-ld=gold`选项启用。例如,`gcc -o my_program file1.c file2.c file3.c -Wl,--ld-as-needed -fuse-ld=gold`命令使用`ld.gold`链接多个源文件。最佳实践包括确保环境支持、利用多线程和启用增量链接。
|
7月前
|
Linux Windows
【Linux】详解软硬链接
【Linux】详解软硬链接
|
5月前
|
网络协议 Ubuntu Linux
查询Linux中网络链接的状态:networkctl
【7月更文挑战第18天】
128 0
查询Linux中网络链接的状态:networkctl
|
5月前
|
存储 Linux Windows
【Linux】文件系统软硬链接的那些事儿
本文介绍了Linux文件系统的磁盘结构、逻辑结构以及文件和inode的关系,重点讲解了软链接和硬链接的区别,强调了它们在文件管理中的作用。
75 7
|
6月前
|
Shell Linux 网络安全
Linux怎样在使用ssh 链接时就指定gcc 的版本
Linux怎样在使用ssh 链接时就指定gcc 的版本
63 7
|
6月前
|
Linux vr&ar C语言
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
Linux怎样更新Centos下Gcc版本支持C17?Centos7快速安装gcc8.3.1 可支持C++17(附gcc相关链接整理)
356 2
|
6月前
|
Ubuntu JavaScript Linux
linux 命令行下载BT种子和磁力链接 ubuntu linux 命令行下载种子
linux 命令行下载BT种子和磁力链接 ubuntu linux 命令行下载种子
1299 3