额,linux系统无法写入文件

上次由于磁盘空间不够,不能写入文件造成mysql死锁(测试容器磁盘空间默认10GB)。这次又出现了磁盘不能写入的问题,首先想到是不是磁盘满了,不看不知道一看吓一尿!分区么有满空闲40%+,磁盘没有满为什么不能写入文件,原来是容器那个分区的inode耗尽了:

1
2
3
4
5
6
7
8
9
10
11
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
rootfs 655360 655360 0 100% /
/dev/mapper/docker-8:3-61079671-96d6b91ea4aeccad53cb07a7f3a79e0d6e4083db1bc079a26ff806bfc0048901
655360 655360 0 100% /
tmpfs 6171993 278 6171715 1% /dev
shm 6171993 1 6171992 1% /dev/shm
/dev/sda3 72056832 298300 71758532 1% /etc/resolv.conf
/dev/sda3 72056832 298300 71758532 1% /etc/hostname
/dev/sda3 72056832 298300 71758532 1% /etc/hosts
$

容器分区的大小是10GB,inode有655360个,大概2KB就分配一个inode。磁盘剩下40%+的空间,而inode耗尽了,肯定是小文件太多了。首先找哪个目录的小文件最多:

1
2
3
4
5
6
#方法比较笨,慢慢找,先到根目录下看看那个目录的文件最多
$ for i in `ls`;do echo $i; ls $i -lR|wc -l;done
... ... ...
var
536432
... ... ...

首先定位到了/var目录下的文件最多,然后按照同样的方法找到了文件最多目录/var/spool/postfix/maildrop,50几个万文件大部分在这个目录下,删掉这些垃圾文件,inode也就释放出来了,其它的进程就可以继续写入文件了。

1
2
3
4
5
6
7
8
9
10
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
rootfs 655360 121905 533455 19% /
/dev/mapper/docker-8:3-61079671-96d6b91ea4aeccad53cb07a7f3a79e0d6e4083db1bc079a26ff806bfc0048901
655360 121905 533455 19% /
tmpfs 6171993 278 6171715 1% /dev
shm 6171993 1 6171992 1% /dev/shm
/dev/sda3 72056832 298302 71758530 1% /etc/resolv.conf
/dev/sda3 72056832 298302 71758530 1% /etc/hostname
/dev/sda3 72056832 298302 71758530 1% /etc/hosts

没有开启postfix服务怎么也会产生这些邮件,原来是定时任务造成的,输出信息没有处理,系统默认就输出到那里了。定时任务脚本无用的信息重定向到/dev/null这个设备就好了:

1
*/1 * * * * root 脚本 > /dev/null 2>&1
----------------本文结束 感谢阅读----------------