【Linux】Linux 文件系统—— 探讨软链接(symbolic link)

news/2025/2/22 6:00:11

ℹ️大家好,我是练小杰,周五又到了,明天应该就是牛马的休息日了吧!!😆


前天我们详细介绍了 硬链接的特点,现在继续探讨 软链接的特点,并且后续将添加更多相关知识噢,谢谢各位的支持🙏

前情回顾: 【看懂Linux文件的硬链接
Linux专栏:🔝 【Linux零基础开始】【Shell 脚本编程】 【Linux文件系统 】

主页:👉【练小杰的CSDN】

在这里插入图片描述

Linux文件的软链接

在这里插入图片描述

什么是软链接

软链接:又叫符号链接,是系统新建一个链接文件,它实际上是一个特殊的文件。在符号链接中,链接文件实际上是一个文本文件,其中包含所链接的那个文件的位置信息,软链接可以跨系统。软链接文件类似于Windows的快捷方式,快捷方式删了就删了,原来文件还是存在的。

特点

  1. 类似Windows快捷方式;

  2. 软链接拥有自己的索引节点和Block块,但是数据块中只保存原有文件的文件名和索引节点号,并没有实际的文件数据;

  3. lrwxrwxrwx 软链接软链接文件权限都为 rwxrwxrwx

  4. 修改任意文件,另一个都改变;

  5. 删除原文件,软链接不能使用。

  6. 软链接本身只占用很少的磁盘空间,因为它只是一个指向目标文件或目录的指针。

缺点

  1. 依赖性软链接依赖于目标文件或目录的存在。如果目标被删除或移动,软链接将成为悬挂链接,导致访问失败。

  2. 性能开销: 访问软链接时需要进行额外的解析步骤,可能会带来轻微的性能开销,尤其是在深层嵌套的目录结构中。

  3. 安全性风险软链接可能被用于恶意目的,例如创建循环链接或指向敏感文件,从而引发安全问题。

  4. 权限问题软链接的权限设置不当,可能会导致未经授权的访问。比如,一个软链接可能指向一个受保护的文件,如果软链接的权限设置不正确,可能会被非授权用户访问。

  5. 可读性: 在文件系统中,软链接可能会增加复杂性,使得文件结构不易理解,尤其是当有多个软链接指向同一个目标时。

实际应用场景

  • 版本管理:

在软件开发中,可以使用软链接来指向不同版本的库或可执行文件,方便版本切换和管理。

  • 快捷访问:

创建软链接作为快捷方式,方便快速访问常用文件或目录。例如,可以在用户主目录下创建一个软链接指向一个常用的配置文件。

  • 共享数据:

在多用户环境中,可以使用软链接来共享数据文件或目录,而不需要复制数据,节省磁盘空间。

  • 系统配置:

在系统配置中,可以使用软链接来指向不同的配置文件或脚本,方便系统管理和维护。

  • 备份和恢复:

在备份和恢复过程中,可以使用软链接来指向备份目录或文件,方便数据恢复和管理。

  • 模块化设计:

在模块化设计中,可以使用软链接来动态加载或卸载模块,例如在Linux内核模块管理中,软链接被广泛使用。

软链接的创建、查看和删除

创建软链接

  • 使用命令 ln -s 可以创建软链接文件
ln [选项] [源文件]  [目标文件]  
#选项 -s 用于创建软链接
ln -s /path/to/target /path/to/link

查看软链接

  • 输出结果中会显示软链接的类型和指向的目标
ls -l /path/to/link

删除软链接

  • 执行命令后只会删除软链接本身,而不会影响目标文件或目录
rm /path/to/link

理解软链接

为了更好的理解软链接的概念,我们进行以下实验操作:

  • 博客【看懂Linux文件的硬链接】中,我们已经创建了文件/inodetest/test.sh和子目录/inodetest/inodedir,接下来我们在这个子目录下创建文件test.sh软链接testsln,然后分别查看两个文件的inode

创建软链接并查看权限

[root@localhost inodedir]# ln -s ../teat.sh testsln  
[root@localhost inodedir]# ls -l
lrwxrwxrwx. 1 root root 10 Jul 11 03:16 testsln -> ../test.sh  

可以发现权限部分以”l”开 头,链接数为1

查看两个文件的inode

[root@localhost inodedir]# ls -i ../test.sh
52621635 ../test.sh
[root@localhost inodedir]# ls -i testsln
16791568 testsln

⚠️这时,我们可以看到,两者的inode号是不同的!!!

查看两个文件的详细信息

  • 源文件 test.sh
[root@localhost inodedir]# stat ../test.sh
  File: '../test.s'
  Size: 38        	Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d	Inode: 52621635    Links: 2
