【Linux】深入解析Linux硬链接:文件权限实战指南(hard link)

ℹ️大家好,我是练小杰,时间过得真快,周三了,还有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。

⚠️注意事项

  1. 只有拥有相同的inode 和 存储block块,才能看作是同一个文件;
  2. 可以通过inode识别文件;
  3. 硬链接不能跨分区,如果尝试在不同文件系统的文件之间创建硬链接,将会失败。因为硬链接是通过inode(索引节点)来实现的,而不同文件系统的inode是独立的。
  4. 硬链接不能针对目录使用,虽然理论上是可以创建目录的硬链接,但是实际上大多数操作系统不允许这样做,以避免形成循环引用,导致文件系统的遍历出现问题。
  5. 硬链接是多个目录项指向同一个inode,删除一个硬链接并不会删除文件本身,只有当所有硬链接都被删除后,文件才会被真正删除。这使得文件的管理和跟踪变得复杂,尤其是在大型文件系统中。
  6. 所有硬链接共享相同的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.shtest.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.shinode号相同,都指向同一个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 ..  

可以看到,默认会生成两个目录项:“.“和”..

  • 查询子目录inodedirinode
[root@localhost inodetest]# ls -i ./  
16791533 inodedir
  • 查询inodedir的父目录inodetestinode
[root@localhost /]# ls -i ./  
50785938 inodetest

可以看出,新创建的目录文件的"链接数"是2!!

分析原因

问题:链接数为什么是2呢?!

因为,在创建目录时,系统默认会生成两个目录项:“.“和”..”。
前者的inode号就是当前目录inodedir的inode号,等同于当前目录的"硬链接";后者的inode号就是当前目录的父目录inodetest的inode号,等同于父目录的"硬链接"。
所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“。


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

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

练小杰

感谢支持!你可真有眼光!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值