首页 > 系统相关 >【Linux系统】深刻理解软硬链接

【Linux系统】深刻理解软硬链接

时间:2025-01-18 12:03:06浏览次数:3  
标签:文件 软硬 路径 目录 遍历 Linux 深刻理解 inode 链接




在这里插入图片描述



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)

  1. 定义
    • 软链接是一个特殊的文件,它包含了一个指向目标文件的路径。
    • 软链接可以跨文件系统,即目标文件可以位于不同的分区或磁盘上。
  2. 创建方法
    • 使用 ln -s 命令创建软链接。
    • 例如:ln -s /path/to/target /path/to/link
  3. 特点
    • 软链接文件本身是一个独立的文件,包含了目标文件的路径。
    • 如果目标文件被删除,软链接会变成无效链接(悬空链接)。
    • 软链接可以指向任何类型的文件或目录。
  4. 优势
    • 灵活性:可以跨文件系统创建链接。
    • 安全性:如果目标文件被删除,软链接不会影响其他文件。
    • 可读性:软链接文件的内容可以直接查看,可以看到目标文件的路径。


硬链接(Hard Link)

  1. 定义
    • 硬链接是指向同一个 inode 的多个文件名。
    • 硬链接不能跨文件系统,目标文件必须位于同一个分区上。
  2. 创建方法
    • 使用 ln 命令创建硬链接。
    • 例如:ln /path/to/target /path/to/link
  3. 特点
    • 硬链接文件和目标文件共享同一个 inode,因此它们是完全相同的文件。
    • 删除任何一个硬链接文件都不会影响其他硬链接文件,除非所有硬链接都被删除,inode 才会被释放。
    • 硬链接只能指向文件,不能指向目录。
  4. 优势
    • 性能:访问硬链接文件和访问原始文件一样快,因为它们共享同一个 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。这意味着操作系统在处理软链接时可以采取额外的步骤来检测和避免循环引用


以下是为什么软链接通常不会导致遍历程序陷入无限循环的原因:

  1. 路径解析:当遍历程序遇到一个软链接时,它首先尝试解析这个软链接指向的目标路径。如果目标路径是绝对路径或相对路径,系统可以通过比较路径或者inode信息来确定是否已经访问过该目标。例如,很多遍历工具(如find命令)具有内置机制来跟踪已经访问过的路径或inode编号,从而避免重复进入同一个目录。

  2. 符号链接循环检测:现代文件系统和遍历工具能够识别符号链接形成的循环并采取适当的措施。例如,当一个符号链接直接或间接指向其自身所在的目录时,遍历工具可以检测到这种循环,并选择跳过该链接而不是继续遍历下去。这通常是通过维护一个已访问链接或目录的列表实现的。

  3. inode和路径的区别:正如之前提到的,软链接是指向一个路径,而不是直接共享同一个inode。因此,即使软链接指向其所在的目录,也可以通过检查路径名称来区分原始目录和软链接指向的目标,从而避免循环。

  4. 悬空软链接:如果软链接的目标被删除或不存在,那么软链接成为悬空链接,遍历程序可以选择忽略这些无效链接,而不会因为它们的存在而导致循环或其他问题。

简单来说,软链接提供了一种 “及时止损”的方式,不会直接跳转到所指向的目标路径,而是先通过正确的路径解析和循环检测,才决定是否继续进行跳转,使得软链接在本质上不陷入无限循环。



为什么系统还存在这两个硬链接:目录项 ...

这些特殊目录项是文件系统的一部分,由操作系统内核专门处理,系统会识别到的,系统有专门的处理方式,

说白了就是只许州官放火,不许百姓点灯



标签:文件,软硬,路径,目录,遍历,Linux,深刻理解,inode,链接
From: https://blog.csdn.net/2301_79499548/article/details/145224670

