そのため、ファイルシステム上の空きiノードの数が少なくなっているという警告が、ボックスの1つにある監視システムから届きました。
df -i
出力はこれを示しています:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 524288 422613 101675 81% /
ご覧のとおり、ルートパーティションではiノードの81%が使用されています。
これらはすべて1つのディレクトリで使用されていると思います。しかし、それがどこにあるかをどうやって見つけることができますか?
stackoverflowで this の質問が表示されましたが、どの回答も好きではありませんでした。とにかく、これはU&Lに関する質問です(
基本的に、ファイルシステムの各ファイルにはiノードが使用されます。そのため、iノードが不足すると、一般に、多数の小さなファイルが配置されることになります。したがって、問題は、「どのディレクトリに多数のファイルが入っているか」ということになります。
この場合、私たちが気にするファイルシステムはルートファイルシステム/
なので、次のコマンドを使用できます。
find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
これにより、そのディレクトリ内のファイル(およびサブディレクトリ)の数が前に付いた、ファイルシステム上のすべてのディレクトリのリストがダンプされます。したがって、ファイル数が最も多いディレクトリが一番下になります。
私の場合、これは次のようになります:
1202 /usr/share/man/man1
2714 /usr/share/man/man3
2826 /var/lib/dpkg/info
306588 /var/spool/postfix/maildrop
つまり、基本的に/var/spool/postfix/maildrop
はすべてのiノードを消費しています。
注、この回答には、考えられる3つの警告があります。パスに改行があるものは適切に処理されません。私のファイルシステムには改行のあるファイルがないことを知っています。これは人間が使用するためにのみ使用されているため、潜在的な問題は解決する価値がありません(また、\n
を\0
でいつでも置き換えて、上記のsort -z
を使用できます)。また、ファイルが多数のディレクトリに分散している場合も処理されません。これは可能性が低いので、リスクは許容できると考えています。また、同じファイルへのハードリンクを数えます(したがって、1つのiノードのみを使用します)。繰り返しになりますが、誤検知を与える可能性は低いです
私がstackoverflowの回答のどれも気に入らなかった主な理由は、それらがすべてファイルシステムの境界を越えているためです。私の問題はルートファイルシステムにあったので、これはマウントされたすべてのファイルシステムを横断することを意味します。 findコマンドで-xdev
をスローしても、正しく機能しません。
たとえば、最も投票された答えは次のとおりです。
for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
代わりにこれを
for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
/mnt/foo
はマウントですが、ルートファイルシステムのディレクトリでもあるため、find . -mount -type d
に移動し、ls -a $i
に渡されます。これにより、マウントに飛び込みます。
代わりに、私の答えのfind
は、マウント上のすべての単一ファイルのディレクトリをリストします。したがって、基本的には次のようなファイル構造を使用します。
/foo/bar
/foo/baz
/pop/tart
私たちは結局
/foo
/foo
/pop
したがって、重複する行の数を数える必要があります。
これは、質問者の要求により here から再投稿されます。
du --inodes -S | sort -rh | sed -n \
'1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'
そして、あなたが同じファイルシステムに留まりたいなら、あなたはそうします:
du --inodes -xS
次に出力例をいくつか示します。
15K /usr/share/man/man3
4.0K /usr/lib
3.6K /usr/bin
2.4K /usr/share/man/man1
1.9K /usr/share/fonts/75dpi
...
519 /usr/lib/python2.7/site-packages/bzrlib
516 /usr/include/KDE
498 /usr/include/qt/QtCore
487 /usr/lib/modules/3.13.6-2-MANJARO/build/include/config
484 /usr/src/linux-3.12.14-2-MANJARO/include/config
最新のcoreutilsがなく、-inodesオプションを利用できないという人もいます。だから、これがlsです:
ls ~/test -AiR1U |
sed -rn '/^[./]/{h;n;};G;
s|^ *([0-9][0-9]*)[^0-9][^/]*([~./].*):|\1:\2|p' |
sort -t : -uk1.1,1n |
cut -d: -f2 | sort -V |
uniq -c |sort -rn | head -n10
興味があれば、regex
の面倒な部分の核心は、各ls's
再帰検索結果のfilename
を、それが見つかったディレクトリ名に置き換えることです。そこからは、繰り返されるiノード番号を絞り込んでから、繰り返されるディレクトリ名を数え、それに応じてソートするだけです。
-U
オプションは、特にソートしないソートであり、代わりにディレクトリリストを元の順序で表示するため、ソートに特に役立ちます-または、言い換えれば、inode
番号で。
そしてもちろん、-1
は、ファイル名に改行が含まれていたり、リストを解析しようとしたときに発生する可能性のある他の非常に不幸な問題に関係なく、1行に1つの結果が得られるという点で非常に役立ちます。
そしてもちろん、-A
はすべて、-i
はiノード、-R
は再帰的であり、これは長いことと短いことです。
これの根本的な方法は、lsのすべてのファイル名をsedのディレクトリ名で置き換えることです。それに続いて...まあ、私は少しぼやけています。あなたがここに見ることができるように、私はそれがファイルを正確に数えているとかなり確信しています:
% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
> 2 /home/mikeserv/test
> 1 /home/mikeserv/test/linkdir
これにより、du
コマンドとほぼ同じ結果が得られます。
15K /usr/share/man/man3
4.0K /usr/lib
3.6K /usr/bin
2.4K /usr/share/man/man1
1.9K /usr/share/fonts/75dpi
1.9K /usr/share/fonts/100dpi
1.9K /usr/share/doc/Arch-wiki-markdown
1.6K /usr/share/fonts/TTF
1.6K /usr/share/dolphin-emu/sys/GameSettings
1.6K /usr/share/doc/efl/html
14686 /usr/share/man/man3:
4322 /usr/lib:
3653 /usr/bin:
2457 /usr/share/man/man1:
1897 /usr/share/fonts/100dpi:
1897 /usr/share/fonts/75dpi:
1890 /usr/share/doc/Arch-wiki-markdown:
1613 /usr/include:
1575 /usr/share/doc/efl/html:
1556 /usr/share/dolphin-emu/sys/GameSettings:
include
は、プログラムが最初に見るディレクトリに依存していると思います。これらは同じファイルであり、ハードリンクされているためです。上記のようなもの。私はそれについて間違っているかもしれません-そして私は訂正を歓迎します...
% du --version
> du (GNU coreutils) 8.22
テストディレクトリを作成します。
% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1 .
いくつかの子ディレクトリ:
% mkdir ./realdir ./linkdir
% du --inodes -S
> 1 ./realdir
> 1 ./linkdir
> 1 .
いくつかのファイルを作成します。
% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
いくつかのハードリンク:
% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` |
. /dev/stdin
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
ハードリンクを見てください。
% cd ./linkdir
% du --inodes -S
> 101
% cd ../realdir
% du --inodes -S
> 101
それらは単独で数えられますが、1つ上のディレクトリに移動します...
% cd ..
% du --inodes -S
> 101 ./realdir
> 1 ./linkdir
> 1 .
次に、実行したスクリプトを下から実行しました。
> 100 /home/mikeserv/test/realdir
> 100 /home/mikeserv/test/linkdir
> 2 /home/mikeserv/test
そして、Graeme's:
> 101 ./realdir
> 101 ./linkdir
> 3 ./
したがって、これはiノードをカウントする唯一の方法がiノードによる方法であることを示していると思います。また、ファイルをカウントすることはiノードをカウントすることを意味するため、iノードを二重にカウントすることはできません。ファイルを正確にカウントするために、iノードを2回以上カウントすることはできません。
私はSOというタイトルのQ&Aからこの回答を使用しました: すべてのiノードはどこで使用されていますか? 私たちのNASが約2年間実行されたとき前:
$ find . -type d -print0 \
| while IFS= read -rd '' i; do echo $(ls -a "$i" | wc -l) "$i"; done \
| sort -n
$ find . -type d -print0 \
| while IFS= read -rd '' i; do echo $(ls -a "$i" | wc -l) "$i"; done \
| sort -n
...
110 ./MISC/nodejs/node-v0.8.12/out/Release/obj.target/v8_base/deps/v8/src
120 ./MISC/nodejs/node-v0.8.12/doc/api
123 ./apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios
208 ./MISC/nodejs/node-v0.8.12/deps/openssl/openssl/doc/crypto
328 ./MISC/nodejs/node-v0.8.12/deps/v8/src
453 ./MISC/nodejs/node-v0.8.12/test/simple
NASによっては、フル機能のdf
コマンドが提供されない場合があります。そのため、これらの場合は、代わりにtune2fs
を使用することができます。
$ Sudo tune2fs -l /dev/sda1 |grep -i inode
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Inode count: 128016
Free inodes: 127696
Inodes per group: 2032
Inode blocks per group: 254
First inode: 11
Inode size: 128
Journal inode: 8
Journal backup: inode blocks
-xdev
スイッチを使用してfind
を指定し、検索を開始しているデバイスのみに検索を絞り込むことができます。
名前がmulderであるNASからNFS共有を介して/home
ディレクトリを自動マウントするとします。
$ df -h /home/sam
Filesystem Size Used Avail Use% Mounted on
mulder:/export/raid1/home/sam
917G 572G 299G 66% /home/sam
マウントポイントはまだシステムのローカルと見なされることに注意してください。
$ df -h /home/ .
Filesystem Size Used Avail Use% Mounted on
- 0 0 0 - /home
/dev/mapper/VolGroup00-LogVol00
222G 159G 52G 76% /
find
を開始すると:
$ find / -xdev | grep '^/home'
/home
/home
は見つかりましたが、別のデバイス上にあるため、自動マウントされたコンテンツは見つかりませんでした。
find
、-fstype
へのスイッチを使用して、find
が検索するファイルシステムのタイプを制御できます。
-fstype type
File is on a filesystem of type type. The valid filesystem types
vary among different versions of Unix; an incomplete list of
filesystem types that are accepted on some version of Unix or
another is: ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K. You can use
-printf with the %F directive to see the types of your
filesystems.
どんなファイルシステムがありますか?
$ find . -printf "%F\n" | sort -u
ext3
したがって、これを使用して交差を制御できます。
ext3のみ
$ find . -fstype ext3 | head -5
.
./gdcm
./gdcm/gdcm-2.0.16
./gdcm/gdcm-2.0.16/Wrapping
./gdcm/gdcm-2.0.16/Wrapping/CMakeLists.txt
nfsのみ
$ find . -fstype nfs | head -5
$
ext3&ext4
$ find . -fstype ext3 -o -fstype ext4 | head -5
.
./gdcm
./gdcm/gdcm-2.0.16
./gdcm/gdcm-2.0.16/Wrapping
./gdcm/gdcm-2.0.16/Wrapping/CMakeLists.txt
使用されているiノードを見つけるコマンド:
for i in /*; do echo $i; find $i |wc -l | sort ; done
次のコマンドを使用すると、より早く簡単にドリルダウンできます。
$ Sudo du -s --inodes * | sort -rn
170202 var
157325 opt
103134 usr
53383 tmp
<snip>
次に、たとえばvar
にアクセスして、そこにディレクトリを使用する大きなiノードが何であるかを確認できます。
/
のiノードの詳細な使用法を一覧表示するには、次のコマンドを使用します。
echo "Detailed Inode usage for: $(pwd)" ; for d in `find -maxdepth 1 -type d |cut -d\/ -f2 |grep -xv . |sort`; do c=$(find $d |wc -l) ; printf "$c\t\t- $d\n" ; done ; printf "Total: \t\t$(find $(pwd) | wc -l)\n"
最大の賛成票で間違いなく答えることは、LinuxとUNIXのiノードの概念を理解するのに役立ちますが、ディスクからiノードを削除または削除するという実際の問題に対処する場合、実際には役に立ちません。 Ubuntuベースのシステムでこれを行う最も簡単な方法は、不要なLinuxカーネルヘッダーとイメージを削除することです。
Sudo apt-get autoremove
あなたのためにそれをします。私の場合、アラートを受け取ったため、iノードの使用率は78%でした。
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 524288 407957 116331 78% /
none 957443 2 957441 1% /sys/fs/cgroup
udev 956205 388 955817 1% /dev
tmpfs 957443 320 957123 1% /run
none 957443 1 957442 1% /run/lock
none 957443 1 957442 1% /run/shm
none 957443 5 957438 1% /run/user
実行後Sudo apt-get autoremove
コマンドは29%に低下しました
$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda1 524288 150472 373816 29% /
none 957443 2 957441 1% /sys/fs/cgroup
udev 956205 388 955817 1% /dev
tmpfs 957443 320 957123 1% /run
none 957443 1 957442 1% /run/lock
none 957443 1 957442 1% /run/shm
none 957443 5 957438 1% /run/user
これは私の時間を節約した私の観察でした。人々はこれよりも良い解決策を見つけるかもしれません。
これまでのすべての回答は、問題の原因となっている多くのサブディレクトリではなく、単一のディレクトリにある多くのファイルに問題があると想定しています。幸いなことに、解決策は、使用するフラグを少なくすることです。
# du --inodes --one-file-system /var | sort --numeric-sort
...
2265 /var/cache/salt/minion
3818 /var/lib/dpkg/info
3910 /var/lib/dpkg
4000 /var/cache/salt/master/gitfs/refs
4489 /var/lib
5709 /var/cache/salt/master/gitfs/hash
12954 /var/cache/salt/master/gitfs
225058 /var/cache/salt/master/jobs
241678 /var/cache/salt/master
243944 /var/cache/salt
244078 /var/cache
248949 /var
または、より短いオプション:du --inodes -x | sort -n
。残念ながら、du
のすべてのバージョンにinodesオプションがあるわけではありません。