7. 別の場所にデータを書き出す場合の準備

別の場所にデータを書き出す方法を取る場合は、まずレスキューパーティションが あるかどうかを確認する必要があります。つまり、復旧したいファイルのコピー を書き出す場所を確保するわけです。おそらく、読者のシステムには複数の パーティションがあり、ルートや /usr/home は別々のパーティションに分かれていると思います。 このうちのひとつを使っても、全く問題ないはずです。どれかひとつの パーティション上に、新規のディレクトリを作成しましょう。

ルートパーティションしかなくて、すべてをそこに保存している場合は、 若干面倒です。それでも MS-DOS や Windows のパーティションが使えたり、 もしくはカーネルモジュールとして ramdisk ドライバを使えるようには なっているのではないでしょうか? ramdisk を使うには (これは、1.3.48 以降のカーネルであることが前提です) 次のようにします。

  # dd if=/dev/zero of=/dev/ram0 bs=1k count=2048
  # mke2fs -v -m 0 /dev/ram0 2048
  # mount -t ext2 /dev/ram0 /mnt

これによって 2 MB の ramdisk 領域が作成され、/mnt 上にマウントされます。

少々注意: 読者が kerneld (もしくは、 2.2.x や 2.1.x 以降のカーネルを使っているならその後継である kmod) を使ってカーネルモジュールをロードしている場合、ramdisk 領域 から不揮発性ストレージへのコピーが終了するまで ramdisk のマウントを解除 してはいけません。ramdisk 領域のマウントを解除すると、kerneld はモジュールを (一定時間経過後に) アンロードできるものと思って しまい、さらに実際にアンロードされてしまうと、ramdisk のメモリ領域は カーネルの他の部分に再利用されてしまって、苦労してデータの復旧に費やした 時間が全く無駄になってしまうからです。

Zip や Jaz, LS-120 といったリムーバブル装置を持っているなら、レスキュー パーティションの置き場所として是非利用してください。持っていない場合は、 フロッピーでいきましょう。

他に必要になるのは、パーティションデバイス上から必要なデータを読み出せる プログラムです。いざとなれば dd でも出来るのですが、でも例えば、パーティションの 600 MB 目から 800MB 目までの 領域を読み出そうとするような場合、dd は最初の 600 MB の領域を無視できず、 どうしても頭から読み込もうとしてしまうのです。高速なディスクを使っている 場合でも、これにはかなりの時間が掛かります。この振る舞いをなんとかしようと して、著者は、パーティションの途中にある領域を適切に読み出しできる プログラムを作成しました。fsgrab という名前の プログラムです。このプログラムのソースパッケージは、著者のウェブサイトMetalab (とそのミラーサイト) にあります。読者がこの方法を使ってくれる ものと仮定して、ここから先は、読者が fsgrab を 持っているものとして説明します。

ただ、復旧しようとしているファイルの大きさがどれも 12 ディスクブロックを 超えない場合 (1 ディスクブロックは通常 1 Kb です)、fsgrab は不要です。

fsgrab が必要だがダウンロードとビルドがイヤな場合は、 fsgrab のコマンドラインを dd のコマンドラインに置き換えて考えてください。例えば、fsgrab のコマンドラインが以下のような場合、

  fsgrab -c count -s skip device

これに相当する dd のコマンドラインは (おそらく処理時間が 余分に掛かりますが) 次にようになります。

  dd bs=1k if=device count=count skip=skip

ここで一応警告しておきます。fsgrab プログラムは、 著者のもとでは完璧に機能しましたが、読者のもとでどのような振る舞いを しようとも著者は一切責任を負えません。実際これは、きちっと設計された プログラムではなく、なんとか処理をこなすだけものにすぎません。免責 に関する詳細は、プログラム付属の COPYRIGHT ファイルに記載された "No Warranty" の章をご覧ください (the GNU General Public License です)。