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 が枯渇するとスペースが空いているように見えて新しくファイルなどが作れなくなる
- 作者: W. Richard Stevens,Stephen A. Rago,大木敦雄
- 出版社/メーカー: 翔泳社
- 発売日: 2014/04/22
- メディア: 大型本
- この商品を含むブログ (2件) を見る
スマートPythonプログラミング: Pythonのより良い書き方を学ぶ
- 作者: もみじあめ
- 発売日: 2016/03/12
- メディア: Kindle版
- この商品を含むブログ (1件) を見る