ℹ️大家好,我是练小杰,时间过得真快,周三了,还有2天就是星期五了,为了美好的明天加油干!!💪⛽️
努力!!! 奋斗!!! 😆
本文是对Linux 文件权限中的 硬链接进行详细的解释及实例操作,后续将添加更多相关知识噢,谢谢各位的支持🙏前情回顾: 【Linux文件中 inode 不足的案例】
Linux专栏:🔝 【Linux零基础开始】【Shell 脚本编程】 【文件权限专栏】主页:👉【练小杰的CSDN】
文件的硬链接
前言
通过前几天的学习,我们已经深入介绍了文件的基本权限,文件类型和inode号,基于
inode
的实质,我们可以使用不同的文件名共用同一个inode。通过这一点,在Linux
系统中,可以通过链接文件实现通过不同的路径去访问同一个文件,链接文件的链接方式分为硬链接(hard link)
和软链接(symbolic link)
。
今天首先分析硬链接,废话少说,马上进入正题!!!
初识硬链接
硬链接:指通过文件的
inode
进行链接。
- 通过学习,可知每个文件都会将它的权限与属性记录在文件系统的
inode
中,操作系统根据inode
号来识别不同的文件。这样,每个文件都会有一个inode
。 - 一般情况下,文件名和inode号是"一一对应"关系,每个inode号码对应一个文件名。
- 但是,在
Linux
系统允许多个文件名指向同一个inode,这意味着可以用不同的文件名访问同样的文件。 - 而且,若对文件内容修改会影响所有与这个
inode
对应的文件,并且删除一个文件名,不影响利用其它文件名访问这个文件的,我们称这种情况为"硬链接"(hard link)。
一图理解硬链接
- 如下图所示,如果我们删除
文件名1
,那么利用文件名2
和文件名3
照样可以访问这个文件。
硬链接的作用
- 允许一个文件拥有多个有效路径名,这样用户就可以通过建立硬链接到用户的重要文件,以防止“误删”的功能。由于对应该文件的
inode
有一个以上的链接,只删除一个链接并不会影响索引节点本身和其它的链接文件。 - 但当最后一个链接文件被删除后,就会释放文件的数据块及目录的链接,换句话说,只有删除文件的所有硬链接文件,才能真正删除该文件。例如上图里那样,当删除了文件名1,文件名2和文件名3后,才会删除这个inode。
⚠️注意事项
- 只有拥有相同的inode 和 存储block块,才能看作是同一个文件;
- 可以通过inode识别文件;
- 硬链接不能跨分区,如果尝试在不同文件系统的文件之间创建硬链接,将会失败。因为硬链接是通过
inode
(索引节点)来实现的,而不同文件系统的inode是独立的。- 硬链接不能针对目录使用,虽然理论上是可以创建目录的硬链接,但是实际上大多数操作系统不允许这样做,以避免形成循环引用,导致文件系统的遍历出现问题。
- 硬链接是多个目录项指向同一个inode,删除一个硬链接并不会删除文件本身,只有当所有硬链接都被删除后,文件才会被真正删除。这使得文件的管理和跟踪变得复杂,尤其是在大型文件系统中。
- 所有硬链接共享相同的inode,因此它们也共享相同的权限、所有者和其他元数据。如果修改了一个硬链接的权限,所有其他硬链接都会受到影响。
创建和删除文件的硬链接
使用
ln (link)
命令可以创建硬链接,如下所示:
ln [源文件] [目标文件]
检查硬链接数量
可以使用
ls -l
命令查看文件的硬链接数量,以确认删除操作是否会影响文件的完整性,在输出结果中的link count
(链接计数)表示当前文件的硬链接数量。
ls -l file1
删除文件的硬链接
删除硬链接可以使用
rm
命令。由于硬链接和普通文件在文件系统中没有区别,删除硬链接的方式与删除普通文件相同。
rm [选项] 硬链接路径
- 举例:假设有一个文件
test1
,我们创建了一个硬链接link1
ln test1 link1
- 要删除硬链接link1,使用以下命令
rm link1
- 若想要删除多个硬链接,可以将它们一起列出:
rm link1 link2 link3
⚠️注意
- 谨慎使用
rm
命令
删除硬链接后,如果这是最后一个指向该
inode
的链接,文件将被删除且无法恢复。因此,在使用rm
命令时要特别小心,确保删除的是正确的文件或链接。
- 使用
-i
选项:为了增加安全性,可以使用-i选项,这样在删除每个文件之前都会提示确认。例如:rm -i link1
- 检查硬链接数量:在删除硬链接之前,可以使用
ls -l
命令查看文件的硬链接数量。
实操1
在目录
inodetest
下创建一个shell脚本文件(其它文件也可以的),对于文件来说,受到umask
的限制,默认新创建的文件是没有可执行(x
)权限的,因此必须追加其x
权限,然后,再创建一个子目录subinodedir
,在这个子目录下创建test.sh
的硬链接文件,查看它们是否有相同的inode
。具体操作如下所示:
1. 在目标目录创建脚本文件
[root@localhost /]# cd inodetest
[root@localhost inodetest]# vim test.sh
#!/bin/sh
echo "This is a hard link!"
2. 授予执行权限执行脚本
[root@localhost inodetest]# chmod 744 test.sh
[root@localhost inodetest]# ./test.sh
This is a hard link!
3. 创建子目录和硬链接文件
[root@localhost inodetest]# mkdir subinodedir
[root@localhost inodetest]# cd subinodedir
[root@localhost subinodedir]# ln ../test.sh testln.sh
4. 查看硬链接文件并运行
[root@localhost subinodedir]# ll
-rwxr--r--. 2 root root 38 Feb 19 21:26 testln.sh
可以看到,链接数变成了2,权限头不是“
l
”
- 运行硬链接文件
testln.sh
与test.sh
的运行结果相同
[root@localhost subinodedir]# ./testln.sh
This is a hard link!
5. 查看两个文件的inode 号
[root@localhost subinodedir]# ls -i testln.sh
52621635 testln.sh
[root@localhost subinodedir]# ls -i ../test.sh
52621635 ../test.sh
可以看到,这时两个文件共用同一个
inode
号
6. 显示两个文件的详细信息
[root@localhost subinodedir]# stat testln.sh
File: 'testln.sh'
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: 2025-02-19 21:28:44.386701866 -0700
Modify: 2025-02-19 21:26:37.532584298 -0700
Change: 2025-02-19 21:28:24.648216773 -0700
Birth: -
[root@localhost subinodedir]# stat ../test.sh
File: '../test.sh'
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: 2025-02-19 21:28:44.386701866 -0700
Modify: 2025-02-19 21:26:37.532584298 -0700
Change: 2025-02-19 21:28:24.648216773 -0700
Birth: -
可以发现,运行上面命令以后,源文件
test.sh
与目标文件testln.sh
的inode
号相同,都指向同一个inode。inode
信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。
反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。
实操2
- 测试创建的目录的链接数特点(注意:目录是不能硬链接的),在目录
inodetest
下创建一个空的子目录inodedir
,然后观察其inode的特点。
[root@localhost inodetest]# mkdir inodedir
[root@localhost inodetest]# cd inodedir
[root@localhost inodetest]# ls -l
drwxr-xr-x. 2 root root 6 Feb 19 21:10
可以看到,
inodedir
新创建的目录inodedir
的链接数是2!
比较目录inodetest
和子目录inodedir
- 列出子目录
inodedir
下的所有文件和该目录下的 inode 号和名称
[root@localhost inodetest]# ls -a -i ./inodedir
16791533 . 50785938 ..
可以看到,默认会生成两个目录项:“
.
“和”..
”
- 查询子目录
inodedir
的inode
[root@localhost inodetest]# ls -i ./
16791533 inodedir
- 查询
inodedir
的父目录inodetest
的inode
[root@localhost /]# ls -i ./
50785938 inodetest
可以看出,新创建的目录文件的"链接数"是2!!
分析原因
问题:链接数为什么是2呢?!
因为,在创建目录时,系统默认会生成两个目录项:“
.
“和”..
”。
前者的inode
号就是当前目录inodedir
的inode号,等同于当前目录的"硬链接";后者的inode号就是当前目录的父目录inodetest
的inode号,等同于父目录的"硬链接"。
所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2
是父目录对其的“硬链接
”和当前目录下的".硬链接
“。
今天的Linux系统的文件硬链接内容到这里就结束了,感谢各位朋友的支持👋
ℹ️了解更多,主页【练小杰的CSDN】
⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!!
下周同一时间再见,各位伙伴们🚴🏻~~