Linux下对inode和块的理解
基本概念
首先讲下inode和块的基本概念。在Linux系统中,文件由元数据和数据块组成。数据块就是多个连续性的扇区(sector),扇区是文件存储的最小单位(每个512字节)。块(block)的大小,最常见的是4KB,也就是连续8个sector组成,存储文件数据和目录数据。而元数据用来记录文件的创建者、创建日期、大小等,这种存储文件元数据信息的区域叫做inode,即索引节点。
由于inode也是用来存储文件相关属性信息的,所以也会消耗硬盘空间。具体包含的信息有inode号,文件的字节数、User ID、Group ID、读、写、执行权限、时间戳(共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间)、链接数(软硬链接)、数据block的位置,注意没有文件名。
在硬盘格式化的时候,操作系统就会将硬盘分为两个区,即数据区和inode区。每个inode节点的大小一般为128B或者256B,inode的总数在格式化文件系统的时候就已经确定。
另外还有几个概念了解一下:
inode Bitmap:即inode位图,用二进制的方式记录了inode的使用情况, 比如inode是否空闲等。
Block Bitmap:即块位图,同Inode Bitmap,用二进制方式记录了块的使用情况。当查找或创建文件时,会扫描此位图来寻找空闲的inode号对应的块。
super block:超级块包含了该硬盘或分区上的文件系统的整体信息,如文件系统的大小等。
dentry:在内核中起到了连接不同的文件对象inode的作用,进而起到了维护文件系统目录树的作用。dentry是一个纯粹的内存结构,由文件系统在提供文件访问的过程中在内存中直接建立。dentry中包含了文件名,文件的inode号等信息。
下图为文件系统inode区block区图:
文件的查找、创建、删除原理
接下来对文件的查找、创建、删除原理三个方面来对inode和块的理解。
文件的查找:比如要查找/var/log/message
文件的创建:比如要创建/backup/test.txt(前提backup目录存在)
文件的删除:删除/backup/test.txt
查找
-
首先根目录(目录也是个文件,不是容器!也可以理解为路径的映射表)会自引用。找到inode表中对应的条目。(暂且把inode表中inode号和其对应的块信息成为条目)
-
inode表中对应的信息指向根目录对应的块,其中有var目录对应的信息和inode号。
-
系统根据var目录inode号回头找到inode表中var目录其对应的条目。
-
根据var目录对应的块信息找到对应的块,其中有log目录对应的信息和inode号。
-
系统又根据log目录inode号在inode表中找到其对应的条目。
-
根据log目录对应的块信息找到对应的块,其中有messages文件。
-
根据messages文件的inode号在inode表中找到其对应的条目。
-
最后系统根据messages对应的条目信息告诉我们messages文件对应了多少的块,最后给我们呈现的就是所看到的数据。
创建
-
首先扫描inode位图,找空闲的inode号,找到之后占用。
-
根目录自引用找到inode表中对应的条目,并根据条目找到对应的块。
-
依据根目录对应的块中backup目录对应的inode号,回头找到inode表中条目。
-
inode表中条目又找到对应的块,在这个块的dentry中新建了一个文件test.txt。
-
然后在最开始扫描占用的inode号给到此test.txt文件。
当要存数据给test.txt文件时,会进行如下:
系统扫描块位图(加速查找磁盘空闲块,记录是否空闲等),找到空闲块,分配大于数据大小的块,最后再回收(避免磁盘碎片)。比如要创建10k大小的test.txt文件,一个块4k,只需要3个块,系统分配4个或者多于,最后再去把这多余的块分配到空闲块中等待使用。
删除
当要删除一个文件时,其实就是把其使用的block位图标记为空闲,inode位图的相关位置成空,相当于不被占用,系统就认为此文件删除。但是数据还在,在下次创建文件时,就可覆盖原已清空block位图和inode位图的文件的数据。
文件粉粹也只是使用一些随机数据填充进原来文件的数据块中,导致文件难以恢复。
以上