当前位置: 首页 > news >正文

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

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


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

前情回顾: 【看懂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.shFile: '../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 -0700Birth: -  

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

  • 软链接 testsln
[root@localhost inodedir]# stat testslnFile: '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 -0700Birth: -

查看并执行软链接

[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】
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!! 下周同一时间再见,各位伙伴们🚴🏻~~

相关文章:

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

ℹ️大家好,我是练小杰,周五又到了,明天应该就是牛马的休息日了吧!!😆 前天我们详细介绍了 硬链接的特点,现在继续探讨 软链接的特点,并且后续将添加更多相关知识噢,谢谢…...

排序与算法:插入排序

执行效果 插入排序的执行效果是这样的: 呃……看不懂吗?没关系,接着往下看介绍 算法介绍 插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据&#xff0c…...

HashMap 详解

一、核心特性 HashMap集合的key是无序不可重复的。 ①无序:插入顺序和取出顺序不一定相同。 ②不可重复:key具有唯一性。 向HashMap集合中put时,key如果重复的话,value会覆盖。 二、HashMap集合的key具有唯一性,向ke…...

DAY07 Collection、Iterator、泛型、数据结构

学习目标 能够说出集合与数组的区别数组:1.是引用数据类型的一种2.可以存储多个元素3.数组的长度是固定的 int[] arr1 new int[10]; int[] arr2 {1,2,3};4.数组即可以存储基本类型的数据,又可以存储引用数据类型的数据int[],double[],String[],Student[]集合:1.是引用数据类…...

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

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

简讯:Rust 2024 edition and v1.85.0 已发布

详见 https://blog.rust-lang.org/2025/02/20/Rust-1.85.0.html 升级方法:rustup update stable...

DeepSeek写俄罗斯方块手机小游戏

DeepSeek写俄罗斯方块手机小游戏 提问 根据提的要求,让DeepSeek整理的需求,进行提问,内容如下: 请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件: 核心功能要求 原生JavaScript实现,适配手机屏幕 …...

uniapp中引入Vant Weapp的保姆级教学(包含错误处理)

废话不多说,直接上方法,网上的教学好多都是错误的 1.安装vant weapp 在Hbuilder的终端,输入以下代码 npm install vant/weapp -S --production 2.新建wxcomponents文件夹 在项目的跟目录新建一个“wxcomponents’文件夹,与app.…...

【Python爬虫(20)】解锁Python爬虫数据存储秘籍:文件存储全攻略

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…...

关于Unity的一些基础知识点汇总

1.Prefab实例化后,哪些资源是共用的?哪些资源是拷贝的? 共用资源 脚本组件:实例化后的 Prefab 共享脚本组件的代码。若脚本中无状态数据,多个实例对脚本方法的调用会有相同逻辑。比如一个控制物体移动的脚本&#xff0…...

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表(分页查询) 2.1 前端Vue3 (Vue3-Element-Admin)2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 (Vue3-Eleme…...

功能说明并准备静态结构

功能说明并准备静态结构 <template><div class"card-container"><!-- 搜索区域 --><div class"search-container"><span class"search-label">车牌号码&#xff1a;</span><el-input clearable placeho…...

solidity之Foundry安装配置(一)

一门面向合约的高级编程语言&#xff0c;主要用来编写以太坊只能合约。 Solidity受C语言&#xff0c;Python和js影响&#xff0c;但为编译成为以太坊虚拟机字节码在EVM上执行&#xff0c;很多特性和限制都和EVM相关。 Solidity 是静态类型语言&#xff0c;支持继承、库、自定义…...

请解释 Vue 中的生命周期钩子,不同阶段触发的钩子函数及其用途是什么?

vue生命周期钩子详解&#xff08;Vue 3版本&#xff09; 一、生命周期阶段划分 Vue组件的生命周期可分为四大阶段&#xff0c;每个阶段对应特定钩子函数&#xff1a; 创建阶段&#xff1a;初始化实例并准备数据挂载阶段&#xff1a;将虚拟DOM渲染为真实DOM更新阶段&#xff…...

C#上位机--选择语句(switch)

在 C# 上位机开发的广阔领域中&#xff0c;流程控制语句如同程序的 “交通枢纽”&#xff0c;精准地引导着程序的执行路径。继深入探讨if语句后&#xff0c;我们将目光聚焦于另一个重要的流程控制语句 ——switch语句。switch语句以其独特的多路分支结构&#xff0c;为处理多条…...

Hadoop初体验

一、HDFS初体验 1. shell命令操作 hadoop fs -mkdir /itcast hadoop fs -put zookeeper.out /itcast hadoop fs -ls / 2. Web UI页面操作 结论&#xff1a; HDFS本质就是一个文件系统有目录树结构 和Linux类似&#xff0c;分文件、文件夹为什么上传一个小文件也这…...

在vue2中操作数组,如何保证其视图的响应式

在 Vue 2 中&#xff0c;操作数组时需要注意一些方法不会触发视图的响应式更新。为了确保数组的操作是响应式的&#xff0c;可以使用 Vue 提供的响应式方法。以下是一些常见的操作及其替代方法&#xff1a; 使用 Vue.set 方法&#xff1a; 当你需要通过索引直接修改数组中的某个…...

CentOS的ssh复制文件

1.前提 首先要已经连接上了对方的ssh 2.命令 scp [文件] 目标IP:目标路径 例如&#xff1a; $PWD是一个环境变量&#xff0c;可以获取当前绝对目录&#xff0c;ssh上传的时候一定要确保对方有这个目录才行&#xff0c;不然会报错 3.递归上传 scp -r 目录 目标IP:路径 可以…...

Spring Cloud — Hystrix 服务隔离、请求缓存及合并

Hystrix 的核心是提供服务容错保护&#xff0c;防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式&#xff0c;对资源或失败单元进行隔离&#xff0c;避免一个服务的失效导致整个系统垮掉&#xff08;雪崩效应&#xff09;。 1 Hystrix监控 Hystrix 提供了对服务…...

Vmware虚拟机Ubantu安装Docker、k8s、kuboard

准备工作: 切换用户&#xff1a;su root关闭防火墙: sudo ufw diasble关闭swap: systemctl stop swap.target systemctl status swap.target systemctl disable swap.target #开机禁用 systemctl stop swap.img.swap systemctl status swap.img.swap关闭虚拟交换分区 vim /…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...