inode与软硬链接

文章详细介绍了Unix/Linux系统中的硬链接和软链接,包括它们的创建方式、特点和区别。硬链接通过inode号码关联,不创建新的inode,而软链接有自己的inode,保存目标文件的路径。硬链接不允许跨文件系统,而软链接可以对不存在的文件或目录进行链接。此外,文章提到了硬链接和软链接在文件删除、计数特性和应用场景中的差异,如动态库和静态库的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复习文件系统-导入软硬链接

一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。 除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。 这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:“No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

软硬连接

在shell中,硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件。

创建软链接ln -s 被链接的文件名 链接文件

上述命令是创建软链接的,ln表示link,-s表示soft

[yyq@VM-8-13-centos 2023_02_07_Hard-Soft_Link]$ touch ceshi.txt
[yyq@VM-8-13-centos 2023_02_07_Hard-Soft_Link]$ ln -s ceshi.txt CESHI_Soft.LINK//为ceshi.txt创建软链接,CESHI_Soft.LINK访问ceshi.txt
[yyq@VM-8-13-centos 2023_02_07_Hard-Soft_Link]$ ll
total 0
lrwxrwxrwx 1 yyq yyq 9 Feb  7 17:12 CESHI_Soft.LINK -> ceshi.txt//可以看出文件类型是l,叫做链接文件
-rw-rw-r-- 1 yyq yyq 0 Feb  7 17:11 ceshi.txt

再看看这两个文件的inode

[yyq@VM-8-13-centos 2023_02_07_Hard-Soft_Link]$ ls -i -l
total 0
922006 lrwxrwxrwx 1 yyq yyq 9 Feb  7 17:12 CESHI_Soft.LINK -> ceshi.txt//软连接也是一个独立的文件,有自己独立的inode
922005 -rw-rw-r-- 1 yyq yyq 0 Feb  7 17:11 ceshi.txt//文件权限后面的1表示链接数

创建硬链接ln 被链接的文件名 链接文件

[yyq@VM-8-13-centos 2023_02_07_Hard-Soft_Link]$ ln ceshi.txt CESHI_Hard.LINK
[yyq@VM-8-13-centos 2023_02_07_Hard-Soft_Link]$ ll
total 0
-rw-rw-r-- 2 yyq yyq 0 Feb  7 17:11 CESHI_Hard.LINK
lrwxrwxrwx 1 yyq yyq 9 Feb  7 17:18 CESHI_Soft.LINK -> ceshi.txt
-rw-rw-r-- 2 yyq yyq 0 Feb  7 17:11 ceshi.txt
-------------inode信息--------------
922005 -rw-rw-r-- 2 yyq yyq 0 Feb  7 17:11 CESHI_Hard.LINK//硬链接的inode与ceshi.txt一样,多个文件名指向同一个inode,该inode的链接数变为2(inode的引用计数-硬链接数)
922006 lrwxrwxrwx 1 yyq yyq 9 Feb  7 17:18 CESHI_Soft.LINK -> ceshi.txt
922005 -rw-rw-r-- 2 yyq yyq 0 Feb  7 17:11 ceshi.txt

删除链接文件

unlink 文件名

区别

1、软硬链接的区别是:是否具有独立的inode!软链接有独立的inode,可以被当作独立文件看待;硬链接没有独立的inode,与文件共用一个inode,硬连接是不会建立inode的,他只是在文件原来的inode link count域再增加1而已,也因此硬链接是不可以跨越文件系统的。

2、计数特征:硬链接会更改目标文件的引用计数(新增文件名,建立和inode的映射关系),软链接在文件内容中保存目标文件的路径(即通过路径,说白了就是文件名建立映射关系)。

3、硬链接删除后,不影响原文件;删除原文件,不影响硬链接。软链接删除后,不影响原文件;删除原文件,会影响软链接(提示“没有该文件或目录”)。

4、软链接可以对一个不存在的文件名(filename)进行链接,硬链接不可以(其文件必须存在,inode必须存在);软链接可以对目录进行连接,硬链接不可以。

硬链接

建立一个硬链接,OS做了什么?在指定的路径下(目录)创建硬链接,在目录的data block中新增硬链接的文件名和被链接文件的inode的映射关系。(告诉目录我就要和他建立链接关系)

通过观察,我们可以看到硬链接的属性、拥有者所属组、文件大小、时间等都是与被链接文件一样的。建立硬链接实际上什么都没做,没有创建新文件。因为没有给硬链接分配独立的inode。既然硬链接没有创建新文件,那么硬链接的属性集合和内容集合用的肯定是别的文件的。

inode的引用计数–就叫做硬链接数,我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。

什么时候一个文件算被真正地删除呢?不单单是位图对应的比特位置0,而是其硬链接数变成0的时候才算被真正删除

普通文件和目录的默认硬链接数

创建一个普通文件,其硬链接数为1;创建一个目录,其硬链接数为2。

为什么普通文件的默认硬链接数为1呢?因为一个普通文件就有其对应的inode,文件名与inode形成映射关系,所以算1个硬链接。

为什么目录的默认硬链接数为2呢?因为在目录中还有隐藏的....表示当前路径,即.是这个目录的一个硬链接。从下面的代码可以看到.empty的inode编号922010相同。故第1个硬链接为文件名自己;第2个硬链接为.所表示的当前路径。

[yyq@VM-8-13-centos 2023_02_07_Hard-Soft_Link]$ ll -i -n
922010 drwxrwxr-x 2 1001 1001 4096 Feb  8 13:55 empty
[yyq@VM-8-13-centos 2023_02_07_Hard-Soft_Link]$ cd empty
[yyq@VM-8-13-centos empty]$ ll -a -i -n
total 8
922010 drwxrwxr-x 2 1001 1001 4096 Feb  8 13:55 .//empty的硬链接
922001 drwxrwxr-x 3 1001 1001 4096 Feb  8 13:55 ..//上层目录的硬链接数会+1

普通用户不允许给目录创建硬链接,可以建立软链接。为什么?而...不就是给目录建立硬链接吗?

因为OS不允许普通用户创建,...是特殊情况,是由OS自己创建的。目录硬链接产生了很多回环依赖的关系,并且导致了很多歧义性。实际上Linux的目录结构虽然经常被称为目录树,是不带回环的图结构。

硬链接是与本体完全等价,无法单独处理,会导致递归;符号链与本体不等价,可以单独处理,不会导致递归。而文件不会导致递归,所以可以硬链接。

软连接/符号链接

是一个独立的文件,有独立的属性和内容。软链接标定/查找一个文件时,不是用inode去找到文件的,而是根据文件名来找文件的。软链接的数据块保存的是所指向的目标文件的路径(路径就是用文件名组成的)。

应用场景

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库

ACM时间

Access 最后访问时间: 软硬链接、cat命令(多次访问时间可能不变)等操作,

Modify 文件内容最后修改时间: echo重定向修改内容等操作

Change 属性最后修改时间: chmod命令等操作,

modify和change这两个时间可能联动,因为modify可能会让文件的属性(大小等)发生改变。access时间,访问一定的次数到规定值时才会刷新,因为平时我们的操作就是访问文件,如果每次访问都要刷新访问时间,要把数据更新到磁盘,而磁盘io太慢了,故现在linux对access时间做了调整。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值