当我们在 LIiux 中输入 ll-i 指令时,会显示文件信息:
权限、拥有者、所属组等这些我都知道,但是最前面的比如 1051810 是什么,还有权限后面的3和6是什么呢?本章我们就来讲解一下 inode 和 硬链接数。
透析文件系统:
在磁盘文件中,包含了文件属性+文件内容,文件属性包含了文件的元信息,每一个文件为了方便查找,会起一个唯一的编号:inode,为了方便理解,inode 号我们可以认为它是一个文件的身份证。
inode 是任何一个文件的属性集合,是储存文件元信息的区域,中文译名为"索引节点"。Linux 中几乎每个文件都有,因为存在大量的文件,为了区分才有的 inode。我们的文件内容一般存在硬盘中,硬盘中会有许多扇区,扇区中的块,块就是用来储存内容的,现在的块一般大小是 4k。
我们日常输入的 ls 和 cat 指令,其实本质就是指令变成进程,在磁盘上找到对应的文件信息和文件内容,把其加载到操作系统上,给到用户。
磁盘结构:
我们先来了解一下磁盘文件系统图:
1 和 2 一般是用来描述 inode 和 data blocks 的使用情况,使用了多少?还剩多少?
inode Table 中包含了文件属性信息,而 Data table 包含了文件的数据,它们的空间使用由对应的位图 Bitmap 决定。
iode Table 中包含了属性 inode ID 和 数据 inode blocks[15] 等,数组中的每个下标对应的是使用的块,每一块储存数据后,写入到 blocks 中,每一块是 4kb。
查看文件信息时,就是通过指针或者 inode ID 找到属性,在找到数据;而 inode Bitmap 和 Block Bitmap 是为了查看 inode Table 和 Data Blocks 有哪些被占用,用位图查看比特位的方式。
对常见现象的一些理解:
1、如何理解空文件?
空文件的数据为 0kb,但空文件也有对应的属性信息,所以在 inode Table 上占用了空间,没有在 Data Table 占用空间。
2、创建文件的过程,写入 1kb 是什么过程:
在 touch test.c 后,首先遍历 inode Bitmap,从右向左或者从左向右查找哪个比特位为 0,把它置为 1,随后再区 inode Table 中申请空间给 test.c,填充文件属性信息。
写入 1kb 数据时,先在 Bitmap 中找到 indoe 是几,在 inode Table 中找到 inode {},找到 int blocks[],发现没有开辟空间,要去申请空间,扫描 Block Bitmap,置 1 表示占用,把数据写到 bock 块中。
3、如何理解删除数据?
假设要删除 inode 为 1 的文件,只需区 inode Bitmap 中找到对应的比特位,置为 0,找到 inode 对应的数据块,在 Block Bitmap 中置为 0。
通常我们理解的删除并非完全删除,而是假删除,所以我们就能理解,删除文件为何特别快,拷贝时特别慢,删除了文件还可以恢复,因为闪一个文件只需置为无效即可,不会占空间,下次只需覆盖就行。而拷贝文件需要区位图上申请空间,拷贝数据,所以慢。
4、如何理解目录?
目录的 inode 保存在 inode Table 中,blocks 中放的是目录的数据,数据是里面的文件名与其对应的映射关系 inode 号。但是,目录的文件名并不存在于 inode 中,因为 Linux 底下一切皆文件,所以是保存到数据当中,比如 ' . '。
我们的指令都是通过 inode 号到 inode Table 中找的,而不是通过文件名找的。
软硬链接:
软链接指令:
ln -s 文件名 链接文件名
硬链接:
ln 文件名 链接文件名
我们在软链接后,可以看到权限属性,是 L,代表着是软连接文件。
通俗易懂地理解,我们可以把软链接看作是文件的快捷方式,大小特别小;硬链接可以看作是给文件起别名,类似 C++ 的引用,其实 a.out 和 c.out 都是一个文件罢了。
软硬链接的区别:
1、软链接是一个独立的文件,有自己的 inode;
2、硬链接的作用是恢复数据,方便目录之间通过相对路径跳转;
3、目录下多个文件为何硬链接数那么多,因为目录下的 . 和 .. 都是别名。
这个3怎么理解呢?
我们可以看得出,其实 . 和 .. 都是硬链接,它们是上级目录和上上级目录的别名,有的时候看到硬链接数就可以找到底下有多少个目录。
ls -id // 查看上级目录
ls -i // 查看当前目录
在 inode 中有一个整型变量 ret,可以看作是 count,代表着硬链接数,硬链接加一 ret 加一,当捡到 0 时,才说明文件被干掉了。
其他
Boot Block:
表示分区码,在磁盘分区的开头,起引导找到操作系统代码的作用。
acm:
stat xxx
文件三个时间,a 代表最后访问时间,m 代表文件内容修改时间,c 代表文件属性修改时间。