问题描述:
磁盘有足够剩余空间,但在创建文件或文件夹时报错,提示“设备没有空间”。
问题原因:
当存储设备通过分区格式化为文件系统后,会分为两部分:
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% / tmpfs 7.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