ℹ️大家好,我是练小杰,周五又到了,明天应该就是牛马的休息日了吧!!😆
前天我们详细介绍了 硬链接的特点,现在继续探讨 软链接的特点,并且后续将添加更多相关知识噢,谢谢各位的支持🙏前情回顾: 【看懂Linux文件的硬链接】
Linux专栏:🔝 【Linux零基础开始】【Shell 脚本编程】 【Linux文件系统 】主页:👉【练小杰的CSDN】
Linux文件的软链接
- 主页:👉【[练小杰的CSDN](https://blog.csdn.net/weixin_55767624?spm=1011.2415.3001.5343)】
- 什么是软链接
- 特点
- 缺点
- 实际应用场景
- 软链接的创建、查看和删除
- 创建软链接
- 查看软链接
- 删除软链接
- 理解软链接
- 创建软链接并查看权限
- 查看两个文件的inode
- 查看两个文件的详细信息
- 查看并执行软链接
- 软链接与硬链接的区别
- mv命令移开文件并查看
- 查看并执行硬链接 testln.sh
- 区别总结
- 实操练习
- 创建硬链接
- 创建软链接
- ⚠️注意
什么是软链接
软链接
:又叫符号链接,是系统新建一个链接文件,它实际上是一个特殊的文件。在符号链接中,链接文件实际上是一个文本文件,其中包含所链接的那个文件的位置信息,软链接可以跨系统。软链接文件类似于Windows的快捷方式,快捷方式删了就删了,原来文件还是存在的。
特点
-
类似Windows快捷方式;
-
软链接拥有自己的索引节点和Block块,但是数据块中只保存原有文件的文件名和索引节点号,并没有实际的文件数据;
-
lrwxrwxrwx 软链接
,软链接文件权限都为rwxrwxrwx
-
修改任意文件,另一个都改变;
-
删除原文件,软链接不能使用。
-
软链接本身只占用很少的磁盘空间,因为它只是一个指向目标文件或目录的指针。
缺点
依赖性: 软链接依赖于目标文件或目录的存在。如果目标被删除或移动,软链接将成为悬挂链接,导致访问失败。
性能开销: 访问软链接时需要进行额外的解析步骤,可能会带来轻微的性能开销,尤其是在深层嵌套的目录结构中。
安全性风险:软链接可能被用于恶意目的,例如创建循环链接或指向敏感文件,从而引发安全问题。
权限问题: 软链接的权限设置不当,可能会导致未经授权的访问。比如,一个软链接可能指向一个受保护的文件,如果软链接的权限设置不正确,可能会被非授权用户访问。
可读性: 在文件系统中,软链接可能会增加复杂性,使得文件结构不易理解,尤其是当有多个软链接指向同一个目标时。
实际应用场景
- 版本管理:
在软件开发中,可以使用软链接来指向不同版本的库或可执行文件,方便版本切换和管理。
- 快捷访问:
创建软链接作为快捷方式,方便快速访问常用文件或目录。例如,可以在用户主目录下创建一个软链接指向一个常用的配置文件。
- 共享数据:
在多用户环境中,可以使用软链接来共享数据文件或目录,而不需要复制数据,节省磁盘空间。
- 系统配置:
在系统配置中,可以使用软链接来指向不同的配置文件或脚本,方便系统管理和维护。
- 备份和恢复:
在备份和恢复过程中,可以使用软链接来指向备份目录或文件,方便数据恢复和管理。
- 模块化设计:
在模块化设计中,可以使用软链接来动态加载或卸载模块,例如在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.sh
的inode
号虽然不一样,但是,文件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"链接数
"不会因此发生变化。
⚠️注意: 软链接和硬链接的重要区别是如果删除源文件,那么软链接不可用,但不影响硬链接的使用。
实操练习
创建硬链接
- 第一步:首先在“
/
”目录下创建两个目录user1
和user2
,然后在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】
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!! 下周同一时间再见,各位伙伴们🚴🏻~~