复习文件系统-导入软硬链接
一般情况下,文件名和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时间做了调整。