为什么“df”和“du”命令显示不同的磁盘使用情况?

我无法访问我的电脑上的Ubuntu系统,错误消息为:“系统以低图形模式运行”,我尝试了一些从互联网上搜索到的命令。

我发现一个问题,似乎没有可用的磁盘空间。我使用了“df”和“du”命令进行检查,结果如下:

du -j --max-depth=1
23G  ./home
3.3G ./usr 
...... 
28G

并且

df -Th 
filesystem   Type   size    used   available   use%    mounted on 
/dev/sda5    ext4   68G     68G    0           100%    /

如何清理系统以释放更多的磁盘空间?

1标题中的问题和问题正文末尾的问题有很大的区别。有些答案与一个问题相关,而有些答案与另一个问题相关。您应该明确您的实际需求,并可能接受一个答案。 - Melebius
9个回答

你可能知道,你可以删除仍然被某个应用程序使用的文件,并且对于该应用程序来说,该文件仍然可用。这是因为在/proc/文件系统中保持打开的文件描述符。
所以,如果已经删除的文件仍然有打开的描述符,那么它们占用的空间会被df认为是已使用的(df是正确的),但是由于它们不再与文件名关联,所以du不能将其考虑在内。
你可以使用以下命令找到所有未链接但仍保持打开的文件:
# lsof | grep '(deleted)'

11这真是救了我。我完全不知道为什么我的磁盘满了,但是du命令显示它是空的。原来是一个8GB文件的打开文件句柄。 - Cheyne
6我要如何删除这些链接? - Vikas Hardia
2有时候你需要以root身份执行这个命令,才能看到被其他用户进程占用的已删除文件。 - Envek
1对我来说,这个问题的根本原因是我在/etc/logrotate.d文件中有一个错误的日志文件规范。这个错误的条目缺少了一个postrotate例程,导致我的守护进程无法释放已经轮转/删除的文件。 - Dale C. Anderson
1如何删除那些未链接但仍打开的文件? - zx1986

如何删除这些链接?-Vikas Hardia Aug 22 '14 at 5:46
您必须找到持有文件句柄的进程。使用Dmitry Alexandrov的命令,您可以看到进程和pid。在我们的情况下,“旧”的varnish日志文件是空间占用者。
# lsof | grep '(deleted)'
[...]
varnishlo 13978       varnishlog    3w      REG              252,1 318448027646    5926973 /var/log/varnish/varnish.log.1 (deleted)
apache2   16801         www-data    2w      REG              252,1        64550   13110120 /var/log/apache2/error.log.1 (deleted)
[...]
# service varnishlog stop
[or if there is no service script]
# kill -11 13978 (the second number of the lsof command is the pid)
[or may be] 
# kill -9 13978

别忘了如果是计算机上的恶魔或其他服务,重新启动服务或进程。 如果可以的话,只需要重启电脑 😉

好的,让我们来查看一下 man 页面:
df - 报告文件系统磁盘空间使用情况

du - 估计文件空间使用情况
这两个工具的目的是不同的。虽然 df 是用来显示文件系统使用情况的,而 du 是用来报告文件空间使用情况的。du 是基于文件的,而 df 是在文件系统级别上工作,报告内核所提供的可用空间。继续阅读 du 的 man 页面支持这一观点:
对每个文件进行递归地总结磁盘使用情况。
它说 du 是用于处理文件的。
df 显示每个文件名参数所包含的文件系统上可用的磁盘空间。
如果没有指定文件名,则显示所有当前已挂载的文件系统上可用的空间。
在这里,说明 df 不关心文件本身,而是关注文件系统本身。

du的用法可以通过添加-x选项来修改,以便仅计算给定文件系统上的文件数量。 - macetw

df

总结可用的磁盘空间

它显示了可用的磁盘空间的数量。

du

总结磁盘使用情况。
它显示了磁盘空间的使用量。

是的,但在“df -Th”的结果中,显示使用了68G。今天早上当我尝试访问Ubuntu系统时,仍然出现“系统正在以低图形模式运行”的消息,但当我检查内存使用情况时,“df”和“du”命令显示了一个合理的结果。但是,“低图形模式”有什么问题呢? - user2068965
请查看此处 - Mitch

简单来说:
你在没有root权限的情况下运行了`du`命令。因此它无法检查`/proc`、`/mnt`等文件夹中的可用空间。
`df`命令显示了总使用和可用空间。
所以当你检查Linux根文件系统时,以`du`报告为准。

我执行了
sudo du -hxa / | egrep '^[[:digit:]]{1,1}G[[:space:]]*'

这正好解释了我看到的21GB差异!
相关文件是/swap文件,大小为21GB!!


没有太多令人困惑的内容:以下是解释:
1)du == 磁盘使用
这些文件占用了多少磁盘空间?
2)df == 磁盘剩余
我们还有多少可用的磁盘空间?
此外,系统以低图形模式运行 'here'。

在我的情况下,lsof没有起到帮助的作用。我能够追踪到这个问题,是因为我使用losetup作为环回设备挂载了磁盘镜像。即使在卸载这些设备并删除相应的镜像之后,仍然有一些进程对这些磁盘镜像保持了某种间接引用。
简而言之,先运行sudo ps -ef | grep loop,然后运行sudo losetup -d /dev/loopX。这不是关于du和df不一致的直接答案,但对我来说,它经常出现,最终我找到了原因,与我能找到的任何答案都不同。

在这里分享一下我的情况,希望能对其他人有所帮助。在我的情况下,du 报告使用了6G,而 df 报告使用了23G -- 相差了17G!
但是我的问题是,我在主要磁盘上有一个文件夹,路径为 /mnt/data,里面有17G的文件,然后又挂载了一个SSD到 /mnt/data -- 结果就是SSD挂载实际上隐藏了主要磁盘上的数据。
所以请检查一下是否可能有其他磁盘挂载在被询问的磁盘上的非空目录上。(参考:https://askubuntu.com/a/29657