Linux磁盘占用问题, df与du显示结果不一致?

/ 0评 / 0

今天遇到了一个比较诡异的问题.

有一台主机磁盘爆了. 执行df -h命令, 显示:

/dev/xvda1      7.8G  7.4G  0  100% /

怀疑是某个组件的日志没有设置滚动, 导致把磁盘打爆, 遂cd进该组件的日志目录, 空空如也. 询问同事后得知他已经rm掉那个超大的日志文件了.

那么问题来了, 为什么日志文件删除了之后, 磁盘空间占用率仍然是100%?

遂执行sudo du -sh /* | sort -n命令, 查看具体磁盘占用情况. 结果很奇怪, 占用磁盘最大的文件夹/usr也不过占用了1.1G

1.1G    /usr
4.0K    /lib64
4.0K    /media
4.0K    /mnt
4.0K    /opt
4.0K    /srv
5.5M    /etc
9.4M    /sbin
9.6M    /bin
12K /dev
16K /lost+found
25M /boot
28K /root
40K /tmp
60M /lib
217M    /home
352K    /run
384M    /var

那这占用的空间究竟在什么地方...

在进入多个目录du查询均无果之后, 转向google求助, 判断问题可能是因为日志文件被删除, 但是相关的进程还在跑, 所以导致磁盘空间没有被释放.

执行lsof |grep delete, 得到结果显示果然是这个组件的日志文件, 但是因为进程还在跑, 所以磁盘空间继续被占用. kill掉这个进程, 可以看到磁盘空间又回来了~

/dev/xvda1      7.8G  1.8G  5.6G  25% /

引用:

linux里的文件被删除后, 空间没有被释放, 是因为在Linux系统中, 通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink). 然而如果文件是被打开的(有一个进程正在使用), 那么进程将仍然可以读取该文件, 磁盘空间也一直被占用.

状态为deleted为标记被删除, 其实该文件并没有从磁盘中删除, 类似windows下的回收站状态.

据称当有其他进程打开某文件时文件被删除, 就会将该文件标记为deleted, 并删除其目录节点. 使用du查看时, 因为没有该删除状态文件的节点信息, 所以就不做统计, 从而导致与df的结果不一致.

若要将deleted状态文件删除, 则根据pid直接kill调相应进程即可.

解决办法出处

引申阅读: 使用lsof处理文件恢复、句柄以及空间释放问题

发表评论

电子邮件地址不会被公开。 必填项已用*标注