为什么 [df] 告诉我磁盘已满,而 root [du] 告诉我我只用 5tb 中的 ~500gb 填充了磁盘?

为什么 [df] 告诉我磁盘已满,而 root [du] 告诉我我只用 5tb 中的 ~500gb 填充了磁盘?

我在 FUSE 文件系统中有一个新的 5tb 磁盘,我猜它基本上是空的,但 df 告诉我不然。磁盘上的文件系统是mergerfs.该设置由 4 个 5TB Seagate 5400rpm 外置硬盘组成,所有这些硬盘均已使用 1 个分区进行ext4格式化fdisk。我尝试以 root 身份进入并使用 du 检查,它告诉我大约使用了 500GB 的空间。

pi@raspberrypi:~ $ df -h /mnt/hdd/disk4
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1       4.6T  4.3T  393M 100% /mnt/hdd/disk4

root@raspberrypi:~# du -sh /mnt/hdd/disk4
464G    /mnt/hdd/disk4

有人可以帮我解决这个问题吗?

答案1

这是我以前遇到过的情况,尽管这是我经验中的极端情况。当有文件已从磁盘中删除时,通常会发生这种情况,因此du不会报告它们,但它们仍然在某处正在运行的进程中打开,因此df请考虑所使用的空间。最常见的“罪犯”是 logrotate 没有正确重新启动日志记录进程,从而导致以下情况:

  • 您在磁盘上看到的日志文件可能会也可能不会写入
  • 日志写入进程正在写入(可能)活动日志文件(例如app.log)和前一天的日志文件(例如2022-01-03-app.log,当今天是 2022-01-04 时),但前一天的文件是在ls(例如2022-01-03-app.log.gz
  • 未压缩时,前一天的日志文件会占用大量空间(数十 GB)

在这个特定的例子中,logrotate守护进程在午夜轮换了前一天的日志文件,并为其赋予了前一天的时间戳,但实际上并没有通过写入它的进程触发日志重新启动。它压缩了前一天的日志文件,然后删除了未压缩的文件,但由于写入进程仍打开文件句柄,df因此认为该空间已被占用。

通常可以通过在 logrotate 配置文件中添加 (SIGHUP) 类型指令来解决该问题HUP,但在极少数情况下,您必须实际重新启动有问题的进程,因为它无法正确响应 HUP。

如果这是您遇到的情况,一旦您找到有问题的进程并重新启动它,报告的已用空间df将突然急剧下降,并且您的df输出du将匹配。

相关内容