web-dev-qa-db-ja.com

iノードが使用されている場所を見つける

そのため、ファイルシステム上の空きiノードの数が少なくなっているという警告が、ボックスの1つにある監視システムから届きました。

df -i出力はこれを示しています:

Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/xvda1       524288 422613   101675   81% /

ご覧のとおり、ルートパーティションではiノードの81%が使用されています。
これらはすべて1つのディレクトリで使用されていると思います。しかし、それがどこにあるかをどうやって見つけることができますか?

201
Patrick

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

したがって、重複する行の数を数える必要があります。

223
Patrick

これは、質問者の要求により 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

LSで今:

最新の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コマンドとほぼ同じ結果が得られます。

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

LS:

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 DEMO

% 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回以上カウントすることはできません。

27
mikeserv

私は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

デバイスのiノードの確認

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
6
slm

使用されているiノードを見つけるコマンド:

for i in /*; do echo $i; find $i |wc -l | sort ; done
5
Ashish Karpe

次のコマンドを使用すると、より早く簡単にドリルダウンできます。

$ Sudo du -s --inodes * | sort -rn

170202  var
157325  opt
103134  usr
53383   tmp
<snip>

次に、たとえばvarにアクセスして、そこにディレクトリを使用する大きなiノードが何であるかを確認できます。

4
JonoB

/の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" 
3
user108434

最大の賛成票で間違いなく答えることは、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

これは私の時間を節約した私の観察でした。人々はこれよりも良い解決策を見つけるかもしれません。

2
Shailesh Sutar

これまでのすべての回答は、問題の原因となっている多くのサブディレクトリではなく、単一のディレクトリにある多くのファイルに問題があると想定しています。幸いなことに、解決策は、使用するフラグを少なくすることです。

# 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オプションがあるわけではありません。

0
OrangeDog