缺少磁盘空间。总计 - 文件 != 可用

缺少磁盘空间。总计 - 文件 != 可用

所以,我一直在寻找这个问题的答案,但什么也没找到。有一天,我的根文件系统上神奇地用完了空间。0 字节可用。我删除了一些旧的虚拟机,以便给我空间,这样系统才能真正运行。我运行了磁盘使用情况分析器、k4DirStat 和 df / du。全部作为 SU,但计算结果不合理。它也不是 Ext4 的 5%。

该驱动器是三星 EVO 840。Ext4。Ubuntu 16.04 LTS。

du以下是和的结果df

XXX@YYY:/$ sudo du -chsx /
103G    /
103G    total

XXX@YYY:/$ sudo df /
Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sdf1      231977984 201086936  19084124  92% /

所以: 231G-103G=19G?

很困惑,谢谢你的帮助。

解决方案: @steeldriver 的想法很正确。我连接了两个外部驱动器用于备份 cron 作业。我卸载了它们。断开了它们的连接。Viola,挂载点中仍然有文件。我猜其中一个在某个时候被卸载了,备份作业填满了根文件系统。我想我需要更改脚本以在同步之前检查外部驱动器是否存在。

感谢您的快速回复 - 这个社区太棒了。

答案1

Linux 不会从文件系统中删除仍由应用程序打开的文件。在您的情况下,这可能是一些大型 VM 映像。

例子:

创建一个大文件检查磁盘使用情况。还可用于sync避免缓存效果:

$ sudo sync; df -h /dev/sda1
  Filesystem      Size  Used Avail Use% Mounted on
  /dev/sda1       886G  278G  564G  33% /
$ dd if=/dev/zero of=large count=1024 bs=10M
$ df -h /dev/sda1
  Filesystem      Size  Used Avail Use% Mounted on
  /dev/sda1       886G  288G  554G  35% /

现在打开文件其他外壳例如tail保持开放

$ tail -f large

回到第一个shell并删除文件并检查文件系统大小:

$ rm large
$ sudo sync; df -h /dev/sda1
  Filesystem      Size  Used Avail Use% Mounted on
  /dev/sda1       886G  288G  554G  35% /
$ lsof /dev/sda1 | grep large
tail      15255 username    3r   REG    8,1 10737418240  5520283 /some/path/large (deleted)

lsof显示文件已被删除,但仍被某些进程使用。现在返回 tail shell 并使用 Ctrl-C 终止它:

$ tail -f large 
^C
$ sudo sync; df -h /dev/sda1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       886G  278G  564G  33% /

恢复正常。因此,您需要找到打开的文件并终止持有文件句柄的进程。

相关内容