BLOGTIMES
2007/09/21

rootでrm -rf /をするとどうなるか(理論編)

 
このエントリーをはてなブックマークに追加

rootユーザーでやってしまうと悲劇としか言いようがないのが「rm -rf /」。
幸いにも僕はまだやってしまったことはないのですが、この挙動を分析しているサイトを見つけました。

root が "rm -rf /" をしたらどうなるのか?

UNIX で root が "/bin/rm -rf /" をした場合の結末として、以下のようになるという主張を実際に見たり聞いたりしたことがあるのですが、全て明らかに誤りです。信じてはいけません。

* /bin/rm が消えた時点で、rm のプロセス自体が異常終了する。(なんでやねん! ...まあ、SVR2, 4.1BSD では /bin/rmdir が消えたら止まると思うけど。)
* dynamic library が消えた後に rm のプロセスや動作中のコマンドが異常終了する。(なんでやねん!)
* それまで動いていたコマンド(デーモン類)が、コマンドファイルが消えた後に終了する。(なんでやねん!)
* カーネルが unlink(2) された時点で、システムがクラッシュする。(なんでやねん!)
* open されたファイルを unlink すると、ファイルの内容を参照できるのは sync(2) されるまでであり、updated(8) と競争することになる。(なんでやねん!)
* rm コマンドのファイル「だけ」が残る。(rm が残る環境はあり得るが、そこでは他にも沢山のものが残らなければ変。)

このページの目的は、具体的な実験例で "rm -rf /" の結末を示すことで、 UNIX カーネルの semantics (振舞い)を確認し、デマを払拭することにあります。

自分もrm -rf /をしてしまうとすぐにシステムがクラッシュするんではないかと思いましたが、そういえばUNIXでは開いているファイルは消えない*1んでしたね。確かこれを応用してファイルをopen()してからそのファイルをすぐにunlink()すると他のプロセスから触れないtmpファイルが作れる(しかも、プロセスが終了すると一緒に消えてなくなる)っていうテクニックがあったはずです。

それと同じように現在使っているプログラムは閉じない限り消えないわけですね。やっぱりカーネルは奥が深いなぁ。

  • *1: inodeの参照が0にならないから。

トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/870
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン