rmコマンドとunlinkコマンドについて
rm
コマンドのヘルプを出すと、Remove (unlink) the FILE(s).
と書いてあることから分かるように、rm
はファイルをunlink
するコマンド。
つまりオプションを指定しないと、rm
とunlink
は同じ。
user-name:~$rm --help Usage: rm [OPTION]... [FILE]... Remove (unlink) the FILE(s).
rm
コマンドは-rf
オプションなど色々できてしまうので、リンクを削除するときは安全にunlink
コマンドを使おう。
そもそもrm
やunlink
はどういう挙動なのか気になったのでまとめておく。
挙動
オプションを指定しない場合、rm
とunlink
は同じ挙動なので、適宜rm
=unlink
と読み替えてもらえれば良さそう。
rm
コマンドは該当するファイルのinodeの参照カウントをデクリメント(1つ上のディレクトリが持つ該当ファイルのレコードを削除)する。
inodeは参照カウントを持っているらしい。(知らなかった)
つまり、直接的にrm
コマンドによってinodeが解放されるわけではない。
(ハードリンクを張って同じinodeを参照しているファイル2つがあるとき、片方を削除してももう1方には影響がないことから考えても、inodeが解放されることはないことが分かる)
参照カウントが0になったinodeは解放される。
しかし、ファイルの実体の削除は対応するinodeを参照するプロセスがなくなるまで遅延される。
挙動の確認
test.txt
を作成する。
user-name:~$ touch test.txt
もう1つターミナルを開いてvimでtest.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を閉じるとファイルを参照しているプロセスがなくなるのでファイルの実体も削除される。