ルートディレクトリをうっかり削除してしまうという悲劇は、子どもの頃には冗談として聞いていたことでしょう。でも、ただの冗談だと思わないでください! 私自身も、友人のパソコンがこうした惨事に遭うのを数え切れないほど見てきました。そして今日は、GitLab(GitHub に似たサービス)のエンジニアが、rm -rf コマンドの恐ろしい威力を身をもって示してくれました……。本番サーバーのデータベースを消去してしまったのです……。こんな惨事は自分には起こらないと思っていました。しかし、利用者が何万人もいる GitLab のようなサービスでさえ、不注意からこうした事態が起きてしまいました。そこで、防ぐ方法を調べてみました。今回は、rm コマンドをどう管理すべきかを紹介します!

GitLab の対応もユニークでした。データを復旧しながら、その様子をライブ配信して誰でも見られるようにしたのです。良いマーケティングの手法かもしれませんが、私にはエンジニアの性格がそうさせたように見えます(笑)。配信を見たい方は、Youtube - GitLab Live Stream をクリックしてください。

お決まりの注意事項ですが:

  • Enter キーを押す前に、現在のディレクトリを確認する。
  • rm -rf コマンドを安易に使わない。
  • Linux のユーザー権限を正しく設定し、安易に root に切り替えない。
  • データはバックアップする!
ただし、この 4 つを心に留めていても、「江湖を渡れば、刃物にやられることもある」と言うように、どれほど慎重でも、飼い猫が勝手にキーボードを叩かないとは限りません(?)

最も基本的な方法は、rm コマンドの -i オプションです。rm -i でファイルを削除すると、システムが本当に削除してよいか再度確認してくれます。次のように rm のエイリアスを設定できます。

# ~/.bashrc
alias rm="rm -i"

それでも、誤って rm -rf と入力してしまうことはあります。強制削除なので、-i オプションも無効になってしまいます。より良い方法は、safe-rm コマンドを使うことです。このコマンドは別途インストールが必要ですが、Mac と Linux のどちらでも使えます。safe-rm の使い方は rm とまったく同じです。唯一の違いは、あらかじめ特定のパスを設定しておけることです。ユーザーがそのパスを削除しようとすると、safe-rm が直接ブロックします。個人的には、自分のパソコンや会社のサーバーの rm を safe-rm に置き換えて、惨事が偶然起きないようにすることをおすすめします。さらに、社内のネットワーク管理者も、データベースファイルの保存場所など、削除を禁止するフォルダのパスをあらかじめ設定しておけます。

Safe-rm Git: http://repo.or.cz/w/safe-rm.git

# Mac OS
brew install safe-rm

# Ubuntu
sudo apt-get install safe-rm

safe-rm をインストールしたら、rm のエイリアスとして設定することをおすすめします。ユーザー全員が毎回 safe-rm を使ってファイルを削除してくれるとは期待できないので、初期設定にしてしまうのが確実です。

# ~/.bashrc
alias rm="safe-rm"

次に、削除できないディレクトリを設定しましょう。一度設定すると、そのディレクトリは safe-rm では削除できなくなります。-f オプションを付けても同じです。削除したい場合は、設定ファイルからそのパスを削除するしかありません。また、指定したパスそのものだけが保護され、その中のファイルやフォルダは引き続き削除できます。言い換えると、ルートディレクトリを削除不可に設定しても、ルートディレクトリの中のファイルやフォルダは引き続き削除できるということです。

設定ファイルは 2 つあります。存在しない場合は自分で作成してください。

# Global
/etc/safe-rm.conf

# User
~/.safe-rm

設定ファイルには、削除を禁止するパスを 1 行に 1 件ずつ記述します。たとえば次のようになります。

/home/karl
/etc/*
/var/log/**/*

最後に、設定を有効にするためにターミナルを再起動することを忘れないでください!

設定が完了すると、「デフォルトで削除不可」になっているファイルを削除しようとしたときに、次のようなメッセージが表示されます。

ただし、safe-rm は最後の防衛線であることを忘れないでください。より重要なのは、コマンドを入力する前に 3 秒考える習慣をつけ、rm -rf を安易に使わないことです。safe-rm に頼りきりだと、いつか新しいパソコンに替えた日に、結局は同じ惨事が起きてしまいます。