どのようにして 'rm -rf /'システム内のすべてのファイルを削除することができるのですか?
このコマンドをUbuntuで試したことがないので(理由は明白)、Ubuntuがその実行を許可するかどうかはわかりません。でも、何でもかんでも削除することで有名ですからね。興味があるのですが、カーネルや/bin
を削除するとどうなるのでしょうか?rmはどのようにしてランタイムスタックを維持しているのですか?rm
はどのようにしてファイルシステムと通信し、削除を完了させるのですか?ハードウェアとはどのように通信するのですか?
84
3
bin/rm`が削除されることは問題ではありません。実行されるのは一度だけで、その時点では、ファイルシステムやディスクに削除を送り続けるために必要な他のすべてのものと同様に、すべてメモリに読み込まれています。
Sidebar/Update: David Hoelzer's answer (そしてコメントでも言及されています)によると、ハードリンク
/bin/rm
が指していた inode はrm
が終了するまで残っていました (Linux はオープンな状態を保持しているため)。ディスクの状態は関係ありません。バイナリは実行される前にメモリにロードされます。たとえ
rm
のディスクデータを手動で破壊できたとしても、削除の完了には影響しませんし、停止もしません (他にディスクを利用できないようにしなければ、ですが)。inodeやhardlinkが何なのかわからない?これは私が解決した答えです。
とにかく、これが、コンピュータを爆発させることなく、最新のカーネルのパッケージを削除できる理由でもあります。別のバージョンをインストールしさえすれば、起動できるようになります。
繰り返しになりますが、これは
rm
が一度しか呼ばれないからです。以下は/bin/rm
が死んだ後に 失敗する でしょう。なぜなら、ファイル名ごとに一度だけ呼ばれるからです。そうは言っても、
find / -exec rm -rf {}.+これは、どちらも引数に制限があるためで、つまり、いくつかのファイルを削除してから再度呼び出されることになります。つまり、再び呼び出される前にいくつかのファイルしか削除されないということです。旅の途中のある時点で、残りのファイルが削除される前に
/bin/rmが期限切れになる (*および*) 可能性があります。しかし、それは保証されていません。もし
/bin/` が最後に入力されたディレクトリであれば、これらの方法は could 動作します。これまでの回答も良かったのですが、一つだけ詳細を明らかにしたいと思います。
rm
は単なるコマンドではありません。rm
は単なるコマンドではなく、PATH
にあるプログラムなのです。ですから、実行すると次のようになります。
rm -rf /
を呼び出します。rm
のインスタンスは、引数-rf
と/
でメモリにロードされます。rm
が動作を開始します (マウントされた / パーティション内のすべてのものを調べ、再帰的にその参照を削除します [専門的で申し訳ありません ;)])rm
プログラムのインスタンスはアンロードされます。仕組みを理解するために、LAMPをubuntu(Virtualbox)にインストールし、いくつかのスクリプトとPHP opcode cacheをインストールし、この邪悪なコマンドを呼び出してみてください。驚くべきことに(運良くPHPファイルの削除にオペコードキャッシュが気づかなければ)、外部からapacheのウェブサーバ経由でPHPスクリプトにアクセスすることができます。
追記: この邪悪なコマンドは、たとえ root で実行されたとしても、「すべて」を削除することはできません。
/proc
からカーネル特権プロセスを削除することはできませんし、/dev
デバイスからファイルとしてシステムに表示されるものを削除することもできません。実際のところ、root は私たちが考えているほど全能ではなく、一方でカーネルは全能です。PPS: また、考え直してみると、削除しようとした時に他のプロセスによって「ロック」されていたファイルもまだ残っているでしょう。
ハードディスクからすべてを消去すると、カーネルはまだ動作していますが、デバイスやプログラム、コマンドなどが残っていないため、ある意味で行き詰まっています。
OSはもう動きません。
Oliさんの言う通り、コマンドはメモリに読み込まれて実行され、このプロセスを殺さない限り(もちろん、killコマンドが残っていればの話ですが^^;)、何も止められません。