df
为什么和命令的输出有差异du
?
为什么它们的输出不准确?
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 1012M 394M 567M 42% /
/dev/sda2 99M 47M 48M 50% /boot
/dev/sda8 9.9G 1.5G 7.9G 16% /home
none 1004M 0 1004M 0% /dev/shm
/dev/sda9 347G 93G 236G 29% /srv
/dev/sda11 2.0G 81M 1.8G 5% /tmp
/dev/sda10 4.0G 1.3G 2.6G 33% /usr
/dev/sda6 4.0G 2.1G 1.8G 55% /usr/local
/dev/sda5 20G 19G 0 100% /var
但是,如果我这样做,du -sh /var
它会报告只使用了 4.6G:
# du -sh /var
4.6G /var
答案1
造成这种情况的标准原因是某些用户进程保持已删除文件处于打开状态。当发生这种情况时,通过“du”看不到空格,因为该文件在目录树中不再可见。但是,该文件仍会使用该空间,直到它被释放,并且只有在最后一个打开该文件的进程关闭其指向该文件的文件描述符或进程退出时才会发生这种情况。您可以使用lsof程序尝试查找哪个进程保持打开文件。通常是一些日志文件,或者一些大型数据库文件被轮换出来,但一些较旧的进程仍保持日志文件打开。
答案2
试试这个:
http://www.cyberciti.biz/tips/freebsd-why-command-df-and-du-reports-different-output.html
如果在文件正在被 Linux 程序 / 进程打开或使用时删除它们(通过 rm 命令),则会出现“打开文件描述符”问题的危害,并导致 Linux 文件系统无法报告实际的已用磁盘空间或可用的空闲磁盘空间。
为了解决伪“磁盘空间已满”问题,即回收“已使用的磁盘空间”,您需要杀死或终止“已停止的进程” - 在本例中,rm 命令在文件正在使用时变为已停止的进程。
一旦这些已停止运行的进程被终止,“打开文件描述符”问题将得到解决,du 和 df 命令都将同意报告真实文件系统使用的磁盘空间或可用磁盘空间!
如何找出并终止或杀死导致打开文件描述符问题的已停止进程,以解决 du 和 df 命令中使用的磁盘空间差异?
对于这种特殊的场景,lsof 命令(列出打开文件命令)非常适合显示信息:
#lsof | grep "deleted"
并在 lsof 命令输出的第二列中查找 Linux 进程 ID。第七列是被“删除”的文件的大小(但没有成功,结果是进程已失效)。
现在,你只需要终止 Linux 进程 ID 即可看到 DU 和 DF 的正确输出,使用以下命令终止进程 ID
#lsof | grep "deleted" | awk '{print $2}' | xargs kill -9
现在通过两个命令验证磁盘使用情况;您应该不会发现差异。
答案3
这不适用于您的情况,但一般来说,记住该-x
标志很重要du
。否则它可能会进入其他已安装的文件系统,并且肯定不会匹配df
输出,默认情况下是每个文件系统的。
答案4
这当然是在问题提出之后,因此更多是为了后人着想。
可能还有另一个(不太常见但很重要的)原因 - 已安装的目录。
考虑这样一种情况(例如,在使用 FreeBSD jails 时),目录 ( /multimedia
) 被挂载到不同的位置 ( /usr/something/media
)。现在执行du
将包括目录下的 /multimedia 目录的大小/usr/something/media
,因此会显示 的夸大大小/usr
。但df
将显示 的真实大小/usr
- 不包括挂载目录的内容/multimedia
。