一、磁盘的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 :执行脚本
来源:oschina
链接:https://my.oschina.net/u/4267459/blog/4325984