如何释放Inode使用率?


275

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

那么正确的方法是什么?

与磁盘空间使用量较高的磁盘驱动器相比,磁盘空间使用量较小的磁盘驱动器如何可能具有更高的Inode使用率?

如果我压缩大量文件,是否有可能减少使用的inode数量?


4
想给你50分的问题。我能怎么做!:)
Sophy

@Sophy不要那样做。您将被自动禁止
史蒂文·卢

1
@StevenLu谢谢您的信息!我想感谢他,因为我花了几天时间解决我的问题。但是这个问题可以帮助我。再次感谢,
Sophy

1
@Sophy:为什么要为SO奖励一些题外话?:)无论获得多少支持,这绝对不是编程问题。
天衣

空目录也会占用inode。删除它们可以释放一些索引节点。在某些用例中,该数字可能很重要。您可以使用以下命令删除空目录:find。型d-空
删除

Answers:


170

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

索引节点已分配给文件,因此,如果您有成千上万个文件(每个均为1字节),则在磁盘用尽之前,节点将用尽。

如果文件具有多个硬链接,则删除文件也可能不会减少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_$$

12
当然,>/tmp/count_em_$$只有在有空间的情况下,该方法才起作用...如果是这种情况,请参阅@simon的答案。
alxndr 2012年

1
@alxndr,因此将文件系统分开通常是一个好主意-这样,填充类似/tmp内容不会影响您的其他文件系统。
paxdiablo 2012年

您的答案非常适合“如果删除该文件,系统将不会在重新启动后继续使用该文件”。但是有人提出了一个问题:“删除inode指针后如何回收或重用inode?”。基本上,Linux内核每次创建文件时都会在文件中创建一个新的索引节点,并且在删除文件时也不会自动回收该索引节点。
Mohanraj 2013年

1
@AshishKarpe,我认为您正在谈论您自己的情况,因为OP没有提及生产服务器。如果您不能立即重启,则有两种可能性。首先,希望运行中的进程最终关闭当前文件,以便可以释放磁盘资源。其次,即使生产服务器也应有一定程度的重启空间-只需安排一些计划内的停机时间,或等待下一个停机时间窗口出现。
paxdiablo

2
我想你想ls -A代替ls -a。你为什么要数。和..?
jarno

205

如果您很不幸,您已经使用了所有索引节点的大约100%,并且无法创建Scipt。您可以使用进行检查df -ih

然后,此bash命令可能会帮助您:

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

是的,这将花费一些时间,但是您可以找到包含最多文件的目录。


8
可以解决问题。我的问题是/ lib / php / sessions目录中有大量会话。也许有人
遇到

2
有人应该将此查找,剪切,uniq排序重写为单个awk命令!
mogsie 2012年

5
@alxndr awk可以保留目录的哈希值和文件计数,而无需uniqing并排列成千上万的行。就是说,也许这是一个改进:find . -maxdepth 1 -type d | grep -v '^\.$' | xargs -n 1 -i{} find {} -xdev -type f | cut -d "/" -f 2 | uniq -c | sort -n—仅对最后一个列表进行排序。
mogsie 2013年

12
如果您无法创建任何文件,那么即使失败sort也可能会失败,因为可能无法将所有内容保留在内存中,并会尝试自动回退以写入临时文件。一个显然会失败的过程……
Mikko Rantalainen

10
sort对于我来说失败了,但是我能够给出成功的--buffer-size=10G方法。
Frederick Nord

69

我的情况是我没有i节点,并且已经删除了所有可能的内容。

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

我在ubuntu 12.04LTS上,无法删除占用约40万个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% /

3
在类似情况下,这是最接近我自己的方法。值得注意的是,更谨慎的方法已在help.ubuntu.com/community/Lubuntu/Documentation
得到了

我的情况恰好!但是必须使用“ sudo apt-get autoremove -f”才能进行
Tony Sepia

这样安全吗:sudo rm -rf /usr/src/linux-headers-3.2.0-2*,如果我确定我没有使用该内核?
Mars Lee

@MarsLee您可以使用“ uname -a”检查当前正在运行的内核
Dominique Eav,

$ sudo apt-get autoremove独自打来的电话,对我有用。
莫滕·格鲁姆

49

我的解决方案:

尝试查找这是否是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

这解决了我的问题。


