问题描述:
磁盘有足够剩余空间,但在创建文件或文件夹时报错,提示“设备没有空间”。
问题原因:
当存储设备通过分区格式化为文件系统后,会分为两部分:
1、block部分: 存储的最小单位为扇区(Sector),8个连续的扇区为block,为提高效率,操作系统通常按照block来进行数据访问。
2、inode部分: 存储block的元数据信息,如文件创建者/创建时间/文件大小/文件block位置等。
每个分区的inode数量有限,当block有剩余,但inode用完时,系统也会提示磁盘空间不足。
问题排查:
查看各分区的inode使用情况
## 查看根目录下的inode使用:
df-lhi
正常的输出信息:
Filesystem Inodes IUsed IFree IUse%Mounted on/dev/sda1 1.3M 421K 831K 34% /tmpfs7.9M 1 7.9M 1% /dev/shm/dev/sda3 222M 40K 222M 1% /export
如果IUse%为100%,则表示该分区所有inode用完。
查看根目录下各目录的inode使用情况:
for i in /*;
do
node_count=`find $i | wc -l`
echo "$i : $node_count "
done
输出结果:
/bin : 112
/boot : 29
/dev : 818
/etc : 1548
/export : 40854
/home : 32
/lib : 3657
/lib64 : 394
/lost+found : 1
/media : 1
/mnt : 1
/opt : 18
/proc : 2371402
/root : 43
/sbin : 274
/selinux : 1
/srv : 1
/sys : 20774
/tmp : 10
/usr : 72055
/var : 358262
可以发现/var目录下使用较多,查看/var目录的使用:
for i in /var/*;
do
node_count=`find $i | wc -l`
echo "$i : $node_count "
done
最后定位到/var/spool/clientmqueue下面使用较多。
问题扩展
由于早期在配置cron进行定时作业时,未在文件头部配置MAILTO="",导致在/var/spool/clientmqueue下面创建大量小文件,导致inode被用完。
如果直接使用rm命令删除特定目录下大量小文件,会存在性能问题,推荐使用下面方式:
ls /var/spool/clientmqueue | xargs /bin/rm -rf