故障しているディスクをバックアップ2007年08月28日 11時13分39秒

新しいディスクをバックアップするときには、圧縮してから split した方が、余計な IO を削減できる。

しかし、故障したディスクだとしたら話は別だ。ディスクも年々大きくなっているので、流石に全てが収まるディクスをその都度買うのにも無理がある。ディスクの復旧であれば、幾つか新しいものもあるが、それらが必要なときに必ず手に入るとは限らない。dd は古典的だが、システムにも付属されていて、ある意味確実な道具となる。

この場合は、split を先に行なう。各一つずつのファイルが書き終われば、圧縮しても split に影響は無いので、ディスクに余裕の無いときは、随時圧縮していく。


# dd if=/dev/ad2 bs=1MB conv=sync,noerror count=xxx | split -b2048m - XXX-ad2.dd.

数百 GB 以上のディスクを 512 バイト毎に読んでいたら、遅くて仕方が無いので、少々危険性は上がるが 1MB で読む。sync,noerror の為、EOF でも止まらなくなるので、count を指定。xxx を実際のディスクの大きさから求める必要がある。

そのうち、エラーが出てとても遅くなるが、そこをやり過ごすのを待つしか無い。dmesg にエラーが残るので、どの区分のファイルでエラーがあったのかを見つける。1MB で読み出しているので、失敗したブロックの被害が大きくなる。そのブロックを、小さいブロックサイズを用いて読み直す。

例えば、三つ目のファイル ac に不良ブロックがあったとしよう。その場合、最初の 4GB を飛ばして、2GB 分を読めばいいことになる。計算を簡単にするために、1k ブロックを読むことにする。count は 2GB = (2 * 1024)[MB] * 1024 [MB/KB] = 2097152 となる。スキップするブロック数は 4 GB 分なので、(4 * 1024)[MB] * 1024 [MB/KB] = 4194304 となる。


# dd if=/dev/ad2 conv=sync,noerror bs=1k count=2097152 seek=4194304 of=XXX-ad2.ac

これで、1MB ブロックの時よりも被害が少なくなる。

ファイルデバイスとして、mdconfig を使う時は、十分な大きさのディスクを準備する必要がある。また、分割をしたものを再結合する必要もある。この時、ゼロで埋め尽くされているディスクは圧縮すると、数キロバイトの大きさになる。この様な部分は、mdconfig などを通して、デバイスとしてアクセスされる事は無い。つまり、何もゼロでディスクを埋めておく必要は無い。

例えば、100 GB のディスクを dd したとする。そのうちの最初の 20 GB が圧縮後も比較的大きく、残りは、全て同じ大きさで、数キロバイトだとしよう。この時、最初の 20GB 分のみを展開し、結合しておけば用は足りる。100GB のディスクを複製するのに 20GB でも十分だということだ。

前回次回