如何免费使用Inode?

nev*_*int 249 unix linux inode memory-management

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

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

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

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

sim*_*mon 193

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

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

sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
Run Code Online (Sandbox Code Playgroud)

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

  • 如果你不能创建任何文件,即使*可能会失败*因为`sort`可能无法将所有内容保存在内存中并且会尝试自动回退到编写临时文件.一个显然会失败的过程...... (11认同)
  • `sort`对我来说失败了,但我能够给出`--buffer-size = 10G`. (10认同)
  • 这样做的伎俩.我的问题是在/ lib/php/sessions目录中有大量的会话.也许有人有同样的问题 (6认同)
  • @alxndr`awk`可以保留目录的哈希值和文件数,而不需要统一和排序数十亿行.也就是说,也许这是一个改进:"找到.-maxdepth 1-type d | grep -v'^ \.$'| xargs -n 1 -i {}查找{} -xdev -type f | cut -d"/" - f 2 | uniq -c | sort -n` - 这只排序最后一个列表. (4认同)
  • 有人应该将这个find,cut,uniq排序重写成一个awk命令! (2认同)
  • 谢谢,这完全帮助了我。我有一个小型VM,“空间不足”,但实际上是inode。最初,我四处清理大文件,但无济于事,然后我运行了您的脚本并找到了一个包含6万个小文件的目录。我摆脱了它们,现在我又恢复了业务。谢谢! (2认同)

pax*_*blo 161

即使磁盘不是很满,磁盘也很容易使用大量的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_$$
Run Code Online (Sandbox Code Playgroud)

  • 当然,`/ tmp/count_em _ $$`只有在你有空间的情况下才能工作......如果是这样的话,请参阅@ simon的答案. (12认同)
  • @alxndr,这就是为什么将您的文件系统分开通常是个好主意的原因 - 这样,填充诸如 `/tmp` 之类的内容就不会影响您的其他文件系统。 (2认同)
  • @AshishKarpe,我假设你正在谈论你的*自己的*情况,因为OP没有提到生产服务器。如果您无法立即重新启动,则有两种可能性。首先,希望运行中的进程最终关闭当前文件,以便释放磁盘资源。其次,即使是生产服务器也应该有在某个时刻重新启动的空间 - 只需安排一些计划内的停机时间或等待下一个停机时间窗口出现。 (2认同)
  • 我想你想要`ls -A`而不是`ls -a`.你为什么要数数呢?和..? (2认同)

小智 67

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

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361     11  100% /
Run Code Online (Sandbox Code Playgroud)

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

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

$ sudo rm -rf /usr/src/linux-headers-3.2.0-2*
Run Code Online (Sandbox Code Playgroud)

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

$ sudo apt-get install linux-headers-3.2.0-76-generic-pae
Run Code Online (Sandbox Code Playgroud)

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

$ sudo apt-get autoremove
Run Code Online (Sandbox Code Playgroud)

事情好多了

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361 434719   54% /
Run Code Online (Sandbox Code Playgroud)

  • 在类似情况下,这与我自己的方法最接近.值得注意的是,https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels中记录了更为谨慎的方法. (3认同)

dar*_*rlt 45

我的解决方案

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

df -ih
Run Code Online (Sandbox Code Playgroud)

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

for i in /*; do echo $i; find $i |wc -l; done
Run Code Online (Sandbox Code Playgroud)

尝试查找特定文件夹:

for i in /src/*; do echo $i; find $i |wc -l; done
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get autoremove linux-headers-3.13.0-24
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get autoremove -f
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.

  • 对我来说,这需要几个小时.但是,有一个简单的解决方案:当第二个命令挂起在特定目录上时,终止当前命令并重新启动将/*更改为挂起的任何目录.我能够深入到罪魁祸首<分钟. (4认同)

Any*_*_ph 10

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

rm -rf /var/lib/php/sessions/
Run Code Online (Sandbox Code Playgroud)

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

使用以下权限重新创建它

mkdir /var/lib/php/sessions/ && chmod 1733 /var/lib/php/sessions/
Run Code Online (Sandbox Code Playgroud)

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

  • `rm -rf/var/lib/php/sessions/*`可能是一个更好的命令 - 它不会删除会话目录,只是它的内容...然后你不必担心重新创建它 (3认同)

ash*_*que 6

首先,获取inode存储使用情况:

df -i
Run Code Online (Sandbox Code Playgroud)

下一步是找到这些文件。为此,我们可以使用一个小脚本来列出目录及其上的文件数量。

for i in /*; do echo $i; find $i |wc -l; done
Run Code Online (Sandbox Code Playgroud)

从输出中,您可以看到使用大量文件的目录,然后对该目录重复此脚本,如下所示。重复此操作,直到看到可疑的目录。

for i in /home/*; do echo $i; find $i |wc -l; done
Run Code Online (Sandbox Code Playgroud)

当您发现可疑目录中有大量不需要的文件时。只需删除该目录中不需要的文件并通过以下命令释放一些 inode 空间即可。

rm -rf /home/bad_user/directory_with_lots_of_empty_files
Run Code Online (Sandbox Code Playgroud)

您已经成功解决了问题。现在再次使用 df -i 命令检查 inode 使用情况,您可以看到这样的差异。

df -i
Run Code Online (Sandbox Code Playgroud)