Linux 文件系统;使用 df 和 du 计算大小的差异

Linux 文件系统;使用 df 和 du 计算大小的差异

当我运行时,df它显示根设备已满。

Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.9G  9.4G     0 100% /

我查看了inode使用情况,发现根设备有足够的可用空间

Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1               640K    103K    538K   16% /

但是,当我运行du命令时,它显示我只使用2G9.9G

ip-XXX-XXX-XXX-XXX:/$ du -xh --max-depth=1
14M ./etc
4.0K ./mnt
96K ./tmp
3.5M ./bin
0   ./sys
964K ./boot
4.0K ./srv
0   ./dev
55M ./lib
25M ./root
1.1G ./usr
4.0K ./opt
846M ./var
4.3M ./sbin
23M ./home
16K ./lost+found
0   ./proc
2.0G .

这真是让我抓狂,也很有趣。这对我们来说是个大问题,因为根磁盘/已满,我们网站的一些功能正在失败。

请帮我解决(也理解)这个问题。

谢谢。

答案1

在 *nix 中删除文件后,只要进程打开它们,它们就会继续存在于磁盘上(并占用磁盘空间)。利用这一点来“保护”临时文件是很常见的,方法是创建较小的临时文件,删除它们,然后使用已删除的文件来存储数据,而不必担心其他进程(轻易)访问它,因此,如果以这种方式处理临时数据库或多媒体编辑会话,则已删除文件的空间量可能会变得非常大。另一种可能导致如此多“丢失”空间的原因是,如果系统已升级(多次)而没有重新启动或重启程序,导致所有旧的 .so 库都被升级前启动且仍在运行的程序保持打开状态。

df看到这些文件使用的空间,因为它只是查看设备上分配了多少空间,但却du看不到它们,因为没有任何相应的目录条目。

此类“隐藏”使用空间只有在已删除文件的进程打开并关闭这些文件时才能释放。您可以使用该fuser命令找到这些进程并终止它们(或者,对于许多守护进程,发送信号告诉它们关闭并重新打开任何打开的文件)。

答案2

有时候,如果磁盘已满,则直到重新启动/重新挂载时才会发现磁盘仍然已满,即使您删除了大量文件。

答案3

就我而言,我只是重新启动了 syslogd 来恢复磁盘空间。我丢失了 3GB!我的服务器已经运行了 250 天。

答案4

有一种方法可以在不重新启动应用程序的情况下清理空间。详情如下:

  1. 假设您正在foo运行一个进程并创建一个名为 abc.log 的 2 GB 文件。现在假设这个 abc.log 被其他人删除了。

  2. 获取foo的 pid(假设为 123)。因此/proc/123/fd将显示 所打开的文件描述符列表foo。带有 abc.log 的文件描述符将显示为已删除。假设fdabs.log 的 是 111。如果您运行less /proc/123/fd/111,它仍将显示所有 2 GB 的数据。

  3. 运行echo " " > /proc/123/fd/111。这将用空字符串覆盖内容。执行此命令后,如果您尝试,df它将显示通过清理 abc.log 恢复的额外 2 GB。

就是这样。我在 CentOS 上试过了,成功了。

相关内容