Linux找不到占用磁盘的大文件 - df/du的区别

/ Linux / 没有评论 / 2133浏览

最近经常收到磁盘空间不足的告警,但是去定位可删除文件的时候,发现了一个问题,df显示磁盘满了,但是du计算得到的磁盘总空间却只占到磁盘空间的50%左右。 经过查询后终于找到原因

最终原因

文件如果在被某个进程打开后删除,还会存在文件系统中,只是标记为(deleted)状态。

df统计是文件系统(FileSystem)中的空闲磁盘大小,这个数值可以在文件系统中直接得到,所以命令执行很快 du统计的目录及文件占用的磁盘大小,如果文件删除(被标记为deleted状态)则不统计

问题展示

[tenmao@vm ~]$ df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G   18G   72K 100% /
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.4M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/sda1                497M  171M  327M  35% /boot
tmpfs                    182M     0  182M   0% /run/user/1000

[root@vm /]# du -h --max-depth=1
146M      ./boot
0         ./dev
0         ./proc
9.4M      ./run
0         ./sys
36M       ./etc
44K       ./root
4.0K      ./tmp
344M      ./var
2.6G      ./usr
11G       ./home
0         ./media
0         ./mnt
136M      ./opt
0         ./srv
14G       .

df显示磁盘占用100%(磁盘一共18G),du命令却只查找到14G的空间占用

问题定位

查看打开的文件列表

[tenmao@vm ~]$ lsof | grep deleted
less      12998          (省略)  /home/tenmao/test4 (deleted)

可以看到文件/home/tenmao/test4被进程12998打开后, 又被其他进程或命令删除,在lsof命令中显示为deleted状态

解决问题

停掉或重启进程12998

kill 12998
[tenmao@vm /]$ df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   18G   14G  4.0G  78% /
devtmpfs                 898M     0  898M   0% /dev
tmpfs                    910M     0  910M   0% /dev/shm
tmpfs                    910M  9.4M  901M   2% /run
tmpfs                    910M     0  910M   0% /sys/fs/cgroup
/dev/sda1                497M  171M  327M  35% /boot
tmpfs                    182M     0  182M   0% /run/user/1000

停掉进程后,df命令与du命令的大小基本一致了。

一个猜测

创建文件的时候,如果df显示磁盘满,但是du显示有空间,是否可以创建文件?

结果显示:创建文件的时候,判断磁盘空间使用但是df的结果 (这也很符合预期,因为文件还是交给文件系统来管理的)

参考