i节点耗尽演示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了i节点耗尽演示相关的知识,希望对你有一定的参考价值。

                                一、磁盘的inode空间, block空间

//inode空间
也叫文件元信息空间,文件的元信息空间里面包含了i节点号就是文件索引条目的编号,当然元信息里面还包含了文件名,文件的权限,时间戳,文件内容块大小开始结束的位置),一个文件必须占据一个inode元信息空间
//block空间
硬盘最小的存储空间是扇区,一个扇区是512个字节,即为512B,但是硬盘一般需要建立分区,划分block块大小,数量,硬盘内置驱动读取文件内容是在分区里面按block块读的,按扇区来读太慢了,硬盘读写文件都是块大小块大小的读写,所以硬盘分区的好处就是提升文件读取速度还方便归纳整理
//indoe、blcok联系
硬盘中不止有block空间存储文件内容,还有inode空间存储文件元信息,硬盘驱动就是先读取inode空间里面文件的元信息(记录文件内容从哪个block编号开始到哪个block编号结束)然后再去读取保存在block空间中的文件具体内容,indoe空间中记录的文件元信息为硬盘去找这个文件内容提供了一个索引路径,简单理解为索引空间是保存硬盘中所有文件名的一个列表,每个文件在inode中有了这个文件名记录索引才能去block中找到文件内容,这个文件占用空间从哪个block到那个block,文件权限,修改信息,所以我们常说的rm -rf删除一般是删除这个文件的元信息,内容还在真真实实写在磁盘里,这就是硬盘数据恢复的原理,同时硬盘内容大小空间(block空间)能被占满,索引空间也是能被占满的,一个硬盘能记录的索引数目是有上限的,所以就有i节点号,比如硬盘inode空间最多支持记录10万个文件的元信息,我就建10万个空文件,空文件的元信息把硬盘inode空间占满,所以即使你的硬盘block空间还很充足,你也没有办法往硬盘里面写东西了。每个文件的i节点号文件元信息在indoe空间里的编号,文件元信息的大小就记录了几个信息,所以每个文件内容大小可能不一样,但是文件元信息在indole空间里面大小都是基本一样的。
//磁盘分区的格式化
分区的格式化就是分完区我还是个小白,格式化就是给小白定规则,按照一定文件格式给磁盘分区定义分区block块的大小,4kb还是8kb,定义block数量的多少,所以才有mkfs.xfs,mkfs.etx4这些xfs、ext4文件系统,可以简单理解为定义分区block数量大小的文件系统,块大小是可以设置的,xfs、ext4等都有自己默认的块大小,比如对于一个分区我们都是存放一些大文件,那么块大小越大越好,读取块数少,如果分区都是一些小文件,那么块大小小一点好,因为在分区里blocksize是最小的储存单位,块大小小会节约分区的空间,具体设置块大小取决于你对速度和空间的平衡。
注意格式化分区文件系统的时候,对indoe空间和indoe索引数量(文件元信息数量条目)也在定义规则,用df -i可以查看每个分区的i节点数量也就是最多记录个多少个文件
技术图片

技术图片
二、i节点耗尽演示
//原理:利用脚本建很多空文件或者随机函数建随机大小的文件把磁盘indoe空间充满,也就是i节点充满,导致磁盘无法正常进行写入新文件

空文件i节点耗尽演示
技术图片
#!/bin/bash(注释一下脚本执行程序)
echo "当前系统分区情况如下:"
df -i
echo
(到这里就是把df -i的结果显示在屏幕上)
read -p "请输入要搞定的分区:" f
(read -p 从输入获取变量值 -p代表不换行)
n=$(df -i | grep "$f" | awk ‘{print $4}‘)
这个f是你输入的分区,是个变量,$表示引用这个变量,df - i | grep "$f" 假如这个f是sda3 那么在下面就筛选出sda3那一行
技术图片

awk ‘{print $4}‘表示打印出当前显示文本的第四列,那么可以看出这个n值就是一个分区的可用i节点
p=$(df -i | grep "$f" | awk ‘{print $6}‘)
这个p值就是分区的挂载目录

到这里就知道一个分区的挂载点p和可用i节点数n
设置条件循环语句往这个p里面一直写文件直到n停止
i=1
while [ $i -le $n ]
do
while条件循环语句设置一个变量i从1开始,每次都和n比较,小于n就do
touch $p/${RANDOM}$i
在同名挂载点p目录下建立一个名字叫${RANDOM}$i的空文件,这个文件名编号前半部分编号是用${RANDOM}随机函数随机产生的,这样让文件名具有随机性,怎么确保文件编号是一个一个按i值顺序来的,i值也依序用上,就在文件名后半部分编号引用i值,$符号表示引用变量函数
let i+1 一直按顺序+1建立
done
结论:touch建的后果都是空文件很容易被发现。find /sdb1 -size 0K -exec rm -rf {} ;可以找到分区挂载点下的空文件

//非空文件i节点耗尽演示
技术图片

dd if=/dev/zero of=$p/${RANDOM}$i bs=1K count=$((${RANDOM%6}))
每次都建不同大小的文件,这样基本就把这个磁盘干费了,管理员并不知道哪些文件有用哪些没用,随机数字的选择可以算一下,保证“随机文件最大空间*
可用i节点数<可用blcok空间”才能起到i节点验证作用。
//实验演示
技术图片

技术图片
sh .a.sh :执行脚本

技术图片

技术图片

技术图片
技术图片

以上是关于i节点耗尽演示的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode810. 黑板异或游戏/455. 分发饼干/剑指Offer 53 - I. 在排序数组中查找数字 I/53 - II. 0~n-1中缺失的数字/54. 二叉搜索树的第k大节点(代码片段

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

sql 这些代码片段将演示如何逐步使用PolyBase。你应该有一个blob存储和存储秘密方便

如何使用 Android 片段?

Android课程---Android Studio使用小技巧:提取方法代码片段

通过 es.map() 和 JSONStream.stringify() 将 JSONStream.parsed() 数据传输到文件流时,节点堆耗尽