技術・開発

【検証】CentOS 7.4で禁断の全消しコマンド「rm -rf /」を実行してみた結果…

2018年5月4日

Linux界隈では絶対にやってはいけない禁断の呪文として有名なコマンド、「rm -rf /」を実際に唱えてみました。

禁断のコマンド「rm -rf /」とは?

まずは、このコマンドの意味を左から順番に説明します。

  • rm … ファイルやディレクトリの削除コマンド
  • -rf … ディレクトリごと(r)、警告なしに強制的に(f)、消せるものはすべて消す
  • / … トップディレクトリ(ルートディレクトリ)配下をすべて指定(Windowsでいう「Cドライブ直下」みたいなもの)

つまり、要約すると「OS上のHDDファイルを強制的にすべて葬り去るコマンド」です。通称「バルス」コマンド。

一般ユーザの場合は権限の問題で消せるファイルが少ないため影響度は限定的ですが、rootユーザ(管理者権限)で実行してしまうと、システムに必要なあらゆるファイルが跡形もなく吹き飛ばされます。

例えば、カレントディレクトリ配下を削除する「rm -rf ./」を打とうとした際に、うっかりドットが抜けてしまったり、「rm -rf . /」とスペースを入れてしまったりすると、この「全消し」が発動してしまいます。
そのため、Linuxエンジニアはrmコマンドを実行する際、パスに間違いがないか非常に慎重に確認する人が多いです。

(実は私も過去にやらかしたことがあり、開発環境を一つ闇へ葬り去りました。あの時は大変ご迷惑をおかけしました…)

実際にCentOS 7.4で実行してみた

CentOS 6.4以降は「フェイルセーフ」が働くようになっている

今回はCentOS 7.4環境を用意して、実際にこのコマンドを叩いてみました。

CentOS7での rm -rf / 実行時のエラーメッセージ

すると、以下のようなメッセージが表示されます。

rm: `/’ に関して再帰的に操作することは危険です
rm: このフェイルセーフを上書きするには –no-preserve-root を使用してください

なんと、そのままではバルスの詠唱ができないようになっています!

これは「フェイルセーフ」と呼ばれる機能です。システムの不具合や人為的ミスが発生したときに、障害の影響範囲を最小限にとどめ、安全を最優先とするための制御機構ですね。
最近のCentOS(RHEL系)ではこの制御が標準で実装されており、間違ってルートディレクトリから全消しを行わないようにブロックしてくれます。

フェイルセーフを突破して無理やり削除してみる

かといって、このまま引き下がるのも面白くないので、警告文の通りに「--no-preserve-root」オプションをつけて無理やり削除を実行してみました。

--no-preserve-rootをつけて強制削除している様子

実行すると、いろんなものを削除していきます。

rm: 〇〇 を削除できません: デバイスもしくはリソースがビジー状態です」というメッセージが大量に出力された後、しれっと入力モードに戻りました。

一応、コマンドの受け付け自体はしてくれているようですがOSとしての機能はほとんどありません。 まるでラピュタのよう

バルス詠唱後の世界:使えるコマンドは激減

全消去コマンドが走った直後、システム上で使えるコマンド(生き残ったコマンド)を確認してみました。

実行後に使えるコマンドの一覧

最小構成インストール時で利用可能なコマンドは本来1,411個あるのですが、実行後にはわずか93個まで減っていました。

cdpwd は使えます。
しかし、ls はコマンド一覧に残っているものの、内部処理で bash を呼び出しています。その bash 自体が消し飛んでいるため、lsコマンドを実行してもエラーが発生して使えませんでした。

また、既存のセッションが繋がっている状態であればTeraterm上で操作を継続できますが、/bin/bash が存在しないため、新たなログインは一切できなくなっています。

ホスト(ESXi)上からコンソールを開いて exit してみると、そのまま永遠に画面が返ってきませんでした。

ESXiコンソール画面でのフリーズ

強制的に再起動をかけてみると……もちろんOSは起動しません。ブートローダー(GRUBなど)までお亡くなりになっているようです。

OSが起動しなくなった画面

仮にここでブートローダーを再インストールしたとしても、OSの主要ファイルが消滅しているので先は見えていますね。

まとめ:フェイルセーフを過信してはいけない

今はフェイルセーフのおかげで「rm -rf /」一発で簡単に全消去されることはなくなりましたが、依然として恐ろしいコマンドであることに変わりはありません。

さらに恐ろしいのは、今回のフェイルセーフの対象となっているのはあくまで「`/`(ルート)」を直接指定した場合のみだということです。 例えば、「rm -rf /bin」などと指定した場合は、これまで通り警告なしに一瞬で削除されてしまいます。**

rm -rf /bin を実行する様子

↑「rm -rf /bin」を実行すると /bin/bash ごと吹っ飛んでしまうため、二度とログインできなくなります。

Teratermの認証失敗エラー

↑Teratermで新たにログインしようとしても「ユーザ認証失敗」というエラーで弾かれてしまいます。

【教訓】
rm -rf コマンドを実行する場合は、指定しているパスが本当に正しいか、何度もチェックしてからEnterキーを押しましょう!

おまけ1

Windows版のバルス Windows環境だと、コマンドプロンプトで「cmd /c rd /s /q c:\」と打つことで同じような絶望を味わえます。 余っているWindows OS環境があれば、検証してみてください。笑

おまけ2

どうしてもバルスを唱えたいいつか自らの手でバルスを唱えてみたい!という方は、`alias`(エイリアス)機能を使えば誰でも簡単にバルスを唱えることができます。

alias バルス="rm -rf / --no-preserve-root"
エイリアスでバルスを実行するGIF

※ご利用は計画的に!決して本番環境では試さないでください。

-技術・開発
-, , , , , ,