在讲inode之前,首先要明白为什么会有inode ?inode是用来干啥的?带着这两个问题,我将开始讲述我理解的inode 。
设想一个场景,在windows下,创建一个新的文件,这个文件都包含哪些信息?最基本的包含文件属性和文件数据,而文件属性包括文件大小、创建时间、文件类型…数据就是我们在文件中写入的东西,那在Linux下也是一样的,创建一个文件也需要创建这些东西,但是又牵扯到属性和数据分离的问题,所以就有了inode,利用inode来存储文件的属性,利用数据块来存储数据。下面我将详细介绍inode基础知识点:
一、关于文件系统
上图为磁盘文件系统图,磁盘是典型的块设备,硬盘分区被划分为一个个的block,一个block的大小是由格式化的时候确定的,并且不可以更改。
注意这几点:
- inode位图:每个bit表示一个inode是否空闲可用
- 块位图:记录Data Block中哪个数据块已经被占用,哪个数据块没有被占用
- i节点表(inode Table):存放文件属性
- Data Block:存放文件内容
二、inode是什么?
文件存储在硬盘上,硬盘的最小存储单位叫做“扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。
操作系统读取硬盘的时候,不会一个个扇区的读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个“块”(block)。这种由多个扇区组成的“块”,是文件存取的最小单位。“块”的大小,最常见的是4KB,即连续八个sector组成一个block。
文件数据都储存在“块”中,那么很显然,我们还必须找到一个地方储存文件的“元信息”,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点“。
每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。
三、inode的内容
- Size 文件的字节数
- Uid 文件拥有者的User ID
- Gid 文件的Group ID
- Access 文件的读、写、执行权限
- 文件的时间戳,共有三个:
Change 指inode上一次变动的时间
Modify 指文件内容上一次变动的时间
Access 指文件上一次打开的时间 - Links 链接数,即有多少文件名指向这个inode
- Inode 文件数据block的位置
- Blocks 块数
- IO Blocks 块大小
查看inode信息
stat 文件名
四、inode大小
查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。
df -i
由于每个硬盘分区inode的数量是有限的,所以可能存在inode已经用完了,但是硬盘还没存满的情况,此时就不能创建新的文件。
五、创建一个新文件,经过了哪些操作?
每个文件都对应一个inode号码,操作系统通过inode号码识别不同的文件
ls -i 命令,查看文件名对应的inode号码
ls -i sum.c
创建一个新文件的步骤:
- 存储属性:内核先找到一个空闲的i节点(这里是21368157),内核把文件信息记录其中
- 存储数据:该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800,将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推
- 记录分配情况:文件内容按顺序300,500,800存放,内核在inode上的磁盘分布区记录了上述块列表
- 添加文件名到目录:文件名和inode之间建立映射关系
六、删除文件,经历哪些操作
- 找到文件对应的inode号码
- 把文件对应的inode位图和数据区位图由1置为0
- 去掉目录里inode和文件名的映射关系
七、打开文件,经历哪些操作
- 找到文件对应的inode号码(在目录文件中,文件名和inode之间建立了映射关系ls -i 文件名查看)
- 获取inode信息
- 根据inode信息(inode中存了文件所使用的数据块列表)找到文件的block,读出数据
八、inode特殊作用
由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。
1、有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
2、移动文件或重命名文件,只是改变文件名,不影响inode号码。
3、打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。
第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。
此篇文章参考大佬博客:https://blog.csdn.net/xuz0917/article/details/79473562