last modified: Feb 16, 2000
UNIX で root が "/bin/rm -rf /" をした場合の結末として、 以下のようになるという主張を実際に見たり聞いたりしたことがあるのですが、 全て明らかに誤りです。 信じてはいけません。
このページの目的は、 具体的な実験例で "rm -rf /" の結末を示すことで、 UNIX カーネルの semantics (振舞い)を確認し、 デマを払拭することにあります。
病的な例外を除けば、基本的には、"rm -rf /" すると、
以下に述べるのは、Slackware 3.1 on Linux 2.0.35 で実行してみた結果です。 実行後、ディスプレイのスナップショットを撮ってみたので参考にしてください。 ext247 というのは "/bin/rm -rf /" される機械のホスト名で、 sras70 というのは外部から種々の監視をしてくれた機械のホスト名です。
左下の xterm の窓で、"/bin/rm -rf /" を実行してみた ら、/proc だけが残りました。
注:/usr, /var などを独立したパーティションにせず、 / 以下を単一のパーティションにしていました。 もし複数のパーティションを mount していたら、 mount point (や、そこに至るパス)も rmdir(2) されずに残っていたはずです。右は top を実行中の窓であり、daemon 類や様々なコマンドが動作している (少なくとも終了していない)ことがわかります。 左上は、監視用の sras70 という機械で動いているシェルの窓ですが、
この後、X server を終了して端末から logout すると、 コンソールにはメッセージも何も出ず、 キーを押しても無反応な状態になりました。 しかし、nfs server や daemon 類は動作し続けており、 監視している sras70 から df してみることは普通にできます。 やってみると、 終了したコマンドや close されたファイルに相当する分のブロックが 解放されて、使用中の領域が減っていました。
ちなみに、Slackware の rm は GNU fileutils 由来です。
より詳細には、以下の情報を参照してください。
以下に述べるのは、FreeBSD 2.2.5-RELEASE で実行してみた結果です。 実行後、ディスプレイのスナップショットを撮ってみたので参考にしてください。 ext247 というのは "/bin/rm -rf /" される機械のホスト名で、 sras70 というのは外部から種々の監視をしてくれた機械のホスト名です。
結果は Linux とほとんど同じです。 左下の xterm の窓で、"rm -rf /" を実行してみた ら、/kernel と /proc だけが残りました。
注:右は top を実行中の窓であり、daemon 類や様々なコマンドが動作している (少なくとも終了していない)ことがわかります。 左上は、監視用の sras70 という機械で動いているシェルの窓ですが、
- /usr, /var などを独立したパーティションにせず、 / 以下を単一のパーティションにしていました。 もし複数のパーティションを mount していたら、 mount point (や、そこに至るパス)も rmdir(2) されずに残っていたはずです。
- kernel が消えないのは、schg flag がセットされているからです。 (see. chflags(1))。 これをクリアしておいたなら unlink されていたでしょう。 (動作中にカーネルのファイルを消すことは可能であり、 やっても何ら問題がない。)
この後、X server を終了して端末から logout すると、 コンソールにはメッセージも何も出ず、 キーを押しても無反応な状態になりました。 それでも、監視している sras70 からは、 カーネルやデーモン類が動作し続けていることが確認できました。 df してみると、 終了したコマンドや close されたファイルに相当する分のブロックが 解放されて、使用中の領域が減っていました。
ちなみに、FreeBSD の rm は 4.4BSD Lite-2 由来です。
より詳細には、以下の情報を参照してください。
--- 電源を切った時点で何らかのプロセスが参照していた inode については 何らか(典型的には UNREF FILE)のエラーが出るはず。 なぜなら、その inode はディスク上にまだ存在していたのに、 対応するディレクトリエントリがなくなってしまっているのであるから。
BSD 由来のOSでは、FFS のディレクトリへの書き込みは 同期的に行われることに注意。ただし、FreeBSD の場合、 このことは mount(8) で async option を指定しない 限りにおいて正しい。こうして、 電源を切った時点において参照されていたファイル群 を割出すこともできる。
追試をなさる方は以下にご注意ください。
このページは、理論的な考察よりも、 実際に実験してみた結果を報告することに集中しています。 今後は、System V 系の機械での実験が望まれます。 System V 系では、 実行中のコマンドのファイルを unlink しようとすると ETXTBSY になるはずで、 多数のファイルやディレクトリが残ることが見込まれます。
誤りの指摘や質問、感想あるいは関連する情報の提供を歓迎します。
katsu@watanabe.name