【Linux】inodeとファイルが削除される仕組みを調べてみた

投稿者: | 2019-02-22

はじめに

数日前の記事で/proc/(PID)/fd/以下のdeletedになっているファイルを掴んでいるプロセスをkillしました。
そのときにプロセスがリンクカウント0のinodeを掴んでいるからファイルのデータの実体が消えておらずにディスク容量を圧迫していると書きました。

そういえばinodeについてちゃんと理解できてなかったなーと思ったので調べてみました。

そもそもinodeって?

詳しい説明は下記のわかりやすい記事でされているので割愛しますが、一言でいうとファイルの実体です。
inode番号に対してファイル名がハードリンクすることでファイル名にアクセスするとinode番号の領域に格納されているデータにアクセスできるということ。

Linux: ハードリンクと inode

「inode番号の領域内に格納されているもの = inode + データ」
※正確にはinodeの情報の中にinode番号が含まれていますが、次のハードリンクを理解しやすくするために上記のような表現にしています。

ここのinodeはメタ情報が含まれていて、例えばファイルの権限やファイルのサイズやデータブロックへのポインタなどの情報が入っている。
ファイル名はこのinode番号に対してハードリンクされているため、ファイル名を指定して開くとデータにアクセスできるという仕組みになります。

ここで一つのファイル名から一つのinode番号に対してリンクがはられています。
この状態を「inodeのリンクカウントが1」といいます。

もう少し書いていきたいがキリがなくなるので一旦inodeの説明はここまで。

データはいつ削除されるの?

さて、ではデータはいつ削除されるのかですが

「inodeへのリンクカウントが0になったときにシステムに回収されて削除される」です。

例えばrmコマンドを実行したとしましょう。
このコマンドが何をしているのかというと、「ファイル名に紐づくinode番号へのハードリンクを削除」をしています。
ここでリンク数が0になったため、システムに回収されてデータが削除されることになります。

ちょっと実験してみました。

◆プロセスが掴んでいるときは元ファイルを削除してもリンク数0のinodeとしてデータが残っていることの実験

うん。確かにリンクカウント0としてinodeが残っているね。

ではなんでプロセスがそのファイルを開いていると削除されないの?

/proc//fd/以下にて削除したファイルについても状態が「deleted」という形でそのファイルへのシンボリックリンクがはられている。
この場合はリンク数0の状態としてデータが残っておりシステムに回収されないもよう。
プロセスが終了するとリンク数0のデータのためシステムに回収されて消えるというものになります。

うーん、ちょっとこの部分がなぜこの挙動なのかが明確にわからない・・・
このあたりもう少し調べてみようと思います\(^o^)/

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です