相关文章

  • 蓝易云 - Linux系统中常见的远程管理协议!
    Linux系统中常见的远程管理协议有以下几种:1.SSH(SecureShell):SSH是一种安全的远程登录协议,用于在网络上安全地远程登录到Linux服务器。它提供了加密的传输和身份验证机制,可以防止数据在传输过程中被拦截和篡改。SSH使用用户名和密码或公钥认证来验证用户身份,并允许用户在远程......
  • Linux SSH服务配置
    在Linux中配置SSH(SecureShell)服务,通常涉及安装SSH服务器软件(OpenSSH是最常见的选择)、修改配置文件以符合特定需求、管理密钥对以及确保服务的安全性。下面是详细的步骤指南:1.安装OpenSSH服务器大多数Linux发行版已经预装了OpenSSH服务器(sshd),但如果没有,可以通过包管理器安装。例......
  • 深入理解 Linux systemd 单元类型及配置详解
    深入理解Linuxsystemd单元类型及配置详解在Linux系统中,systemd是一种强大的初始化系统和服务管理工具,它通过**单元(Unit)**来管理服务、文件系统、设备等。systemd支持多种单元类型,如服务单元(.service)、目标单元(.target)、挂载单元(.mount)、设备单元(.device)、计时单元(.t......
  • Linux系列(一)
    一、什么是LinuxLinux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较熟知的应该就是Windows和MacOS操作系统,我们今天介绍的Linux也是一款操作系统。   二、为什么要学Linux那么我们为什么要学习Linux呢,主要出于两个方面的原因。1).企业用人要求以......
  • Linux 符号链接
    在Linux中,符号链接(也称为软链接)是一种特殊类型的文件,它指向文件系统中的另一个文件或目录。符号链接类似于Windows系统中的快捷方式,但与硬链接不同,硬链接不能跨文件系统创建,而软链接可以。创建符号链接就像为实际文件创建别名一样。如果您尝试访问符号链接,您实际上访问的是符号链......
  • 在 Linux 中查看符号链接指向
    在Linux系统中,符号链接(symboliclink)是一种特殊类型的文件,它指向另一个文件或目录。为了查看符号链接指向的目标文件或目录,可以使用以下几种方法。使用readlink命令readlink命令用于找出符号链接所指向的位置。它可以递归处理所有子文件,并输出符号链接的真实路径。以下是一......
  • Linux基础:文件系统&目录操作
    Linux基础:文件系统&目录操作文件系统Linux本质上就是一个文件系统,Linux文件系统是操作系统组织、存取、保存数据的一种手段。整体采用层级式的倒状树目录结构。倒状树结构中的目录/:根目录,Linux中的绝对路径就是由这个开始的/bin:主要存放系统的普通指令/boot:主要存放......
  • Linux基础
    Linux基础Linux指令起步linux@ubuntu:~$:linux:当前登录的用户名,安装的时候设置的@:没有意义,作为分隔符ubuntu:主机名,安装的时候设置的~:当前登录用户的家目录:(/home/linux)$:用来区分用户角色,前者表示普通用户,#表示ROOT用户pwd:Linux命令,用来查看当前所在目录的绝对路径,Lin......
  • 【Linux】如何在 Linux 中删除符号链接?
    在Linux系统中,符号链接(SymbolicLink,简称Symlink)是一种非常实用的文件系统对象,它类似于Windows系统中的快捷方式。符号链接可以指向文件或目录,为用户提供了便捷的访问路径。然而,有时候我们可能需要删除不再需要的符号链接,本文将详细为你介绍在Linux中删除符号链接的各种方......
  • 测试Linux系统磁盘读写性能(linux磁盘读写测试)
    测试Linux系统磁盘读写性能(linux磁盘读写测试)测试Linux系统磁盘读写性能(linux磁盘读写测试)测试Linux系统磁盘读写性能(linux磁盘读写测试)Linux系统磁盘读写性能测试广泛应用于云计算、分布式计算、嵌入式系统等地方,用于了解磁盘I/O操作效率,合理调整配置以改进系统性能,下面介绍......