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://xdym11235.com/archives/152.html
具体版权规定详见侧栏版权说明页面
学习