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


8

当我运行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命令时,它表明我只使用了2Gout 9.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 .

这也让我疯狂又有趣。这对我们来说是个大问题,因为根磁盘/已满,并且我们站点中的某些功能失败了。

请帮助我解决(也了解)此问题。

谢谢。



就像您说的@Gilles,我跑了du -x /,发现只有2G 可用,并且计算出的inode大小为160M。它帮助我理解了这些内容,但是我只是想解决这个问题。
Rakesh Sankar,

您是否du以root身份运行?否则,它只能报告您可以访问的文件。
吉尔(Gilles)“所以,别再邪恶了”,

@Gilles我正在为root
拉克什·桑卡尔

除了出色的ncdu程序之外,我在这里没有其他需要添加的东西,它可以使磁盘使用情况可视化。
罗布

Answers:


4

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

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

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


谢谢,良好的信息,我今天了解一些(更多)。但是要找到已hidden用空间,我尝试运行fuser命令以查看进程正在使用但未链接的所有文件-我找不到任何文件。您是否有任何命令或指示可以引导我找到它?这是我使用的命令fuser -v -a /
Rakesh Sankar,

我必须重新启动它才能摆脱隐藏空间,但是找不到合适的解决方案来删除那些隐藏文件。
Rakesh Sankar

1

有时,如果磁盘已满,则可能会感到困惑,直到重新启动/重新安装后,该磁盘仍然已满,即使您已删除文件负载。


由于它是生产站点,因此无法重新启动。但是我正在寻找一种解决方案,可以帮助我找到这些隐藏的空间并将其带回。
Rakesh Sankar,

可能是生产过程,但有时重新启动是唯一的答案。不幸的是,它是您的根磁盘,所有操作系统都在上面。这就是为什么许多人主张在其他磁盘上使用tmp,var,home等的原因,因为它们可以重新安装。操作系统似乎没有意识到根磁盘可用空间似乎更为常见。
BugFinder 2011年


0

有一种无需重新启动应用程序即可清理空间的方法。详细信息如下:

  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上尝试过,并且可以工作。


这是一件有用的事情。但这不是问题的答案。
艾萨克·拉比诺维奇

抱歉,如果您知道删除文件的进程ID,则我的目标更多是清理磁盘空间。对于这种特定情况,您必须浏览/ proc / [0-9] * / fd中的所有文件,grep删除的文件,并遵循上述逻辑。
Kaustubh Sathe 2012年

如果您真的很想知道哪个文件引起了磁盘空间泄漏,请一次清除删除的文件,每次检查df输出并记录此信息。
Kaustubh Sathe 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.