iノードの使用を解放する方法?


275

iノードの使用率が100%(df -iコマンドを使用)のディスクドライブがあります。ただし、ファイルを大幅に削除した後も、使用率は100%のままです。

それを行う正しい方法は何ですか?

ディスクスペースの使用率が低いディスクドライブが、ディスクスペースの使用率が高いディスクドライブよりもInodeの使用率が高くなる可能性があるのはなぜですか。

多くのファイルを圧縮すると、使用されるiノード数が減る可能性はありますか?


4
この質問に50ポイントを与えたいと思います。どのようにできるのか!:)
Sophy、2016

@Sophyしないでください。自動的に禁止されます
Steven Lu

1
@StevenLu情報ありがとうございます!私は問題を解決するために数日を費やしたので、私は彼を信用したいと思います。しかし、この問題は私を助けることができます。再度ありがとうございます
Sophy

1
@Sophy:なぜSOの話題から外れたものを与えるのか?:)それがいくつの賛成票を得ても、それは間違いなくプログラミングの問題ではありません。
2017

空のディレクトリもiノードを消費します。それらを削除すると、一部のiノードが解放される可能性があります。この数は、いくつかのユースケースで重要になる場合があります。空のディレクトリは、findで削除できます。-type d -empty -delete
Ruchit Patel 2018

回答:


170

ディスクがいっぱいになっていなくても、ディスクで多数のiノードを使用するのは非常に簡単です。

iノードはファイルに割り当てられるので、億単位のファイルがあり、すべて1バイトの場合、ディスクが不足する前にiノードが不足します。

ファイルに複数のハードリンクがある場合、ファイルを削除してもiノード数が減らない可能性もあります。すでに述べたように、iノードはディレクトリエントリではなくファイルに属しています。ファイルに2つのディレクトリエントリがリンクされている場合、1つを削除してもiノードは解放されません。

さらに、ディレクトリエントリを削除することもできますが、実行中のプロセスがまだファイルを開いている場合は、iノードは解放されません。

私の最初のアドバイスは、すべてのファイルを削除してからボックスを再起動して、ファイルを開いたままのプロセスが残っていないことを確認することです。

それでも問題が解決しない場合は、お知らせください。

ちなみに、多くのファイルを含むディレクトリを探している場合、このスクリプトが役立つことがあります。

#!/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

1
@alxndr、それがファイルシステムを分離することをしばしばお勧めする理由です-そのようにして、何かを埋める/tmpことは他のファイルシステムに影響を与えません。
paxdiablo

あなたの答えは、「システムが削除された場合、再起動後にファイルが使用されないままになる」には完全に適しています。しかし、質問されたのは、「iノードポインターが削除された後、iノードを再利用または再利用する方法?」です。基本的にLinuxカーネルは、作成されるたびにファイルに新しいiノードを作成し、ファイルを削除するたびにiノードを自動的に再要求しません。
Mohanraj 2013

1
@ AshishKarpe、OPは運用サーバーについて言及していなかったので、私はあなたがあなた自身の状況について話していると思います。すぐに再起動できない場合は、2つの可能性があります。まず、処理中のプロセスが最終的に現在のファイルを閉じて、ディスクリソースを解放できるようにしてください。第2に、本番サーバーでさえ、ある時点での再起動の余地が必要です。計画的なダウンタイムをスケジュールするか、ダウンタイムの次のウィンドウが表示されるのを待ちます。
paxdiablo

2
ls -A代わりにあなたが欲しいと思いますls -a。なぜあなたは数えたいのですか?そして..?
jarno

205

非常に運が悪い場合は、すべてのiノードの約100%を使用しており、sciptを作成できません。これはで確認できdf -ihます。

次に、このbashコマンドが役立ちます。

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

はい、これには時間がかかりますが、ファイルが最も多いディレクトリを見つけることができます。


8
それはトリックを行います。私の問題は、/ lib / php / sessionsディレクトリに信じられないほど多くのセッションが存在することでした。多分誰かが同じ問題を抱えている
SteMa '22

2
誰かがこのfind、cut、uniqソートを単一のawkコマンドに書き直すべきです!
mogsie 2012年

