昨天晚上,我运行了一些程序,产生了比我预期更多的输出数据,结果填充了根 ext4 分区。我杀死了有问题的进程并开始删除我不再需要的无关数据,然后看到了这个:
$ df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.4G 0 3.4G 0% /dev
tmpfs 690M 11M 680M 2% /run
/dev/sda4 810G 806G 0 100% /
tmpfs 3.4G 0 3.4G 0% /dev/shm
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 3.4G 0 3.4G 0% /sys/fs/cgroup
/dev/sda1 476M 26M 450M 6% /boot/efi
tmpfs 690M 0 690M 0% /run/user/1000
正如您所看到的,即使“已使用”比“大小”小 4 GB,也没有可用空间。假设这些是某个进程打开的已删除文件,我使用 lsof 发现最大的文件是 64MB /memfd:pulseaudio。
困惑的是,我重新启动了系统,几乎确定它会解决问题。然而,df 的输出没有改变。
这怎么可能?我该如何解决它?
$ uname -a
Linux ... 4.16.0-1-amd64 #1 SMP Debian 4.16.5-1 (2018-04-29) x86_64 GNU/Linux
$ cat /etc/issue
Debian GNU/Linux buster/sid \n \l
答案1
ext4
有一个“保留块”的概念,只能由以 root 身份运行的进程填充。的输出可能会df
考虑到这一点。
例如,在一个系统上,df
显示:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 30626752 14557916 14490036 51% /
这里,30626752 - 14557916 - 14490036 等于 1578800,大约是总数的 5%,即保留块的默认数量。将保留块百分比更改为零调2fs( tune2fs -m 0 /dev/sda1
) 更改了 所示的数字df
:
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 30626752 14557924 16052444 48% /
(数字仍然不完全匹配,有 16384 个 1k 块未计算在内,但我认为这是由于某些内部文件系统结构由于某种原因未计为“已使用”。)