6.INode
Nevermore 2022-06-03 OS
# 1. 基本知识
- 系统将文件的概念与有关它的任何相关信息(如访问权限、大小、所有者、创建时间等)分离开来。此信息有时称为文件元数据(即关于文件数据的数据),并存储在与文件不同的数据结构中,称为inode。Linux系统对文件的识别是通过inode编号进行的,可以通过
ls -li
查看。 - OS会将一个磁盘看成一段连续的区域,为了方便管理磁盘上的数据,会对磁盘进行分区。每个分区上可以用一个文件系统进行管理。而每个文件系统又把自己管理的区域分成了许多组,每个组里包含了以下内容:
Super Block:包含了 整个分区有多少组、使用情况等信息;
Group Descriptor: 整个分组的使用情况;
Block Bitmap:位图,可以快速查找数据块的使用情况,并为新的节点分配相应的数据块;有数据相应的位为1;
inode Bitmap : 位图,可以快速查找inode编号的使用情况,每个bit位代表一个inode编号 ; 每个位是1或0,代表对应的inode是否被占用;
inode Table : 存储文件属性相关的结构体数据,包含文件名、权限、inode和数据块的映射关系等
Data blocks:存储文件的文本数据块。
目录也是文件,其Data blocks里面存放的是目录下文件的文件名和其inode编号的映射关系。在系统管理磁盘时,会将某个分区挂载到一个目录下,则通过目录即可查找修改目录下的文件。
- 创建文件时,会给文件分配一个inode和相应的数据块,并将文件名和inode的映射关系存储到文件所在的目录中;
- 查看文件时只需要读取目录的Data blocks,找到inode,再通过inode找到文件的属性信息以及文件的数据块内容;
- 删除文件只需先在inode中找到该文件使用的Data blocks 的ID,将对应的Block Bitmap中的相应位置0,再将inode bitmap在相应的位置0即可。删除文件不会真实对数据内容作处理,只要数据没有被覆盖,就可以通过一定的方式恢复出来。
# 2. 软硬链接
- 软链接。为深路径下的可执行程序建立快捷方式,本质上它是一个独立文件,有自己的inode和数据块,其数据块中保存的是被链接文件的路径。
[test@VM-12-4-centos first]$ ln -s txt txt_s
[test@VM-12-4-centos first]$ ls -li
1052002 -rw-rw-r-- 2 test test 12 Jun 3 20:21 txt
1052003 lrwxrwxrwx 1 test test 3 Jun 3 20:21 txt_s -> txt
[test@VM-12-4-centos first]$ cat txt
hello world
[test@VM-12-4-centos first]$ cat txt_s
hello world
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
- 硬链接。不是一个独立的文件,它可以把一个长的文件名重新命名成一个短的文件名,相当于增加了一个inode和文件名的映射。建立硬链接会对inode中的文件引用计数+1,而软链接不会。当文件的引用计数为0时,文件就会被删除。
[test@VM-12-4-centos first]$ ln txt txt_h
[test@VM-12-4-centos first]$ ls -li
1052002 -rw-rw-r-- 2 test test 12 Jun 3 20:21 txt
1052002 -rw-rw-r-- 2 test test 12 Jun 3 20:21 txt_h # 硬链接创建的,与原来的文件共有一个inode编号,相当于别名
1052003 lrwxrwxrwx 1 test test 3 Jun 3 20:21 txt_s -> txt
[test@VM-12-4-centos first]$ cat txt_h
hello world
1
2
3
4
5
6
7
2
3
4
5
6
7
- 删除原始文件后
[test@VM-12-4-centos first]$ rm txt
[test@VM-12-4-centos first]$ ls -li
1052002 -rw-rw-r-- 1 test test 12 Jun 3 20:21 txt_h
1052003 lrwxrwxrwx 1 test test 3 Jun 3 20:21 txt_s -> txt
[test@VM-12-4-centos first]$ cat txt_h # 删除原始文件对硬链接没有影响
hello world
[test@VM-12-4-centos first]$ cat txt_s # 删除原始文件,软链接无法使用
cat: txt_s: No such file or directory
#################################################################################
[test@VM-12-4-centos first]$ ls -lid ../first/
1051998 drwxrwxr-x 2 test test 4096 Jun 3 20:32 ../first/
[test@VM-12-4-centos first]$ cd ..
[test@VM-12-4-centos Fork]$ ls -dli ../Fork/
1050289 drwxrwxr-x 3 test test 4096 May 31 01:21 ../Fork/
# 引用计数是3,因为该目录中的'.' '和子目录中的'..'都指向这个目录
# 若在该目录下再创建一个目录,则引用计数又会+1,因为新创建的目录下'..'也会指向这个目录。
[test@VM-12-4-centos first]$ ls -ali
total 8
1051998 drwxrwxr-x 2 test test 4096 Jun 3 20:32 . # 可以看到目录当前路径下的‘.’ 是该目录的硬链接
1050289 drwxrwxr-x 3 test test 4096 May 31 01:21 .. #‘..’是上层目录的硬链接。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
- 使用
unlink
可以取消链接。