Access: (0744/-rwxr--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2020-07-11 00:28:44.386701866 -0700
Modify: 2020-07-11 00:26:37.532584298 -0700
Change: 2020-07-11 00:28:24.648216773 -0700
 Birth: -  

这里的 Links还是2,尽管创建了一个软链接,但没有改变Links的值

[root@localhost inodedir]# stat testsln
  File: 'testsln' -> '../test.sh'
  Size: 10        	Blocks: 0          IO Block: 4096   symbolic link
Device: 803h/2051d	Inode: 16791568    Links: 1
Access: (0777/lrwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Context: unconfined_u:object_r:default_t:s0
Access: 2020-07-11 03:17:34.296526567 -0700
Modify: 2020-07-11 03:16:43.018567745 -0700
Change: 2020-07-11 03:16:43.018567745 -0700
 Birth: -

查看并执行软链接

[root@localhost inodedir]# cat testsln
#!/bin/sh
echo "This is a hard link!"
[root@localhost inodedir]# ./testsln
This is a hard link!

可知,用cat命令打开软链接文件testsln的内容与test.sh的内容一样!实际上读的是test.sh文件!并且,软链接testsln运行结果与test.sh一样!

软链接硬链接的区别

  • 我们进行以下操作理解它们的区别,首先将原始文件/inodetest/test.sh文件移开到 /inodetest/testbak.sh文件。
  • 然后比较硬链接文件/inodetest/subinodedir/testln.sh软链接文件/inodetest/inodedir/testsln 的特点。

mv命令移开文件并查看

[root@localhost inodedir]# mv ../test.sh ../testbak.sh

[root@localhost inodedir]# cat testln
cat: testln: No such file or directory
[root@localhost inodedir]# ./testln
-bash: ./testln: No such file or directory

这时,我们已经无法打开软链接文件testsln,并且也无法运行软链接文件testsln

查看并执行硬链接 testln.sh

[root@localhost inodedir]# cat  ../subinodedir/testln.sh
#!/bin/sh
echo "This is a hard link!"
[root@localhost inodedir]# ../subinodedir/testln.sh
This is a hard link!

可知,删除test.sh不影响打开硬链接文件testln.sh,而且,也不影响运行硬链接文件testln.sh

区别总结

  • 从以上命令可以看出,软链接文件testsln和文件test.shinode号虽然不一样,但是,文件testsln的内容其只是文件test.sh的路径。当读取文件testsln时,系统会自动将访问者指向文件test.sh。因此,无论打开哪一个文件,最终读取的都是文件test.sh
  • 软链接文件testsln必须依赖于文件test.sh而存在,如果删除了源文件test.sh,打开文件testsln就会报错:“No such file or directory”。
  • 软链接硬链接最大的不同:文件testsln指向文件test.sh的文件名,而不是文件test.sh的inode号码,文件test.sh的inode"链接数"不会因此发生变化。

⚠️注意: 软链接硬链接的重要区别是如果删除源文件,那么软链接不可用,但不影响硬链接的使用。

实操练习

创建硬链接

  • 第一步:首先在“/”目录下创建两个目录user1user2,然后在user1下创建一个文件test.txt
[root@localhost /]# mkdir user1
[root@localhost /]# mkdir user2
[root@localhost /]# cd user1
[root@localhost user1]# vim test.txt
  • 第二步:在目录user2下创建文件test.txt硬链接testln.txt

    • 操作1:创建链接文件
    [root@localhost user1]# ln test.txt /user2/testln.txt
    
    • 操作2: 查看输出结果
    [root@localhost user1]# ls -l /user2
    -rw-r--r--. 2 root root 16 May 17 07:43 testln.txt
    
  • 第三步:查看源文件和链接的关系

[root@localhost user1]# cat test.txt
This is a test!
[root@localhost user1]# cat /user2/testln.txt
This is a test!

这里的 /user1/test.txt/user2/testln.txt内容相同

[root@localhost user1]# vim test.txt
[root@localhost user1]# cat test.txt
This is a LXJ test!
[root@localhost user1]# cat /user2/testln.txt
This is a LXJ test!

/user1/test.txt 改变内容,/user2/testln.txt跟着改变!

  • 第四步:查询两个文件的 inode是否一致
[root@localhost user1]# ls -i test.txt /user2/testln.txt
2652713 test.txt  2652713 /user2/testln.txt

结果显示两个文件的 inode完全一致!!!我们还可以再创建test.txt的多个硬链接文件,用上面的方式查看是否都一样?!这里大佬们去尝试一下,我不过多重复!!

  • 第五步:删除test.txt文件,查看testln.txt
[root@localhost user1]# rm -rf test.txt
[root@localhost user1]# cat /user2/testln.txt
This is a LXJ test!

易看到,删除源文件 /user1/test.txt文件并不影响/user2/testln.txt文件的使用

创建软链接

  • 第一步:在/user1下创建文件test.txt文件
[root@localhost user1]# vim test.txt
[root@localhost user1]# cat test.txt
This is a symbolic link test!
  • 第二步:在目录user2下创建文件test.txt软链接test.sym
[root@localhost user2]# ln -s /user1/test.txt /user2/test.sym

[root@localhost user2]# ls -l
lrwxrwxrwx. 1 root root 15 May 17 08:57 test.sym -> /user1/test.txt
[root@localhost user2]# cat test.sym
This is a symbolic link test!

显然,/user1/test.txt/user2/test.sym显示的内容相同。

⚠️注意

在创建软链接时,必须指明所链接的文件的完整路径,否则无法实现软链接,我们可以按下面操作进行测试。

  • 第一步:不指定完整路径
[root@localhost user1]# ln -s test.txt /user2/test.sy
[root@localhost user1]# ls -l /user2
lrwxrwxrwx. 1 root root  8 May 17 08:41 test.sy -> test.txt
[root@localhost user1]# cat /user2/test.sy
cat: /user2/test.sy: No such file or directory

以上操作中没有指明test.txt的完整路径,导致无法链接!!!

  • 第二步:查询/user1/test.txt/user2/test.sym两个文件的 inode是否一致
[root@localhost user1]# ls -i test.txt /user2/test.sym
2655739 test.txt  17804334 /user2/test.sym

/user1/test.txt和/user2/test.sym两个文件的 inode不一致

  • 第三步:修改一个,测试另一个是否也发生变化。为了说明问题,我们修改/user2/test.sym文件做为测试(也可以修改/user1/test.txt文件进行测试)
[root@localhost user1]# vim /user2/test.sym
 [root@localhost user1]# cat /user2/test.sym
This is a NEW symbolic link test!
[root@localhost user1]# cat test.txt
This is a NEW symbolic link test!

两个文件被同时修改!!!事实上,在软链接中,只保存所指向文件的名字而已,当编辑软链接这个软链接文件时,首先通过所指向的文件去找到指向的文件,然后通过指向文件的inode来找到实体存放的inode,所以,编辑软链接文件实际上就是修改真实存放在block中的内容。

  • 第四步:测试删除原文件,软连接是否有效。
[root@localhost user1]# rm -rf test.txt
[root@localhost user1]# cat /user2/test.sym
cat: /user2/test.sym: No such file or directory

这里删除了源文件,软连接无效!!!


今天的Linux系统的文件软链接内容到这里就结束了,感谢各位朋友的陪伴👋
ℹ️了解更多,主页【练小杰的CSDN】
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!! 下周同一时间再见,各位伙伴们🚴🏻~~


http://www.niftyadmin.cn/n/5861715.html

相关文章

【排版教程】如何在Word/WPS中优雅的插入参考文献

材料展示 随便选取一段综述内容,以及对应的参考文献,如下图所示: 1 参考文献编辑 首先对参考文献部分进行编辑,将其设置自动编号 在段落中,选择悬挂缩进 在编号中,设置自定义编号,然后按照…

大学本科教务系统设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点

以下是大学本科教务系统的设计方案,涵盖需求分析、架构设计、核心模块和技术实现要点: 大学本科教务系统设计方案 一、需求分析 1. 核心用户角色 角色功能需求学生选课/退课、成绩查询、课表查看、学分统计、考试报名、学业预警教师成绩录入、课程大纲上传、教学进度管理、…

Innovus中快速获取timing path逻辑深度的golden脚本

在实际项目中我们经常会遇到一条timing path级数特别多,可能是一两页都翻不完。此时,我们大都需要手工去数这条path上到底有哪些是设计本身的逻辑,哪些是PR工具插入的buffer和inverter。 数字IC后端手把手培训教程 | Clock Gating相关clock …

在CentOS 7上安装和使用Spleeter音频分离工具的详细步骤

在音频处理领域,Spleeter是一款优秀的开源工具,能够帮助用户轻松实现音频文件中人声和背景音的分离。本文将详细介绍在CentOS 7系统上安装和配置Spleeter的步骤,以及如何使用Spleeter进行音频分离。 准备环境: 在开始安装Spleeter之前&…

Hadoop-HA集群部署

集群的服务器规划: 配置免密登陆:(这里示范的是第一台服务器,其余的操作一样),免密登陆是为了执行脚本统一操作,启动,如(hdfs集群:1上启动2.5.6.7&#xff09…

【Gin-Web】Bluebell社区项目梳理3:社区相关接口开发

本文目录 一、接口详情1. 获取分类社区列表接口2. 根据id查询社区 二、值类型与引用类型 一、接口详情 跟社区有关的接口详情如下。 1. 获取分类社区列表接口 首先是Controller层,然后跳转到Logic层业务逻辑的开发。 这是Logic层,再做一次跳转&#…

LeetCode 热题 100 283. 移动零

LeetCode 热题 100 | 283. 移动零 大家好,今天我们来解决一道经典的算法题——移动零。这道题在LeetCode上被标记为简单难度,要求我们将数组中的所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。下面我将详细讲解解题思路,…

RabbitMQ 消息队列 优化发送邮件

express 发送邮件 最简单的异步发送邮件方法为何要使用 RabbitMQ?如何在 Node 项目中集成 RabbitMQ? 一、 不用 await 发送邮件 在实际开发之前,不妨先思考下,我们最终的目的是为了让邮件异步发送。那发送邮件这里有个await&am…