5
@alxndr awkは、膨大な数の行を一意化したり並べ替えたりせずに、ディレクトリのハッシュとファイルの数を保持できます。そうは言っても、おそらくここに改善があります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 2013年

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を使用していて、パッケージが見つからないためにaptが壊れたため、約400,000のiノードを使用していた古いLinuxカーネルを削除できませんでした。そして、iノードが足りなくなってスタックしてしまったため、新しいパッケージをインストールできませんでした。

いくつかの古いLinuxカーネルを手動で削除して、約10,000のiノードを解放しました

$ 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
これは、同様の状況での私自身のアプローチに最も近いものでした。より注意深い
community /

私の場合はまさに!しかし、「sudo apt-get autoremove -f」を使用して進行しなければなりませんでした
Tony Sepia

これを行うのは安全sudo rm -rf /usr/src/linux-headers-3.2.0-2*ですか:そのカーネルを使用していないと確信している場合?
火星リー

@MarsLee「uname -a」で現在実行中のカーネルを確認できます
Dominique Eav

$ sudo apt-get autoremove一人で電話して、私のためにトリックをしました。
Morten Grum

49

私の解決策:

これが次のiノードの問題かどうかを確認してください。

df -ih

iノード数が多いルートフォルダを見つけてください。

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
私にとって、これは何時間もかかっていました。ただし、簡単な解決策があります。2番目のコマンドが特定のディレクトリでハングした場合、現在のコマンドを強制終了し、/ *をハングしているディレクトリに変更し直します。犯人を1分以内に掘り下げることができました。
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
なぜこれが起こるのか?
Sibidharan 2017

1
私の場合、@ Sibidharanは、古いPHPセッションをクリアするPHP cronジョブが機能していなかったためです。
厳しい

3
rm -rf /var/lib/php/sessions/*おそらくより良いコマンドでしょう-それはセッションディレクトリを削除するのではなく、そのコンテンツを削除します...その後、それを再作成することを心配する必要はありません
Shadow

私はphpセッションを持っていませんでしたが、これと同様にmagentoセッションの問題があります。方向をありがとう。
Mohit

PHPのセッションは、cronジョブ、php.iniの設定session.gc_maxlifetimeを経由してクリアするべきではありませんphp.net/manual/en/...

2

スパム攻撃の後に、HostGatorアカウント(すべてのホスティングにiノード制限を設定)でこれを経験しました。/root/.cpanel/cometに膨大な数のキューレコードを残しました。これが発生し、空きiノードがない場合は、シェルを介してこの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 2018

これでうまくいきますが、空のディレクトリに権限を正しく設定してください。私はこれを行わず、PHPセッションディレクトリの権限を誤って変更しました。私が失敗したことを理解するのに2時間かかりました。
aecend

1

PHPをブロックにコンパイルするため、eacceleratorが問題を引き起こしている可能性があります...負荷の高いサイトのAmazon AWSサーバーでこの問題が発生しました。問題が解決しない場合は、/ var / cache / eacceleratorのeacceleratorキャッシュを削除して、iノードを解放します。

rm -rf /var/cache/eaccelerator/*

(または何でもあなたのキャッシュディレクトリ)


1

最近、同様の問題に直面しました。プロセスが削除されたファイルを参照する場合、iノードは解放されないため、lsof /を確認する必要があります。プロセスを強制終了/再起動すると、iノードが解放されます。

ここで間違っていれば訂正してください。


1

以前に述べたように、小さなファイルがたくさんある場合、ファイルシステムはiノードを使い果たすかもしれません。私はここにほとんどのファイルを含むディレクトリを見つけるいくつかの手段を提供しました


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して独自の呼び出し機能を実装することは、かなり互換性があるようです。


私たちはここで例が大好きです;)
ボーネ

-3

dockerを使用している場合は、すべての画像を削除します。彼らは多くのスペースを使いました...

すべてのコンテナを停止します

docker stop $(docker ps -a -q)

すべてのコンテナを削除

docker rm $(docker ps -a -q)

すべての画像を削除

docker rmi $(docker images -q)

私に働きます


これは、「iノードが多すぎる」ことが問題であるかどうかを検出するのに役立ちません。
Mark Stosberg、

これはDockerとは関係ありません。
ウルダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.