inode?
前几天在看Vulhub的文档时,看到了有关inode不足的问题,觉得很有意思,决定一探究竟。
What is inode?
想要了解inode就得知道Linux的Ext32文件系统,所以就先从Ext32文件系统开始。
在Ext32文件系统(与FAT和NTFS相似)中,有三个重要概念,分别是super block、inode、block。
super block记录此文件系统的整体信息,包括inode/block的总量、使用量、剩余量,以及文件系统的格式与相关信息等;inode记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码;block实际记录文件的内容,若文件太大时,会占用多个block。
使用dumpe2fs可以查看分区的super block信息
使用stat命令查看Linux中任意文件的inode信息。同时,我们也可以用df -i来查看当前系统的inode总量和使用情况
在格式化储存介质时,Ext32文件系统会规划好block和inode的数量和大小,除非重新格式化,否则block和inode就再也不变了。
通常情况下,Ext32文件系统为每个block分配4096字节空间,也就是说一个block可以装4KB数据,但是并不是每个文件都不大于4KB,所以大于4KB的文件会被分配更多的block,那么如何管理每个文件分配的block就成了问题,这时候就需要用的inode。
inode主要记录文件的属性以及该文件实际数据存放的block号,inode记录的文件数据至少有如下信息:
- 该文件的访问模式(rwx权限信息)
- 该文件的所有者与组(owner/group)
- 该文件的大小
- 该文件的创建或改变时间(ctime)
- 最近一次的读取时间(atime)
- 最近修改的时间(mtime)
- 定义文件特性的标志
- 文件数据内容的指向
因为每个文件都需要分配一个inode号,所以很容易造成inode号不足,导致无法创建新的文件,在《鸟哥的Linux私房菜》中鸟哥举了一个例子,详见下图
这也就解答了为什么文章开头的链接中产生的问题,最近一段时间我发现我其实根本都不懂Linux操作系统,我之前写的文章LD_PRELOAD 与绕过 PHP 禁用函数和提权和Docker技术原理中所使用的技术几乎都是Linux操作系统的自身特性,因为我不了解Linux操作系统导致我在很多事情、工作和学习中遇到一些问题,所以我突然觉得学习Linux操作系统变得更为重要,这也算是对我2022年的一些期望吧。
虽然我基本上已经理解了inode,但是其实还有很多内容没有写进来,如果还想学习更多有关inode的内容,还是推荐我的参考资料,里面讲的还是很详细的。
推荐阅读
参考资料
- 《鸟哥的Linux私房菜 基础学习篇》
- https://ruanyifeng.com/blog/2011/12/inode.html
Tips1:经过我的测试,似乎可以通过df -i可以判断当前环境是否为docker环境,希望有大佬能指点一二
Tips2:《鸟哥的Linux私房菜 基础学习篇》PDF下载
《inode?》链接:https://www.xdym11235.com/archives/152.html
具体版权规定详见侧栏版权说明页面
学习