CUBE SUGAR CONTAINER

技術系のこと書きます。

inode (アイノード) を枯渇させてみる

inode (アイノード) は Unix 系のファイルシステムに登場する概念の一つ。 これはファイルシステム上に保存しているファイルなどのメタデータを格納するデータ構造になっている。 本のメタファーで説明すると、本文が実際に保存されているデータなら inode は目次や索引に相当する。 そして inode はファイルシステム上において有限な資源なので場合によっては枯渇することがある。 今回は、そんな inode を意図的に枯渇させることで何が起こるかを確認する。

使った環境は次の通り。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.4 LTS
Release:    16.04
Codename:   xenial
$ uname -r
4.4.0-87-generic

下準備

まずは tmpfs を使って適当な場所に適当なサイズでファイルシステムをマウントしておく。 ここでは /tmp/tmpfs ディレクトリに 256MB のサイズでマウントした。

$ mkdir -pv /tmp/tmpfs
mkdir: created directory '/tmp/tmpfs'
$ sudo mount -t tmpfs -o size=256m tmpfs /tmp/tmpfs

df コマンドを使うと /tmp/tmpfs にちゃんとマウントされていることが分かる。

$ df
Filesystem                   1K-blocks     Used Available Use% Mounted on
... (省略) ...
tmpfs                           262144        0    262144   0% /tmp/tmpfs

同様に -i オプションをつけて実行すると inode の状況が確認できる。

$ df -i
Filesystem                    Inodes IUsed   IFree IUse% Mounted on
... (省略) ...
tmpfs                         256019     1  256018    1% /tmp/tmpfs

今はファイルシステム上に何もないので inode は 1 しか消費されていない。 IFree の列にある 256018 という数字が、あとどれだけ inode が作れるかを示している。

枯渇させる

それでは、実際に inode を枯渇させてみよう。

まずはファイルシステムをマウントしているディレクトリに移動する。

$ cd /tmp/tmpfs/

あとは seq コマンドで生成した数字を touch コマンドでファイルとして作っていく。 ファイル一つあたり inode も 1 消費されるので、こうすればディスク上のサイズは消費せずに inode だけ減らせる。

$ seq 256019 | xargs -L1 -P2 -I% touch %

xargs コマンドの -P オプションはプロセス並列度を表す。 なので、試すシステムの論理 CPU コア数にあわせて指定すると早く終るはず。

inode が減っていく過程は、次のように watch kお万度で確認すると良い。

$ watch -n 1 df -i

さて、しばらくしてコマンドが最後まで実行できると次のようなメッセージが出る。

$ seq 256019 | xargs -L1 -P2 -I% touch %
touch: cannot touch '256019': No space left on device

確認すると inode の残りが 0 になっており枯渇している。

$ df -i
Filesystem                    Inodes  IUsed   IFree IUse% Mounted on
... (省略) ...
tmpfs                         256019 256019       0  100% /tmp/tmpfs

ただし、サイズで見ると 0% なのでディスクスペースは全く消費されていない。

$ df
Filesystem                   1K-blocks     Used Available Use% Mounted on
... (省略) ...
tmpfs                           262144        0    262144   0% /tmp/tmpfs

しかしながら、もうこのファイルシステム上にはファイルなどを作ることはできない。 これが inode が枯渇したときに起こる状況となる。 新たにファイルを作りたいのであれば、既存のファイルを削除することで inode を増やす必要がある。

$ touch greeting.txt
touch: cannot touch 'greeting.txt': No space left on device

いじょう。

まとめ

  • inode が枯渇するとスペースが空いているように見えて新しくファイルなどが作れなくなる

詳解UNIXプログラミング 第3版

詳解UNIXプログラミング 第3版