rm -rf / をやってみて残ったもの


はじめに

Bashの邪悪なコマンド9選に「rm -rf /やったことある人。」と書かれているのを見て、大昔に試したのを思い出しました。rm -rf /をやってしまったのでは無くrm -rf /をやってみた のです。当時の記憶を呼び起こしてここに書き留めてみます。

どういうシチュエーション?

話は1995年頃に遡ります。ある日、展示会か何かで短期のレンタルで借りた SPARCstation 5 あたり(古い話なのでさすがにうろ覚え)を返却することになりました。OS は SunOS の 4.1.3 か 4.1.4 あたりでしょう(当時 Solaris 2系も有ったけど、手元では使っていない)。

レンタル品であれば、次に貸し出す場合にOSはインストールし直すはずなので、データが残っている必要性はありません。いい機会なので rm -rf / をやってみようということになりました。

rm -rf /は危険な操作の一つとして古くから知られていました。もちろんファイルシステムの全てのファイルが無くなるのは誰もが理解するところです。と、頭では理解できていますが、実際に実行すると果たしてどうなるのかについては、自分を含め周りの人も知りません。なので是非とも一度確認してみたかったのです。

当時の記録はさすがに残っておらず、以下は雰囲気を出す為に画面イメージを適当に作っているため、実際のSunOSの表示とは少し違うかもしれません。

rm -rf / の実行

まずは root でログインしました。

SunOS 4.1.4
login: root
password:

# pwd
/
# 

今時の多くのUNIX系OSではrootアカウントのホームディレクリエーションは/rootですが、当時のSunOSでは/でした。

それでは、おもむろにrm -rf /を実行します。

# rm -rf /

今時のLinuxのrmコマンドであれば、これを実行しようとすると警告が出て実行させてもらえませんが1、当時のUNIX環境のrmコマンドにそんな芸はなく、なんの警告も無くさくっと処理が進みます。

実際に入力したコマンドは rm -rf / ではなく

# rm -rf *

だったかもしれません2

rm -rf / の実行結果

しばらくディスクのアクセス音が続きます。おそらく10分以上待ったと思います。無事(?)プロンプトが戻ってきました。

さて、どうなった?と思いlsを実行してみます。

# ls
ls: not found
#

自分を含めて周囲からも「お〜、lsが無い!」などと言う声が上がります(笑)。lsコマンドの実体も削除されてしまったので当然の結果ですね。状況を確認するためにはどうすれば?ということで少し考えてecho *でいけることに気づきました。

# echo *
export tmp usr var
# 

これらはファイルでは無くディレクトリで、4個のディレクトリが残っていることが確認できました。cdコマンドなどと組みあわせて配下のファイルやディレクトリを確認しましたが、他は綺麗さっぱり無くなっていました。

なぜこれらのディレクトリが残ったのか

さて、なぜ一部のディレクトリが残り、残ったものは消えてしまったディレクトリとは何が違うのでしょうか。

当時のSunOSでは単純にインストールした場合、1台のディスクが複数のパーティションで構成されて、/usr, /var, /exportはそれぞれマウントポイントとなります。また/tmpにはtmpfsがマウントされています。マウントポイントはディスクがマウントされた状態では削除できません。rm コマンドではマウントしたディスクのアンマウントは行わないため、これらが残ったというお話でした。

その後

haltやshutdown等のサーバーを停止するために必要なコマンドも消えてしまったため、最後はいきなり電源を切って終了した気がします。


  1. 実行するためには--no-preserve-rootオプションを指定する必要があります。 

  2. この方法だと/.profileなどの/直下の「.」で始まるファイルは残ります。