ただの技術メモ

個人備忘録

rmコマンドとunlinkコマンドについて

rmコマンドのヘルプを出すと、Remove (unlink) the FILE(s).と書いてあることから分かるように、rmはファイルをunlinkするコマンド。

つまりオプションを指定しないと、rmunlinkは同じ。

user-name:~$rm --help
Usage: rm [OPTION]... [FILE]...
Remove (unlink) the FILE(s).

rmコマンドは-rfオプションなど色々できてしまうので、リンクを削除するときは安全にunlinkコマンドを使おう。

そもそもrmunlinkはどういう挙動なのか気になったのでまとめておく。

挙動

オプションを指定しない場合、rmunlinkは同じ挙動なので、適宜rm=unlinkと読み替えてもらえれば良さそう。

rmコマンドは該当するファイルのinodeの参照カウントをデクリメント(1つ上のディレクトリが持つ該当ファイルのレコードを削除)する。

inodeは参照カウントを持っているらしい。(知らなかった)

つまり、直接的にrmコマンドによってinodeが解放されるわけではない。 (ハードリンクを張って同じinodeを参照しているファイル2つがあるとき、片方を削除してももう1方には影響がないことから考えても、inodeが解放されることはないことが分かる)

参照カウントが0になったinodeは解放される。

しかし、ファイルの実体の削除は対応するinodeを参照するプロセスがなくなるまで遅延される。

挙動の確認

test.txtを作成する。

user-name:~$ touch test.txt

もう1つターミナルを開いてvimtest.txtを開いておく。 使用しているinodeの数を調べる。

user-name:~$ df -i | grep /dev/vda2
/dev/vda2      1966080 290521 1675559   15% /

1966080個のinodeのうち290521個が使われている。

test.txtを削除する。

user-name:~$ rm test.txt

再度使用しているinodeの数を調べる。

user-name:~$ df -i | grep /dev/vda2
/dev/vda2      1966080 290520 1675560   15% /

使用しているinodeの数は減っているし、lsコマンドでもファイルは確認できないが、vimは開いたままでプロセスが生きており、ファイル内容が参照できている。

この状態は、inodeは解放されているがファイルの実体の削除は遅延されている状態。 vimを閉じるとファイルを参照しているプロセスがなくなるのでファイルの実体も削除される。

参考

linuxjm.osdn.jp

stackoverflow.com

qiita.com