如何免费使用Inode?

问题描述 投票:228回答:12

我有一个磁盘驱动器,inode使用率为100%(使用df -i命令)。但是,在大幅删除文件后,使用率仍为100%。

这样做的正确方法是什么?

如果磁盘空间使用量较少的磁盘驱动器可能比磁盘空间使用率更高的磁盘驱动器具有更高的Inode使用率,那怎么可能?

如果我压缩很多文件会减少使用的inode数量吗?

linux unix memory-management inode
12个回答
152
投票

即使磁盘不是很满,磁盘也很容易使用大量的inode。

一个inode被分配给一个文件,因此,如果你有大量的文件,每个都是1个字节,那么在你的磁盘用完之前很久就会用完inode。

如果文件有多个硬链接,删除文件也不会减少inode计数。正如我所说,inode属于文件,而不是目录条目。如果文件有两个链接到它的目录条目,删除一个将不会释放inode。

此外,您可以删除目录条目,但是,如果正在运行的进程仍然打开该文件,则不会释放该inode。

我最初的建议是删除你可以使用的所有文件,然后重新启动该框以确保没有任何进程保持打开文件。

如果您这样做但仍有问题,请告诉我们。

顺便说一下,如果你正在寻找包含大量文件的目录,这个脚本可能有所帮助:

#!/bin/bash
# count_em - count files in all subdirectories under current directory.
echo 'echo $(ls -a "$1" | wc -l) $1' >/tmp/count_em_$$
chmod 700 /tmp/count_em_$$
find . -mount -type d -print0 | xargs -0 -n1 /tmp/count_em_$$ | sort -n
rm -f /tmp/count_em_$$

1
投票

如前所述,如果有很多小文件,文件系统可能会耗尽inode。我提供了一些方法来查找包含大多数文件here的目录。


-2
投票

到目前为止,这个问题的许多答案都是具体的。我认为你使用stat会很安全,但操作系统依赖,你可能会得到一些inode错误。因此,使用stat实现自己的64bit调用功能以避免任何溢出问题似乎相当兼容。


-3
投票

如果您使用泊坞窗,请删除所有图像。他们用了很多空间......

停止所有容器

docker stop $(docker ps -a -q)

删除所有容器

docker rm $(docker ps -a -q)

删除所有图像

docker rmi $(docker images -q)

对我有用


184
投票

如果你非常不走运,你已经使用了大约100%的inode并且无法创建scipt。你可以用df -ih来检查。

然后这个bash命令可以帮助你:

sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

是的,这需要时间,但您可以找到包含最多文件的目录。


65
投票

我的情况是我没有inode,我已经删除了我能做的一切。

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361     11  100% /

我使用的是ubuntu 12.04LTS并且无法删除占用大约400,000个inode的旧Linux内核,因为apt因包丢失而被破坏。我无法安装新的软件包因​​为我没有inode所以我被卡住了。

我最终手动删除了一些旧的Linux内核以释放大约10,000个inode

$ sudo rm -rf /usr/src/linux-headers-3.2.0-2*

这足以让我安装丢失的软件包并修复我的apt

$ sudo apt-get install linux-headers-3.2.0-76-generic-pae

然后使用apt删除其余的旧Linux内核

$ sudo apt-get autoremove

事情好多了

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361 434719   54% /

43
投票

我的解决方案

尝试查找这是否是inode问题:

df -ih

尝试查找具有大inode计数的根文件夹:

for i in /*; do echo $i; find $i |wc -l; done

尝试查找特定文件夹:

for i in /src/*; do echo $i; find $i |wc -l; done

如果这是linux标头,请尝试删除最旧的:

sudo apt-get autoremove linux-headers-3.13.0-24

我个人将它们移动到一个已安装的文件夹(因为对我来说,最后一个命令失败)并安装了最新的:

sudo apt-get autoremove -f

这解决了我的问题。


10
投票

我有同样的问题,通过删除PHP的目录会话修复它

rm -rf /var/lib/php/sessions/

如果您使用较旧的PHP版本,它可能在/var/lib/php5下。

使用以下权限重新创建它

mkdir /var/lib/php/sessions/ && chmod 1733 /var/lib/php/sessions/

Debian目录的默认权限显示drwx-wx-wt(1733)


1
投票

eaccelerator可能导致问题,因为它将PHP编译成块...我在负载很重的站点上遇到了这个问题。如果仍有问题,请通过删除/ var / cache / eaccelerator中的eaccelerator缓存来释放Inode。

rm -rf /var/cache/eaccelerator/*

(或者你的缓存目录)


1
投票

我们在发生垃圾邮件攻击后的HostGator帐户(对所有托管设置了inode限制)上体验了这一点。它在/root/.cpanel/comet中留下了大量的队列记录。如果发生这种情况并且您发现没有可用的inode,则可以通过shell运行此cpanel实用程序:

/usr/local/cpanel/bin/purge_dead_comet_files

1
投票

我们最近遇到了类似的问题,如果进程引用了已删除的文件,则不会释放Inode,因此需要检查lsof /,并且kill / restart进程将释放inode。

如果我错了,请纠正我。


1
投票

您可以使用RSYNC删除大量文件

rsync -a --delete blanktest/ test/

在其中创建包含0个文件的blanktest文件夹,命令将使您的测试文件夹与大量文件同步(我使用此方法删除了近5M文件)。

感谢http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux

© www.soinside.com 2019 - 2024. All rights reserved.