我最近用完了 FreeBSD 服务器上驱动器上的磁盘空间。我截断了导致问题的文件,但我没有看到运行时反映的更改df
。当我du -d0
在分区上运行时,它显示正确的值。有没有办法强制更新这些信息?是什么导致这里的输出不同?
3 回答
在 BSD 中,目录条目只是对底层文件数据(称为 inode)的众多引用之一。当使用 rm(1) 命令删除文件时,只会减少引用计数。如果引用计数仍然是正数,(例如,文件由于符号链接而具有其他目录条目),则不会删除底层文件数据。
较新的 BSD 用户通常没有意识到打开文件的程序也持有引用。这可以防止底层文件数据在进程使用它时消失。如果引用计数降为零,则当进程关闭文件时,文件空间被标记为可用。此方案用于避免 Microsoft Windows 类型问题,即它不会让您删除文件,因为某些未指定的程序仍然打开它。
观察这一点的一种简单方法是执行以下操作
cp /bin/cat /tmp/cat-test
/tmp/cat-test &
rm /tmp/cat-test
在后台进程终止之前,/tmp/cat-test 使用的文件空间将保持分配状态且不可用,正如 df(1) 报告的那样,但 du(1) 命令将无法解决它,因为它不再具有文件名。
请注意,如果系统在没有进程关闭文件的情况下崩溃,那么文件数据仍然存在但未被引用,则需要运行 fsck(8) 来恢复文件系统空间。
保持文件打开的进程是 newsyslog(8) 命令向 syslogd 或其他日志记录程序发送信号以通知它们应该在轮换日志文件后关闭并重新打开它们的原因之一。
软更新也会影响文件系统的可用空间,因为实际的 inode 空间恢复可以推迟;可以使用 sync(8) 命令来鼓励这种情况尽快发生。
这可能集中在您如何截断文件上。正如unix.com 上的这篇文章所解释的那样, du和df报告了不同的内容。仅仅因为空间没有被使用并不一定意味着它是免费的......
df --sync 有效吗?