Linux使用du和df命令结果不一致

时间:2021-03-01 05:25:04

     Linux下面通常用du和df命令看磁盘空间的使用情况,基本语法如下:
df - report file system disk space usage
df [OPTION]... [FILE]...
-h, --human-readable
              print sizes in human readable format (e.g., 1K 234M 2G)

du - estimate file space usage
du [OPTION]... [FILE]...
-h, --human-readable
              print sizes in human readable format (e.g., 1K 234M 2G)
-s, --summarize
              display only a total for each argument



df和du命令得到的磁盘空间统计信息不一致的根本原因是打开文件描述符(虽然文件已被删除,还有其他进程可能打开了该文件),下面模拟这种情景:

1.开始之前的磁盘使用情况:
vonzhou@vonzhou:~$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       6.8G  6.3G  196M  98% /
vonzhou@vonzhou:~$ du -sh /home
2.2G     /home

2. 另起一个终端通过vi,打开test.iso(大小700M左右) ;
vonzhou@vonzhou:~$ lsof | grep iso
vi        21350    vonzhou    3r      REG        8,1 741343232  325789 /home/vonzhou/test.iso

3. 从当前终端删除这个700多M的文件test.iso;
vonzhou@vonzhou:~$ rm test.iso 

4. 此时发现df的统计并没有发生改变,但是du没有统计它了,原因是当前目录没有了test.iso这个文件,但是有进程持有对其的打开文件描述符,所以文件系统中还存在。
vonzhou@vonzhou:~$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       6.8G  6.3G  196M  98% /
vonzhou@vonzhou:~$ du -sh /home
1.5G     /home
vonzhou@vonzhou:~$ lsof | grep iso
vi        21350    vonzhou    3r      REG        8,1 741343232  325789 /home/vonzhou/test.iso (deleted)

5. 停止vi进行对文件的占有,再次看磁盘空间的使用情况,这是二者才表现出一致的状态:
vonzhou@vonzhou:~$ lsof | grep iso
vonzhou@vonzhou:~$ df -h /home
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       6.8G  5.6G  903M  87% /
vonzhou@vonzhou:~$ du -sh /home
1.5G     /home

总结:之所以出现这种不一致的情况,是因为df和du通过不同的机制来得到磁盘空间的使用状况,du似乎更精确和实时,每次运行该命令,都会递归遍历该路径下面的所有文件进行空间大小的计算,当然速度上会慢一点。df会依赖超级块的信息,会统计那些在内存但不在磁盘上的文件,会统计索引文件和元数据,所以会看到df显示的使用率比du高。所以通常下,选择使用du命令。