Linux中出现“No space left on device”错误的排查与解决方法
前言
最近这两天登陆服务器,发现用wget下载文件的时候提示“Nospaceleftondevice”,而且连使用tab键进行补全时也会提示该错误。
之前遇到过一次这种问题,是由于磁盘空间被占满了,导致无法创建新文件。正常情况下,删除一些文件来释放空间,即可解决该问题。
当我使用df命令查看分区情况时,结果如下:
#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/vda129G29G0100%/ udev10M010M0%/dev tmpfs101M232K100M1%/run tmpfs5.0M05.0M0%/run/lock tmpfs405M0405M0%/run/shm
看到这里,我以为磁盘真的被100%占用了,于是就查看了各目录的占用情况:
#du-sh/* 8.8M/bin 30M/boot 0/dev 5.3M/etc 24K/home 0/initrd.img 205M/lib 4.0K/lib64 16K/lost+found 8.0K/media 4.0K/mnt 4.0K/opt 0/proc 2.5G/root 232K/run 5.2M/sbin 8.0K/srv 0/sys 4.0K/tmp 2.6G/usr 1.8G/var 0/vmlinuz
很明显,总共的磁盘占用完全不到10G,磁盘理论上并未被占满。
这种情况下,很可能是小文件过多,导致inode急剧增加,消耗完inode区域的空间。
如果真是如此,那么即使磁盘空间有剩余,但由于无法创建新的inode来存储文件的元信息,也就无法创建新文件。
因此,我用df命令进行验证:
#df-ih FilesystemInodesIUsedIFreeIUse%Mountedon /dev/vda11.9M299K1.6M17%/ udev123K299123K1%/dev tmpfs126K249125K1%/run tmpfs126K4126K1%/run/lock tmpfs126K2126K1%/run/shm
可以看到,inode区域只被占用了一小部分,还有大量的空间未使用,所以也不是inode区域被占满的问题。
到了这里,我的内心是非常郁闷的。这个问题直接导致了Apache、MySql以及其它的一些服务均无法启动,服务器已经基本没法使用了,然而原因却扑朔迷离。
最后,服务器提供商告诉我另一种可能的情况,就是有些文件删除时还被其它进程占用,此时文件并未真正删除,只是标记为deleted,只有进程结束后才会将文件真正从磁盘中清除。
于是我通过lsop命令查看了被进程占用中的文件:
#lsof|grepdeleted mysqld19522982mysql5uREG254,10127/tmp/ibzMEe4z(deleted) mysqld19522982mysql6uREG254,10146/tmp/ibq6ZFge(deleted) mysqld19522982mysql10uREG254,10150/tmp/ibyNHH8y(deleted) apache22869root9uREG254,10168/tmp/.ZendSem.2w14iv(deleted) apache22869root10wREG0,16011077/run/lock/apache2/rewrite-map.2869(deleted) ... python3102root1wREG254,122412342132264070/var/log/nohup.out(deleted)
终于找到了罪魁祸首,原来是在后台运行的Python脚本,源源不断地将输出保存到/var/log/nohup.out文件中,文件大小居然达到了20G+!
前阶段在后台运行脚本之后,就没再管过它。估计是我在Python运行过程中删掉了nothup.out文件,由于该文件被占用,所以只能先标记为deleted,而未真正删除,最后导致磁盘爆满。
这次的教训提醒了我,不能将任务简单放到后台就放任不管,特别是使用nohup命令时,所有的输出都会被不断地添加到同一个文件中,如果该进程不会自己终止,就可能导致输出文件占满整个磁盘。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。