1
就我而言,问题是SpamAssasin-Tempfind /var/spool/MailScanner/incoming/SpamAssassin-Temp -mtime +1 -print | xargs rm -f做的工作:)谢谢!
游戏杆

4
对我来说,这要花几个小时。但是,有一个简单的解决方案:当第二个命令挂在特定目录上时,请终止当前命令,然后重新将/ *更改为挂在其上的任何目录。我能够深入分析罪魁祸首。
Michael Terry

我使用了此命令的此变体以便在同一行上打印数字: for i in /usr/src/*; do echo -en "$i\t"; find $i 2>/dev/null |wc -l; done
cscracker

for i in /src/*; do echo "$i, `find $i |wc -l`"; done|sort -nrk 2|head -10炫耀前10大目录
马克·西蒙

12

我有同样的问题,通过删除php的目录会话来解决

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

可能在 /var/lib/php5如果您使用的是较早的php版本。

使用以下权限重新创建

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

默认情况下,显示了对Debian上目录的许可drwx-wx-wt(1733)


1
知道为什么会这样吗?
西比达兰市'17

1
@Sibidharan在我的情况下是因为清除旧的PHP会话的PHP cron工作无法正常工作。
严峻

3
rm -rf /var/lib/php/sessions/*可能会是一个更好的命令-它不会删除会话目录,只会删除其目录...然后,您不必担心重新创建它
Shadow

我没有php会话,但有magento会话问题,与此类似。感谢您的指导。
Mohit19年

PHP会话不应该通过cron作业,在php.ini中设定的session.gc_maxlifetime清除php.net/manual/en/...

2

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

/usr/local/cpanel/bin/purge_dead_comet_files

2

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

rsync -a --delete blanktest/ test/

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

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


从我从文章/评论中可以看出rm *,由于扩展了通配符并传递/处理了每个参数,因此这比处理大量文件要快,但是rm test/对于删除test/包含大量文件的文件夹来说则是很好的选择。
mwfearnley '18

请注意,此方法效果很好,但请确保在空白目录上正确设置权限!我没有这样做,并且无意中更改了我的PHP会话目录的权限。花了两个小时才弄清楚我搞砸了什么。
登场

1

eaccelerator可能会导致此问题,因为它会将PHP编译为块...我在负载较重的站点上使用Amazon AWS服务器遇到了此问题。如果仍然存在问题,请通过删除/ var / cache / eaccelerator中的eaccelerator缓存来释放Inode。

rm -rf /var/cache/eaccelerator/*

(或任何您的缓存目录)


1

最近,我们遇到了类似的问题,如果某个进程引用了一个已删除的文件,则不会释放该Inode,因此您需要检查lsof /,然后终止进程并重新启动该进程将释放这些inode。

如果这里不对,请纠正我。


1

如前所述,如果有很多小文件,文件系统可能会用尽inode。我提供了一些手段来发现,包含大部分文件的目录位置


0

后来的答案:就我而言,这是我的会话文件

/var/lib/php/sessions

在使用Inodes。
我什至无法打开crontab或创建新目录,更不用说触发删除操作了。由于我使用PHP,因此我们有了本指南,在这里我从示例1复制了代码并设置了cronjob来执行那部分代码。

<?php
// Note: This script should be executed by the same user of web server 
process.

// Need active session to initialize session data storage access.
session_start();

// Executes GC immediately
session_gc();

// Clean up session ID created by session_gc()
session_destroy();
?>

如果您想知道如何设法打开crontab,那么好了,我通过CLI手动删除了一些会话。

希望这可以帮助!


0

您可以看到此信息

for i in /var/run/*;do echo -n "$i "; find $i| wc -l;done | column -t

-2

到目前为止,对这个问题有很多答案,上述所有问题似乎都是具体的。我认为您可以通过使用来确保自己的安全stat,但是取决于OS,您可能会遇到一些inode错误。因此,stat使用自己的呼叫功能64bit来避免任何溢出问题似乎相当兼容。


我们喜欢这样的例子;)
Bohne,

-3

如果使用docker,请删除所有图像。他们使用了很多空间。

停止所有容器

docker stop $(docker ps -a -q)

删除所有容器

docker rm $(docker ps -a -q)

删除所有图片

docker rmi $(docker images -q)

对我有用


这无助于检测“ inode过多”是否是问题所在。
Mark Stosberg,

这与Docker无关。
Urda
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.