![df 命令显示 100% 已满,即使删除文件后它也显示相同的使用情况 (100%)](https://linux22.com/image/117601/df%20%E5%91%BD%E4%BB%A4%E6%98%BE%E7%A4%BA%20100%25%20%E5%B7%B2%E6%BB%A1%EF%BC%8C%E5%8D%B3%E4%BD%BF%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6%E5%90%8E%E5%AE%83%E4%B9%9F%E6%98%BE%E7%A4%BA%E7%9B%B8%E5%90%8C%E7%9A%84%E4%BD%BF%E7%94%A8%E6%83%85%E5%86%B5%20(100%25).png)
使用 df 命令,Nand Flash 存储分区显示为 100% 已满。手动计算使用率时,约为 7-80%(最大)。删除了几个文件(比如大约 50~60MB),df 命令输出仍然没有改变。我无法创建新文件,错误:“存储设备上没有剩余空间”。尝试了sync
命令,没有区别。
Filesystem 1K-blocks Used Available Use% Mounted on
tmpfs 262144 20780 241364 8% /tmp
tmpfs 512 0 512 0% /dev
/dev/ubi0_0 1275540 1275540 0 100% /storage
当实际存储空间未满时(根据手动计算),为什么 doe df 命令显示它为 100% 已满?
答案1
我相信重新启动并重新安装可以解决问题。
原因:这背后的原因是df
利用统计文件系统(2)系统调用以获取文件系统统计信息。这意味着它检查打开的内核文件描述符以计算其命名的可用空间(df = 磁盘可用空间)。如果你使用的话,你会得到不同的结果du
。df
显示 100% 使用,因为被删除的文件尚未从内核文件描述符中释放。
也许下面的场景会帮助你理解:
正在运行的进程名为正在使用驻留在分区的
xyz.service
名为 的文件。something.dump
/storage
的列于的中
file discriptor
。something.dump
process file descriptor table
xyz.service
然后你删除了
something.dump
但xyz.service
仍在运行。不
xyz.service
知道文件的更新状态something.dump
。所以文件描述符something.dump
仍然存在。然后您运行
df
命令,内核检查所有进程表以查看使用的文件描述符来计算可用空间。内核发现
inodes
该something.dump
文件的 仍然列在xyz.service
进程的文件描述符表中。所以它something.dump
仍然在文件系统上,因此它不认为 some.dump 的 inode 是空闲的。这就是您看到更多使用的原因。因此,当您
SIGKILL
xyz.service
释放这些索引节点时,您可能可以看到可用空间。重新启动系统将执行与步骤 7 相同的操作。
答案2
btrfs
其他原因:如果您使用类似和 使用快照的文件系统,则您在快照中拥有这些文件的副本。