2. ファイルを誤って削除しないためには

ファイルの復旧という点に関して、Linux は MS-DOS とは勝手が違うということを まず肝に銘じてください。MS-DOS (およびその悪魔の子である Windows 95) の場合、一般にファイルの復旧はかなり簡単です。復旧処理を自動で行う ユーティリティが、オペレーティングシステム (まあ、著者はこの用語を 広義の意味で使うわけですが) に付属しているからです。しかし、Linux の場合、 そうはいきません。

従って、ルール No.1 (そう言いたければ「聖なる誓い」) は

鉄則: バックアップを取るべし

すなわち、何であれ、バックアップを取るようにすること。 すべてのデータが対象です。著者同様、 読者のコンピュータにはメールその他の交信記録やプログラム、各種文書など、 長年に渡る情報が大量に蓄積されているはずです。もしも突発的なディスク 障害が起こったり、あるいは(縁起でもないですが)悪意を持ったクラッカーに ディスクの内容を消去されてしまったりした場合、日常生活がどれほど混乱するか を考えてみてください。決してあり得ないことではありません。現に、著者は まさにそうした状況に陥った多くの人たちとメールのやり取りをしてきました。 賢明な Linux ユーザは、今すぐ適当なバックアップデバイスを買ってきて、 適切なバックアップスケジュールを立てた上で、それを厳守するようおすすめ します。著者自身は、サブマシン上の余ったディスクを使って、イーサネット 経由でホームディレクトリを定期的にミラーするようにしています。バックアップ スケジュールの立て方に関する詳細は、Frish (1995) をご覧下さい ( Section 15 参照)。

では、バックアップをしていない場合は、どうすべきでしょうか? (あるいはバックアップがあったとしても。 重要なデータについては、幾重もの安全対策をとることは悪い考えではありません)

重要なファイルのパーミッションは 440 (あるいはそれより厳しい値) にしましょう。 書き込みをできなくすれば、 rm コマンドで削除する前に、削除をするか否かの確認メッセージが 表示されるようになります。(ただ、著者の場合、それでも rm -r コマンドでディレクトリ内を再帰的に削除する際には、 最初の確認表示の段階でプログラムを停止させて、rm -rf コマンドを打ってしまったりします。)

特別なファイルに関しては、隠しディレクトリにハードリンクを作成するのも よい方法です。これは、あるシステム管理者から聞いた話ですが、彼は /etc/passwd ファイルを何度か誤って削除したことが あったそうです (これはシステムにほぼ破壊的なダメージを与えます)。 それに対する対処方法のひとつは、以下のようなものだったそうです (これは root で実行します)。

  # mkdir /.backup
  # ln /etc/passwd /.backup

こうしておくと、ファイルの内容を完全に消去するのがかなり面倒になります。 もし次のようなコマンドを実行したとしても、

  # rm /etc/passwd

その際には、

  # ln /.backup/passwd /etc

とすれば、ファイルを復旧できます。もちろん、ファイルを上書きしてしまうと この方法は役に立たないので、いずれにしてもバックアップは必要です。

ext2 ファイルシステム上では、ext2 の属性を利用してファイルやディレクトリを 保護することができます。この属性の操作には chattr コマンドを使います。属性にはまず、「追加のみ可能(append-only)」属性という のがあります。この属性が付いたファイルは、内容の追加は可能ですが、削除 が出来なくなり、既存の内容を上書きすることもできなくなります。ディレクトリ にこの属性が付いている場合は、そのディレクトリ内のファイルやサブディレクトリ は、通常通り変更は可能ですが、ファイルの削除が出来なくなります。 「追加のみ可能」属性は、次のように設定します。

  $ chattr +a ファイル名

また、「変更不可(immutable)」属性というのもあり、これは root 権限でのみ 設定や解除ができるようになっています。この属性が付いたファイルや ディレクトリは、変更、削除、名前の変更、(ハード)リンクの作成が不可能に なります。設定は、次のようにします。

  # chattr +i ファイル名

ext2fs には、さらに「削除不可(undeletable)」という属性もあります (chattr+u を付けて設定します)。意味するところ は、この属性を付けたファイルが削除された場合、実際に再利用されるかどうかに 関わらず、一旦安全な場所に移動され、一定期間経過後に削除されるというもの です。ただ残念なことに、この機能はメインストリームのカーネルにはまだ 実装されていません。過去に実装されかけたことはあったのですが、(著者の知る 限り) 現在のカーネルではまだ利用可能とはなっていません。

rmrm -i へのエイリアスとするか、同機能の関数に置き換えるべきだ、 と主張する人もいます (rm -i は、ファイル 削除の際に必ず確認を求めます)。実際に Red Hat は、root を含む全ユーザに 対してこの機能をデフォルトで設定しています。しかし、著者の個人的な意見では、 ソフトウェアは命令通り忠実に動くべきだと思っているので、こうした見解には 賛同できません。これには問題もあります。遅かれ早かれ、ユーザはシングル・ ユーザモードで起動したり、別のシェルを使ったり、異なるマシンを利用したり するはずですが、そうした場合にはこの rm 機能は 無効になります。削除確認の表示が出ることに慣れきっていると、自分が 置かれた状況を考えずに、一度に多数のファイルを削除指定してしまわない とも限りません。同様に、rm コマンドを各種 スクリプトやプログラムで置き換えるのも、著者の考えでは、危険なこと だと思います。

もう少しましな方法としては、rm とは別のコマンド名で、 「ゴミ箱」形式の削除ができるようなパッケージを使ってみることです。 詳しくは、Peek, et al (1993) (Section 15 参照) を 見てください。ただ、これにも問題はあります。 このパッケージの作者は、削除についてユーザが無頓着になるよう奨励している ように思われるからです。Unix システム上では、むしろ、自己責任に基づく 慎重な運用というアプローチが基本になるはずです。