- inode
- 软硬链接
- 创建软硬链接
- 理解硬链接
- 理解软链接
inode
了解一下文件系统:
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被
划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设
定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的
- Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相
同的结构组成。政府管理各区的例子 - 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,
未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的
时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个
文件系统结构就被破坏了—备份 - GDT,Group Descriptor Table:块组描述符,描述块组属性信息
- 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没
有被占用 - inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
- inode Table 节点表:存放文件属性 如 文件大小,所有者,最近修改时间等,保存了分组内部所有可用的inode(已经使用/没有使用)
- Date blocks :保存的是分组内部所有文件的数据块
软硬链接
创建软硬链接
创建软链接:
我们先随便touch
一个文件file.txt
,我们使用ll -li
命令查看到的前面的数字是inode
的值,这里是658016
给一个文件创建软链接命令:
ln -s file.txt soft_file.link
软链接的inode
值是658307
创建硬链接:
给一个文件创建硬链接命令:
ln file.txt hard_file.link
我们可以发现file.txt
和hard_link
的属性和inode都是一样的
理解硬链接
我们给file.txt
文件中追加重定向一些数据:
我们使用cat
命令查看file.txt
与hard_file.link
里面的数据,可以发现都是一样的内容
建立一个硬链接,究竟是做了什么?
建立硬链接,根本没有创建新文件!因为没有给硬链接分配独立的inode既然没有创建文件,那么你一定没有自己的属性集合和内容集合你用的一定是别人的inode和内容
这个数字2
,其实就是inode
里面用来引用计数的硬链接数。
建立一个硬链接,就是在指导的路径下,新增文件名和inode编号的映射关系
什么时候一个文件算是被真正删除了?
我们将file.txt
删除后,它的硬链接个数会-1
当一个人文件的硬链接数变为0的时候,这个文件才算真正被删除了
理解软链接
我们将软链接的文件file.txt
删除,我们会发现它的软链接标红了,且我们使用cat
命令显示找不到这个文件,同样也可以说明,软链接不是通过inode
编号去寻找file.txt
,因为硬链接跟原文件inode编号是一样的,软链接是通过文件路径来寻找的。
比如我们重新创建一个同名文件,他有全新的inode
,这时候软链接就恢复了,但是跟之前的硬链接已经没关系了:
一般情况下,软链接相当于windows下软件的快捷方式
总结软硬件链接:
- 软硬链接有什么区别:是否具有独立的inode
- 软链接具有独立的inode,可以被当做独立文件看待
- 硬链接没有独立的inode
软链接的作用:
下面是完整的shell操作流程:
[AMY@VM-12-15-centos lesson_13]$ mkdir -p ./bin/exe/mydir/
[AMY@VM-12-15-centos lesson_13]$ cd ./bin/exe/mydir/
[AMY@VM-12-15-centos mydir]$ ll
total 0
[AMY@VM-12-15-centos mydir]$ touch hello.c
[AMY@VM-12-15-centos mydir]$ vim hello.c
[AMY@VM-12-15-centos mydir]$ cat hello.c
#include <stdio.h>
int main()
{
printf("hello world!!\n");
return 0;
}
[AMY@VM-12-15-centos mydir]$ gcc -o hello hello.c
[AMY@VM-12-15-centos mydir]$ ll
total 16
-rwxrwxr-x 1 AMY AMY 8360 Jun 24 16:28 hello
-rw-rw-r-- 1 AMY AMY 79 Jun 24 16:27 hello.c
[AMY@VM-12-15-centos mydir]$ cd -
/home/AMY/zt/lesson_13
[AMY@VM-12-15-centos lesson_13]$ pwd
/home/AMY/zt/lesson_13
[AMY@VM-12-15-centos lesson_13]$ ln -s ./bin/exe/mydir/hello myhello
[AMY@VM-12-15-centos lesson_13]$ ll -i
total 4
658016 drwxrwxr-x 3 AMY AMY 4096 Jun 24 16:26 bin
658313 lrwxrwxrwx 1 AMY AMY 21 Jun 24 16:30 myhello -> ./bin/exe/mydir/hello
[AMY@VM-12-15-centos lesson_13]$ ./myhello
hello world!!
上面的主要意思就是在该路径lesson_13
下面创建一个目录到./bin/exe/mydir/
,然后在这个路径写一个程序hello.c
用来输出hello world!!
,然后回到原路径,创建一个软链接ln -s ./bin/exe/mydir/hello myhello
,运行程序./myhello
输出hello world!!
硬链接的作用:
思考下面为什么普通文件的硬链接个数是1
,而目录文件的硬链接是2
?
一个普通文件,本身就有一个文件名和自己的inode具有一个映射关系
而一个目录文件,除了本身文件名与自己的inode的一个映射关系,在目录里面还有
.
表示当前文件,与目录也具有一个映射关系,所以它的初始硬链接个数是2.
我们在mydir
里面再创建一个目录,它的硬链接就是3
了
[AMY@VM-12-15-centos empty]$ ll -ia
total 8
658308 drwxrwxr-x 2 AMY AMY 4096 Jun 24 16:57 .
658307 drwxrwxr-x 3 AMY AMY 4096 Jun 24 16:57 ..
[AMY@VM-12-15-centos empty]$ cd ..
[AMY@VM-12-15-centos mydir]$ ll -ia
total 12
658307 drwxrwxr-x 3 AMY AMY 4096 Jun 24 16:57 .
658301 drwxrwxr-x 3 AMY AMY 4096 Jun 24 16:47 ..
658308 drwxrwxr-x 2 AMY AMY 4096 Jun 24 16:57 empty
[AMY@VM-12-15-centos mydir]$ cd ..
[AMY@VM-12-15-centos lesson_13]$ ll -ia
total 12
658301 drwxrwxr-x 3 AMY AMY 4096 Jun 24 16:47 .
664585 drwxrwxr-x 17 AMY AMY 4096 Jun 23 20:38 ..
658016 -rw-rw-r-- 1 AMY AMY 0 Jun 24 16:47 file.txt
658307 drwxrwxr-x 3 AMY AMY 4096 Jun 24 16:57 mydir
如有错误或者不清楚的地方欢迎私信或者评论指出🚀🚀