为什么 `df` 和 `du` 在 Ubuntu 18.04 上报告的可用空间不同?

为什么 `df` 和 `du` 在 Ubuntu 18.04 上报告的可用空间不同?

为什么这两个命令报告的可用空间如此不同?这种情况去年开始在几台 Ubuntu 18.04 VM 上不时发生。

df报告使用了 100%,但实际上du -smh只显示了使用了 4.0G(总计)中的 2.3G。

当系统日志服务器因维护而停机时,通常会出现错误消息rsyslogsyslog-ng填充错误消息。/var

# df -mh /var
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/new_vg-var  4.0G  3.9G     0 100% /var

# du -smh /var
2.3G    /var

# fuser /var

答案1

df 大于 du 的最常见原因:

  • 您没有du在整个文件系统上运行。
    • 您没有所有目录的访问权限。
    • 你执行了类似 的操作du -s /filesystem/*,但缺少顶部的点文件。重新运行du -sx /filesystem
    • (罕见)您已使用另一个挂载对部分文件系统进行影子挂载。通过挂载在顶部,du无法访问文件以确定大小。可以通过卸载影子文件系统或通常使用原始文件系统的循环挂载来调整大小。
  • 您有一些文件仍处于打开状态,但已被删除。 du无法再访问它们进行读取,但它们仍占用空间。尝试lsof +aL1 /filesystem找到孤立文件和保持它们打开的进程。当进程关闭文件时,空间将被释放。

df 小于 du 的最常见原因:

  • 里面挂载了一个额外的文件系统,你du正在进入它并计算那个空间。重新运行du -sx /filesystem

答案2

df查询文件系统使用的块总数,请参阅 man 3 statvfs。快速准确地统计卷,但没有关于哪些文件的详细信息。

du循环遍历文件并累加它们的大小。速度较慢,但​​可以打印每个文件的大小。

差异可能意味着已删除的文件仍被某些程序打开。最常见的此类大文件是日志或数据库,但可能是任何其他文件。


当系统日志服务器因维护而停机时,通常会出现错误消息rsyslogsyslog-ng填充错误消息。/var

根本原因可能是您的远程日志配置。

短期内,适当轮换日志文件,例如通过运行logrotatead-hoc。请注意,/etc/logrotate.d/*syslog 中的典型配置会向 rsyslog 发送 HUP 信号以重新打开新日志文件。

考虑增加 /var 的大小来处理日志文件的实际大小。

修改日志配置,以便在远程关闭或磁盘空间不足时执行适当的操作。rsyslog 可以配置为队列它使用有限的空间并在队列满时丢弃消息。rsyslog 配置示例来自 SLES 知识库,需要根据您的日志设置进行定制:

# cat /etc/rsyslog.d/ora_audit.conf
if ( $syslogfacility-text == 'local1' ) and ( $syslogseverity == 4 /* warning */ )  then {
        $WorkDirectory /var/spool/rsyslog       # where to place spool files
        $ActionQueueFileName RemoteQueue        # unique name prefix for spool files
        $ActionQueueMaxDiskSpace 1G             # 1gb space limit (use as much as possible)
        $ActionQueueSaveOnShutdown on           # save messages to disk on shutdown
        $ActionQueueType LinkedList             # run asynchronously
        $ActionResumeRetryCount -1              # infinite retries if host is down
        $ActionQueueTimeoutEnqueue 0            # causes that the message will be discarded immediately if the queue is full
        *.* @@aaa.bbb.ccc.ddd:514               # IP of remote syslog server:port 514
        stop
}

# Above setup discards any messages, if queue size limit is reached (in this setup 1 GB) immediately !

相关内容