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
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
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
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)
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
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命令。