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

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.开始之前的磁盘使用情况:

[email protected]:~$ df -h /home

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda1       6.8G  6.3G  196M  98% /

[email protected]:~$ du -sh /home

2.2G     /home

2. 另起一个终端通过vi,打开test.iso(大小700M左右) ;

[email protected]:~$ lsof | grep iso

vi        21350    vonzhou    3r      REG        8,1 741343232  325789 /home/vonzhou/test.iso

3. 从当前终端删除这个700多M的文件test.iso;

[email protected]:~$ rm test.iso

4. 此时发现df的统计并没有发生改变,但是du没有统计它了,原因是当前目录没有了test.iso这个文件,但是有进程持有对其的打开文件描述符,所以文件系统中还存在。

[email protected]:~$ df -h /home

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda1       6.8G  6.3G  196M  98% /

[email protected]:~$ du -sh /home

1.5G     /home

[email protected]:~$ lsof | grep iso

vi        21350    vonzhou    3r      REG        8,1 741343232  325789 /home/vonzhou/test.iso
(deleted)

5. 停止vi进行对文件的占有,再次看磁盘空间的使用情况,这是二者才表现出一致的状态:

[email protected]:~$ lsof | grep iso

[email protected]:~$ df -h /home

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda1       6.8G  5.6G 
903M  87% /

[email protected]:~$ du -sh /home

1.5G     /home

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

时间: 2025-01-02 04:02:13

Linux使用du和df命令结果不一致的相关文章

[转]linux的du和df命令

转自:http://blog.csdn.net/kmesg/article/details/6570800 今天也有同学问我Linux下查看目录大小的命令,现在也将前阵子学习到du/df两个命令总结一下吧.前阵子测试工作中有遇到过由于磁盘空间满导致程序无法执行到情况,所以使用了df和du两个命令. du查看目录大小,df查看磁盘使用情况.我常使用的命令(必要时,sudo使用root权限),1.查看某个目录的大小:du -hs /home/master/documents  查看目录下所有目录的大

linux的du和df命令

今天也有同学问我Linux下查看目录大小的命令,现在也将前阵子学习到du/df两个命令总结一下吧.前阵子测试工作中有遇到过由于磁盘空间满导致程序无法执行到情况,所以使用了df和du两个命令. du查看目录大小,df查看磁盘使用情况.我常使用的命令(必要时,sudo使用root权限),1.查看某个目录的大小:du -hs /home/master/documents  查看目录下所有目录的大小并按大小降序排列:sudo du -sm /etc/* | sort -nr | less2.查看磁盘使用

Linux中du和df

Linux运维过程中,经常发现du和df返回值不一样,偶尔会发现差别很大. 特定情况下,可能df看到磁盘已满,但是du判断磁盘剩余空间很大. 文件系统分配其中的一些磁盘块用来记录它自身的一些数据,如i节点,磁盘分布图,间接块,超级块等.这些数据对大多数用户级的程序来说是不可见的,通常称为Meta Data. df:命令通过查看文件系统磁盘块分配图得出总块数与剩余块数.反应系统磁盘实际用量. du:用户态程序.不考虑MetaData,只统计文件系统的部分情况. 所以 df >= du 如果df和d

du 和 df命令的区别(超赞)

du和df命令都被用于获得文件系统大小的信息:df用于报告文件系统的总块数及剩余块数,du -s /<filesystem>用于报告文件系统使用的块数.但是,我们可以发现从df命令算出的文件系统使用块数的值与通过du命令得出的值是不一致的. 如下例: # du -s /tmp 返回如下值: ---12920 /tmp 而 df /tmp返回如下值: Filesystem --512-blocks-- Free --%Used --Iused-- %Iused --Mounted on /dev

Linux,du、df统计磁盘情况不一致

转载:http://blog.linezing.com/?p=2136 在运维Linux服务器时,会碰到需要查看硬盘空间的情况,这时候,通常会使用df -lh命令来检查每个挂载了文件系统的硬盘的总量和已使用量,或者,可以使用du -sh [directory]命令来统计某个目录下所有文件的空间占用. 在使用df.du命令时,常常会遇到统计的硬盘使用情况不一致的问题.比如du统计根目录下文件总共大小为2G,而df判断挂载在根目录的硬盘已用空间达到了3G,20G甚至更多.发生这种情况,有以下三种原因

linux du 与 df 命令

du 命令:显示每个文件和目录的磁盘使用空间 命令格式:du [选项][文件] -k或--kilobytes  以KB(1024bytes)为单位输出. -m或--megabytes  以MB为单位输出. -s或--summarize  仅显示总计,只列出最后加总的值. -h或--human-readable  以K,M,G为单位,提高信息的可读性 [[email protected] test]# du 608 ./test6 308 ./test4 4 ./scf/lib 4 ./scf/s

linux中du与df的区别和联系

1,两者区别 du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在 的,没有被删除的.他计算的大小就是当前他认为存在的所有文件大小的累加和. df,disk free,通过文件系统来快速获取空间大小的信息,当我们删除一个文件的时候,这个文件不 是马上就在文件系统当中消失了,而是暂时消失了,当所有程序都不用时,才会根据OS的规则释放掉已 经删除的文件, df记录的是通过文件系统获取到的文件的大小,他比du强的地方就是能够看到已经删除 的文件,而且

linux 之 du 统计文件大小命令使用

du 统计文件大小命令使用 [[email protected] app]# du --max-depth=1 -h /app/ 1.3G /app/backup 13G /app/workplus 1.1G /app/bak2 4.0K /app/nginx 1.2G /app/bak 16G /app/ #统计/APP目录下各个文件的大小 原文地址:http://blog.51cto.com/12965094/2116844

du,df命令和磁盘管理

[[email protected] ~]# df Filesystem     1K-blocks    Used Available Use% Mounted on /dev/vda1       41151808 1872588  37165788   5% / devtmpfs          498064       0    498064   0% /dev tmpfs             508196       0    508196   0% /dev/shm tmpfs