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

news2025/2/23 1:26:15

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


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

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

主页:👉【练小杰的CSDN】

在这里插入图片描述

Linux文件的软链接

    • 主页:👉【[练小杰的CSDN](https://blog.csdn.net/weixin_55767624?spm=1011.2415.3001.5343)】
  • 什么是软链接
    • 特点
    • 缺点
    • 实际应用场景
  • 软链接的创建、查看和删除
    • 创建软链接
    • 查看软链接
    • 删除软链接
  • 理解软链接
    • 创建软链接并查看权限
    • 查看两个文件的inode
    • 查看两个文件的详细信息
    • 查看并执行软链接
  • 软链接与硬链接的区别
    • mv命令移开文件并查看
    • 查看并执行硬链接 testln.sh
    • 区别总结
  • 实操练习
    • 创建硬链接
    • 创建软链接
      • ⚠️注意

在这里插入图片描述

什么是软链接

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

特点

  1. 类似Windows快捷方式;

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

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

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

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

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

缺点

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

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

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

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

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

实际应用场景

  • 版本管理:

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

  • 快捷访问:

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

  • 共享数据:

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

  • 系统配置:

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

  • 备份和恢复:

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

  • 模块化设计:

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

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

创建软链接

  • 使用命令 ln -s 可以创建软链接文件
ln [选项] [源文件]  [目标文件]  
#选项 -s 用于创建软链接
  • 例如,创建指向 /path/to/target 的软链接 /path/to/link
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的值

  • 软链接 testsln
[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.coloradmin.cn/o/2303690.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux-CentOS 7安装

Centos 7镜像:https://pan.baidu.com/s/1fkQHYT64RMFRGLZy1xnSWw 提取码: q2w2 VMware Workstation:https://pan.baidu.com/s/1JnRcDBIIOWGf6FnGY_0LgA 提取码: w2e2 1、打开vmware workstation 2、选择主界面的"创建新的虚拟机"或者点击左上…

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek:从入门到精通》分享 在忙碌的职场中,制作一份高质量的PPT往往需要投入大量时间和精力,尤其是在临近截止日期时。今天,我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…

【opencv】图像基本操作

一.计算机眼中的图像 1.1 图像读取 cv2.IMREAD_COLOR:彩色图像 cv2.IMREAD_GRAYSCCALE:灰色图像 ①导包 import cv2 # opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline ②读取图像 img cv2.imread(…

帆软报表FineReport入门:简单报表制作[扩展|左父格|上父格]

FineReport帮助文档 - 全面的报表使用教程和学习资料 数据库连接 点击号>>JDBC 选择要连接的数据库>>填写信息>>点击测试连接 数据库SQLite是帆软的内置数据库, 里面有练习数据 选择此数据库后,点击测试连接即可 数据库查询 方法一: 在左下角的模板数据集…

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异,以下是综合多个来源的常用方法及注意事项: 通过ADB命令注入GPS数据(适用于技术用户) 1.连接云手机 使用ADB工具连接云手机服务器,…

天 锐 蓝盾终端安全管理系统:办公U盘拷贝使用管控限制

天 锐 蓝盾终端安全管理系统以终端安全为基石,深度融合安全、管理与维护三大要素,通过对桌面终端系统的精准把控,助力企业用户构筑起更为安全、稳固且可靠的网络运行环境。它实现了管理的标准化,有效破解终端安全管理难题&#xf…

计算机网络之物理层——基于《计算机网络》谢希仁第八版

(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮&#xff0…

区块链中的递归长度前缀(RLP)序列化详解

文章目录 1. 什么是RLP序列化?2. RLP的设计目标与优势3. RLP处理的数据类型4. RLP编码规则详解字符串的编码规则列表的编码规则 5. RLP解码原理6. RLP在以太坊中的应用场景7. 编码示例分析8. 总结 1. 什么是RLP序列化? 递归长度前缀(RLP&…

分布式简单理解

基本概念 应⽤(Application)/系统(System) 为了完成⼀整套服务的⼀个程序或者⼀组相互配合的程序群。⽣活例⼦类⽐:为了完成⼀项任 务,⽽搭建的由⼀个⼈或者⼀群相互配的⼈组成的团队。 模块(Module)/组件…

记录:Docker 安装记录

今天在安装 ollama 时发现无法指定安装目录,而且它的命令行反馈内容很像 docker ,而且它下载的模型也是放在 C 盘,那么如果我 C 盘空间不足,就装不了 deepseek-r1:70b ,于是想起来之前安装 Docker 的时候也遇到过类似问…

Leetcode 二叉树展开为链表

java solution class Solution {public void flatten(TreeNode root) {//首先设置递归终止条件if(root null) return;//分别递归处理左右子树,//递归需要先处理子问题(子树的拉平),然后才能处理当前问题(当前节点的指…

RabbitMQ 消息队列 优化发送邮件

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

NetLogon 权限提升漏洞

参考文章:CVE-2020-1472NetLogon权限提升漏洞_cve-2020-1472复现 谢公子-CSDN博客 域控机器账户:WIN-0V0GAORDC17 域控 ip:192.168.72.163 域内攻击者机器 ip:192.168.72.158,host:WIN10-01 攻击者 kali…

【C++】 Flow of Control

《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、选择结构1.1、if 语句1.2、嵌套的 if 语句1.3、条件运算符 ?:1.4、switch 语句 2、循环结构2.1、while 语句2.2、do-while 语句2.3、 for 循环2.4、循环嵌套…

图论 之 迪斯科特拉算法求解最短路径

文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题,分为使用BFS和使用迪斯科特拉算法,这两种算法求解的范围是有区别的 BFS适合求解,边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…

Spring Boot 中事务的用法详解

引言 在 Spring Boot 中,事务管理是一个非常重要的功能,尤其是在涉及数据库操作的业务场景中。Spring 提供了强大的事务管理支持,能够帮助我们简化事务的管理和控制。本文将详细介绍 Spring Boot 中事务的用法,包括事务的基本概…

【react18】如何使用useReducer和useContext来实现一个todoList功能

重点知识点就是使用useReducer来攻坚小型的公共状态管理,useImmerReducer来实现数据的不可变 实现效果 实现代码 项目工程结构 App.js文件 import logo from "./logo.svg"; import "./App.css"; import TodoLists from "./comps/TodoLi…

一篇搞懂vue3中如何使用ref、reactive实现响应式数据

ref 可实现 基本类型、对象类型响应式数据 reactive&#xff1a;只能实现 对象类型响应式 ref实现 基本类型 数据响应式&#xff1a; <template><div class"person"><h2>姓名&#xff1a;{{ name }}</h2><h2>年龄&#xff1a;{{ ag…

【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!

命令模式&#xff1a;封装请求&#xff0c;轻松实现解耦&#xff01; 大家好&#xff01;今天我们来聊聊设计模式中的命令模式&#xff08;Command Pattern&#xff09;。如果你曾经需要将请求封装成对象&#xff0c;或者希望实现请求的撤销、重做等功能&#xff0c;那么命令模…