1、操作层面
软链接
先说结论:软链接本质是一个独立的文件
- 先创建一个文件
file.txt
- 再创建一个软链接:命令
ln -s file.txt file-soft.link
(后者链接前者)- 软链接的名字和后缀随便取的
使用命令 ls -li
查看,你可以发现两个文件有着不同的 inode
号,即可证明这两个属于不同文件。
同时,软链接的文件类型标识为 l
软链接有何用:在用户层看来,软链接就相当于一份原文件,两个文件有着相同的内容(文件 file.txt
的内容是 hello Linux
)
硬链接
先说结论:硬链接本质不是一个文件
通过命令:ln file.txt file-hard.txt
给文件硬链接(后者链接前者)
(同理这个硬链接的命名和后缀都是随便起的)(该命令和前面软链接的命令相比,没有 -s
)
可以发现,硬链接的 inode
号和原文件一样,说明不是独立文件
同时信息列表中有个数字从 1 到 2
而其他数据基本相同
上面是操作层面的演示和理解,但是只了解操作是远远不够的
还需理解配套的相关原理
2、原理层面
深刻理解软硬链接
1、软链接有独立的 inode
,软链接内容上,保存的是目标文件的路径(就比如 windows
上的快捷方式:Win图形化桌面上的应用图标)
2、硬链接不是独立的文件,没有独立的inode,硬链接本质就是一组文件名和已经存在的文件的映射关系!(相当于C++的引用)
- 这种硬链接,一个
inode
文件对于多个文件名,是通过引用计数的方式实现的 - 图中的 3 就是引用计数的大小了
我们对一个文件 file.txt
进行硬链接,然后删掉原文件 file.txt
,发现硬链接还指向该文件,证明该文件没有被删除,只是删掉了表面的文件名
而这个过程是不是完成了一次文件的重命名工作?因此
我们经常使用的操作:重命名与给文件起一个文件名,本质实际上就是在 硬链接的过程!
如果我将原文件删掉,可以发现软链接直接变红(警告了)(就是因为软链接保存的是原文件的路径,原文件删掉了,路径当然也失效了)
我们将一个硬链接重命名 `file.txt` ,上面的软链接又成功了 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/16fd1c127b3041ee8d5161172e10fd0c.png)
3、软硬链接的应用场景
软链接
软链接本质就是存储了目标文件的路径的一种快捷方式,这个形式有点像设置环境变量,只需通过一个软链接就能直接找到并操作目标文件.
(1)设置环境变量
使用实例:
我们在当前路径下创建一个打印文件,并编译形成一个可执行文件.
我们如果想要直接通过文件名就能执行该文件,而不用带上路径呢?(就像环境变量一样)
可以通过设置软链接,通过 /usr/bin/mycode
软链接到当前目录的 mycode.exe
(/usr/bin/
:该目录下为系统的环境变量)
注意,当前目录的 mycode.exe
大概率需要写全路径,不能只写 ./mycode.exe
(在设置环境变脸时需要些写全路径)
sudo ln -s /home/mine/....../mycode.exe /usr/bin/mycode
(由于路径较长,中间部分我用省略号省略,命令本身需要写全路径,而不能省略!)
这样我们在/usr/bin/
目录下就有了一个当前目录的 mycode.exe
的 /usr/bin/mycode
软链接
直接通过文件名即可执行该文件
这样我们在/usr/bin/
目录下就有了一个当前目录的 mycode.exe
的 /usr/bin/mycode
软链接
直接通过文件名即可执行该文件
设置环境变量使程序可以不用带路径的访问执行:
1、将可执行文件添加到系统环境变量目录下
2、在系统环境变量目录下添加一个软链接,该软链接指向其他目录下的可执行文件
其实这两种方式本质是一样的,第一个就是将文件本体放过去,第二个是将文件的“指针”放过去,使得系统通过直接或间接的找到目标文件!
删除软链接:
除了可以直接 rm -rf
删掉对应软链接文件,还可以:
命令 unlink 软链接路径
,例如删除上面设置的软链接
sudo unlink /usr/bin/mycode
(2)处理深路径文件
当一个可执行文件处于比较深的路径位置,每次需要执行还要打一长串路径,不妨设置软链接
设置软链接
(3)目录也能软链接
当我们频繁需要访问某个目录时,而每次都要输入该目录的长长的全路径,此时可以通过软链接该目录
因为目录也是文件,当然可以软链接
例如:我们需要访问系统的C标准库头文件目录
通过软链接进入该目录,就可以直接访问了
Linux
系统中使用软链接的场景例子:
硬链接
我们在当前目录下创建一个新的空目录文件:可以发现该目录文件的引用计数为 2
这是因为目录中的隐藏文件:一个点 ./dir/.
,也代表该目录文件
因此包括他本身 : ./dir
,就一共有两个名字,即引用计数为 2
此时我们在该空目录中创建一个新的空目录文件,该目录 ./dir
的引用计数就变成了 3
这是因为,在子目录中还存在两个点 ..
用于表示上级目录
这三个都表示 inode
值为 529555 的这个目录文件 dir
这下明白为什么隐藏文件一个点表示自己当前文件,两个点表示上级目录文件了吧!!本质就是硬连接.
这样设计就是为了方便用户进行快速的路径切换,而这个设计的原理就 是硬链接
那么如何控制根目录为最初始的目录,而不会被用户通过两个点切换到根目录的上级目录呢?
根目录的隐藏文件两个点,指向的就是他自己!!
根目录的 inode
一般是 2
4、软硬链接的区别及其各自的优势
软链接(符号链接,Symbolic Link)和硬链接(Hard Link)是 Unix 和类 Unix 系统中两种不同类型的链接方式,它们在功能和用途上有一些重要的区别。下面详细解释这两种链接的区别及其各自的优势。
软链接(Symbolic Link)
- 定义:
- 软链接是一个特殊的文件,它包含了一个指向目标文件的路径。
- 软链接可以跨文件系统,即目标文件可以位于不同的分区或磁盘上。
- 创建方法:
- 使用
ln -s
命令创建软链接。 - 例如:
ln -s /path/to/target /path/to/link
- 使用
- 特点:
- 软链接文件本身是一个独立的文件,包含了目标文件的路径。
- 如果目标文件被删除,软链接会变成无效链接(悬空链接)。
- 软链接可以指向任何类型的文件或目录。
- 优势:
- 灵活性:可以跨文件系统创建链接。
- 安全性:如果目标文件被删除,软链接不会影响其他文件。
- 可读性:软链接文件的内容可以直接查看,可以看到目标文件的路径。
硬链接(Hard Link)
- 定义:
- 硬链接是指向同一个
inode
的多个文件名。 - 硬链接不能跨文件系统,目标文件必须位于同一个分区上。
- 硬链接是指向同一个
- 创建方法:
- 使用
ln
命令创建硬链接。 - 例如:
ln /path/to/target /path/to/link
- 使用
- 特点:
- 硬链接文件和目标文件共享同一个
inode
,因此它们是完全相同的文件。 - 删除任何一个硬链接文件都不会影响其他硬链接文件,除非所有硬链接都被删除,
inode
才会被释放。 - 硬链接只能指向文件,不能指向目录。
- 硬链接文件和目标文件共享同一个
- 优势:
- 性能:访问硬链接文件和访问原始文件一样快,因为它们共享同一个
inode
。 - 节省空间:多个硬链接文件共享同一个数据块,不会额外占用存储空间。
- 可靠性:删除其中一个硬链接文件不会影响其他硬链接文件,提高了数据的可靠性。
- 性能:访问硬链接文件和访问原始文件一样快,因为它们共享同一个
硬链接一个超级大的优势:如果在同一分区内,需要对某个文件进行备份,只需建立硬链接即可,而不用拷贝备份!!!!!
共享关系
虽然软链接和硬链接都可以实现文件的共享,但它们的共享机制和效果有所不同:
- 软链接:
- 通过路径共享文件,如果路径变化或目标文件被删除,软链接会失效。
- 适用于需要跨文件系统或希望保留原文件路径信息的场景。
- 硬链接:
- 通过
inode
共享文件,多个硬链接文件是完全相同的,删除其中一个不会影响其他硬链接。 - 适用于在同一文件系统内需要高效共享文件的场景。
- 通过
5、为什么不能对目录进行硬链接,却可以对目录进行软链接
为什么不能对目录进行硬链接
硬链接不允许指向目录。这是因为可能会导致循环引用的问题,即父目录和子目录之间可能形成闭环,这会使文件系统的遍历算法(如find
命令)陷入无限循环,同时也会使文件系统的结构变得复杂且难以管理。
例如,如果在 /home/code/
目录下存在一个硬链接 a
指向 /home/code/
自身,当遍历文件目录树时,遍历程序会将每个目录下的每个文件和链接都遍历一遍,当遍历到该目录下的 硬链接 a 时,会使遍历程序直接跳转到 /home/code/
目录下,然后再次遍历,最后还是会因为 硬链接 a ,重新跳转到 /home/code/ 目录…导致这样的循环引用
具体来说,当遍历程序遇到硬链接 a
时,它会认为这是另一个指向 /home/code/
的入口。于是,遍历程序会重新进入 /home/code/
目录,再次遇到硬链接 a
,然后又一次跳转回 /home/code/
,如此反复形成无限循环。这种循环会导致:
- 遍历程序陷入死循环:由于没有机制来识别和打破这个循环,遍历工具将不断重复访问相同的目录层级,无法完成整个目录树的遍历。
- 资源消耗增加:持续的循环访问会无谓地消耗系统资源,如CPU时间和内存,严重时可能导致系统性能下降或崩溃。
- 数据处理错误:对于依赖于正确遍历结果的应用程序或命令(如备份软件、同步工具等),这种循环可能会导致数据不一致或者操作失败。
为了避免这些问题,Linux和其他类Unix操作系统限制了对目录创建硬链接的能力,并允许通过符号链接(软链接)来提供相似的功能而不引入这些风险。符号链接本质上是一个特殊的文件,它包含了一个路径名,而不是直接指向inode。因此,即使符号链接指向其所在的目录,也可以通过检测符号链接的目标路径来避免无限循环。
为什么可以对目录进行软链接
如果在 /home/code/
目录下存在一个软链接 b
指向 /home/code/
自身。使用软链接 b
来访问其指向的目标,操作系统会解析这个路径,并重定向到软链接所指示的位置。
软链接(符号链接)在功能上和硬链接一样,也会使得遍历程序跳转到它所指向的目标目录。然而,与硬链接不同的是,软链接本质上是一个特殊的文件,它包含了一个路径名而非直接指向某个inode。这意味着操作系统在处理软链接时可以采取额外的步骤来检测和避免循环引用。
以下是为什么软链接通常不会导致遍历程序陷入无限循环的原因:
-
路径解析:当遍历程序遇到一个软链接时,它首先尝试解析这个软链接指向的目标路径。如果目标路径是绝对路径或相对路径,系统可以通过比较路径或者inode信息来确定是否已经访问过该目标。例如,很多遍历工具(如
find
命令)具有内置机制来跟踪已经访问过的路径或inode编号,从而避免重复进入同一个目录。 -
符号链接循环检测:现代文件系统和遍历工具能够识别符号链接形成的循环并采取适当的措施。例如,当一个符号链接直接或间接指向其自身所在的目录时,遍历工具可以检测到这种循环,并选择跳过该链接而不是继续遍历下去。这通常是通过维护一个已访问链接或目录的列表实现的。
-
inode和路径的区别:正如之前提到的,软链接是指向一个路径,而不是直接共享同一个inode。因此,即使软链接指向其所在的目录,也可以通过检查路径名称来区分原始目录和软链接指向的目标,从而避免循环。
-
悬空软链接:如果软链接的目标被删除或不存在,那么软链接成为悬空链接,遍历程序可以选择忽略这些无效链接,而不会因为它们的存在而导致循环或其他问题。
简单来说,软链接提供了一种 “及时止损”的方式,不会直接跳转到所指向的目标路径,而是先通过正确的路径解析和循环检测,才决定是否继续进行跳转,使得软链接在本质上不陷入无限循环。
为什么系统还存在这两个硬链接:目录项 .
和 ..
这些特殊目录项是文件系统的一部分,由操作系统内核专门处理,系统会识别到的,系统有专门的处理方式,
说白了就是只许州官放火,不许百姓点灯
标签:文件,软硬,路径,目录,遍历,Linux,深刻理解,inode,链接 From: https://blog.csdn.net/2301_79499548/article/details/145224670