1.问题背景
有台刚到手没多久的服务器根目录报空间不足,登录服务器后发现空间确实不足,但用各种方式都找不到占用空间的文件。
2.问题排查
根目录下包含了所有目录,但有些目录是单独挂载,不会占用根目录的系统盘空间。
主要先确认未挂载盘的目录占用空间情况。执行命令查看
#shell> du -ah -x --max-depth=1 /
显示占了17G左右,du命令显示只占了4.3G空间,额外的12G多空间不知道被什么占用了.
接下来检查是否有删除的文件空间未释放,通过lsof命令查看,查看结果需要过滤掉有单独挂载盘的目录。命令如下:
#shell> lsof|grep deleted|grep -v -E 'xxx|yyy'
结果发现也无删除文件未释放空间,接下来检查是否inode已经用满导致,执行命令:
#shell> df -i
inode剩余充足,也不是inode导致。问题排查到这,没其他招了。
突然想起这台服务器给我的时候data1盘重新挂载过,会不会是这个原因导致的。为了验证这个想法,先把占用data1的进程都杀掉,然后把data1目录磁盘umount掉。
#shell> lsof|grep '/data1/'|awk '{print "kill -9 "$2}'|bash && umount /data1
此时再检查磁盘使用状况:
发现占用12G多空间的文件找到了,清理后重新mount磁盘到/data1目录,发现空间占用是预期的4.3G,空间问题得到解决。
总结:如果mount的目录下存在文件,那么目录被mount之后,之前的文件会被隐藏,不属于该挂载文件系统,du及其他命令也无法查到。生产环境中,mount目录之前一定要确认目录为空,否则可能导致一系列头疼的问题。