我有一个磁盘驱动器,inode使用率为100%(使用df -i
命令)。
但是,在大幅删除文件后,使用率仍为100%。
这样做的正确方法是什么?
如何使用磁盘空间较少的磁盘驱动器 比磁盘空间使用率更高的磁盘驱动器更高的Inode使用率?
如果我压缩大量文件会减少使用的inode数吗?
答案 0 :(得分:181)
如果你非常不走运,你已经使用了大约100%的inode并且无法创建scipt。
您可以使用df -ih
进行检查。
然后这个bash命令可以帮助你:
sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
是的,这需要时间,但您可以找到文件最多的目录。
答案 1 :(得分:149)
即使磁盘不是很满,磁盘也很容易使用大量的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_$$
答案 2 :(得分:63)
我的情况是我没有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% /
答案 3 :(得分:41)
我的解决方案:
尝试查找这是否是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
这解决了我的问题。
答案 4 :(得分:9)
我有同样的问题,通过删除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)
答案 5 :(得分:2)
最新答案: 就我而言,这是我的会话文件
/var/lib/php/sessions
正在使用Inodes。
我什至无法打开crontab或创建新目录,更不用说触发删除操作了。
由于我使用PHP,因此我们有guide,我在其中复制了示例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手动删除了一些会话。
希望这会有所帮助!
答案 6 :(得分:1)
在Raspberry Pi上,/var/cache/fontconfig
目录中有大量文件,我遇到了问题。删除它花了一个多小时。当然,rm -rf *.cache*
引发了Argument list too long
错误。我用不到一个
find . -name '*.cache*' | xargs rm -f
答案 7 :(得分:1)
如果使用docker,请删除所有图像。他们使用了很多空间。...
停止所有容器
docker stop $(docker ps -a -q)
删除所有容器
docker rm $(docker ps -a -q)
删除所有图像
docker rmi $(docker images -q)
为我工作
答案 8 :(得分:1)
如前所述,如果有很多小文件,文件系统可能会耗尽inode。我提供了一些方法来查找包含大多数文件here的目录。
答案 9 :(得分:1)
您可以使用RSYNC删除大量文件
rsync -a --delete blanktest/ test/
创建包含0个文件的blanktest文件夹,命令会将测试文件夹与大量文件同步(我使用此方法删除了近5M文件)。
感谢http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux
答案 10 :(得分:1)
我们最近遇到了类似的问题,如果进程引用已删除的文件,则不会释放Inode,因此您需要检查lsof /,并且kill / restart该进程将释放inode。
如果我错了,请纠正我。
答案 11 :(得分:1)
我们在HostGator帐户(在所有托管上对其所有托管设置了inode限制)之后遇到了垃圾邮件攻击。它在/root/.cpanel/comet中留下了大量的队列记录。如果发生这种情况并且您发现没有可用的inode,则可以通过shell运行此cpanel实用程序:
/usr/local/cpanel/bin/purge_dead_comet_files
答案 12 :(得分:1)
eaccelerator可能导致问题,因为它将PHP编译成块...我在负载很重的站点上遇到了这个问题。如果仍有问题,请通过删除/ var / cache / eaccelerator中的eaccelerator缓存来释放Inode。
rm -rf /var/cache/eaccelerator/*
(或任何缓存目录)
答案 13 :(得分:0)
您可以看到此信息
for i in /var/run/*;do echo -n "$i "; find $i| wc -l;done | column -t
答案 14 :(得分:0)
在上述答案之一中,有人建议会话是用尽inode的原因,而在我们的情况下,正是这种情况。为了增加答案,尽管我建议检查php.ini文件并确保session.gc_probability = 1
和session.gc_divisor = 1000
并
session.gc_maxlifetime = 1440
。在我们的例子中,session.gc_probability等于0并导致了此问题。
答案 15 :(得分:0)
这篇文章挽救了我的生活: https://bewilderedoctothorpe.net/2018/12/21/out-of-inodes/
find . -maxdepth 1 -type d | grep -v '^\.$' | xargs -n 1 -i{} find {} -xdev -type f | cut -d "/" -f 2 | uniq -c | sort -n
答案 16 :(得分:-2)
到目前为止,这个问题的许多答案都是具体的。我认为你使用stat
是安全的,但是依赖于操作系统,你可能会遇到一些inode错误。因此,使用stat
实现您自己的64bit
调用功能以避免任何溢出问题似乎相当兼容。