Canvio Plus 750GB の FreeBSD ufs をまず復旧2018年04月02日 13時22分29秒

東芝の Canvio Plus 750GB External USB 2.0 Portable Hard Drive が誤動作を起こし始めた。新しいディスクは注文した。fsck の直せない ufs の復旧が第一の課題。

このディスクは ufs と zfs で使っている。zfs は raid-z の一部。こちらには大量の写真や家族の動画が入っている。これは、新しいハードディスクを購入してから、zpool replace で交換する必要があるので、こちらの復旧作業は後回し。

この ufs はホームディレクトリとして利用している一番重要なデータ。こちらは、時おり ufs_copy でディスクをファイルシステム毎バックアップしている。ディスクは何度も移り変わっているが、既に十年、十五年以上前に作ったファイルシステムなので、29GB のみ。作成当時はディスク一台で、全てのファイルが入っていたが、既に写真などの大容量は別途保管して、それこそ日頃のメールやブラウザの履歴などが入っている。zfs のバックアップに週に一度ぐらい気の向いたときにバックアップを取っている。

別の zfs には二、三日前に取ったホームディレクトリのバックアップはある。ただ、税金申告の期限が迫っているので、あれこれ更新していたものがあるので、出来れば故障したディスクから復旧したい。手元を漁ると I-O DATA の HDPS-U に 30GB のスペースがすぐに融通できるのでそれを使う事にした。これは、実家に帰っていた時に、写真が入りきらなくなった時に、譲り受けた機械。父の手書きで、2009 年と日付が書いてある。

ディスクの復旧は recoverdisk。dd よりも優れている。recover_disk はファイルブロックサイズを大きめで始める。エラーがあるとエラー箇所を一度飛ばし、そのままコピーを終端まで終らせる。その後で、ブロックサイズを小さくして、エラーのあった箇所を再試行する。-w オプションを付けると、経過とエラー箇所をファイルに書き出す。

$ recoverdisk -w home.err /dev/label/home.eli /dev/da0s2
最終的に読めなかったブロックは六つぐらい。fsck が先に進めないので、このブロックはシステム情報が管理されているのだろう。その後、壊れたディスクを読み出しのみの mount -r でマウントを試みた。
$ mount -r /dev/label/home.eli /home
これでもマウント出来ない。

このファイルシステムは完全に壊れてしまった様だ。直せないのなら、更に壊しても、新たに失うものは無いので、強制復旧を試みる。そして、ufs のメタデータだったとの推測から、古いディスクイメージからこの故障セクタのみを写すという荒技を試すことにした。

$ mdconfig -a -t vnode -f /mnt/backup/20180301/home.ufs -oreadonly
md1
$ recoverdisk -r home.err /dev/md1 /dev/da0s2
$ fsck_ufs -y /dev/da0s2
$ fsck_ufs -y /dev/da0s2
$ mount -r /dev/da0s2 /home
mdconfig で古いディスクイメージを読み出しのみで設定する。ファイルのままでも処理できるが、間違えた時にダメージを回避するため md デバイスを利用。さっきの recoverdisk に home.err を渡して、破損セクタだけをコピーする。fsck を動かしたら、ファイルシステムを修正したので、再度 fsck を行うように指示された。

この後、mount は成功し、zfs のバックアップを元に復旧度合を確かめた。特にファイルの損失もなく、こちらの方が新しいので、ディスクからの普及には成功したとの結論に至った。

前回次回