はじめて遭遇したケースなので。

症状と対策

Q:起動ディスクとして使用していたUSBメモリーが書き込み不能に。起動ディスクゆえ出来れば中身をそのまま復旧したい

A: 以下のようにして復旧に成功した

  1. 不良USBメモリーのディスクイメージを作成
  2. ディスクイメージに対してディスク修復を実行
  3. 良品に書き戻し

今回はFreeBSDというやや特殊な事例なのだけど、上記の手法は他のOSの他のファイルシステムでも応用できるはず。

実践

今回壊れたのは、こちら。

これがだんまりになったので、再起動したところ

(da0:umass-sim0:0:0:0): CAM status: SCSI Status Error
(da0:umass-sim0:0:0:0): SCSI status: Check Condition
(da0:umass-sim0:0:0:0): SCSI sense: DATA PROTECT asc:27,0 (Write protected)

という感じでPANIC。

以下、コマンドは別のFreeBSD box で root で実行

  1. 不良USBメモリーのディスクイメージを作成 不良USBメモリーをFreeBSD boxに指してからこんな感じで。
    # dd if=/dev/rda0 of=jetlash.img bs=16m
    
    終わったら不良USBメモリーは外す。
  2. ディスクイメージに対してディスク修復を実行

    今回不良になったUSBメモリーにはパーティションが二つあり、壊れたのは二つ目。

    # mdconfig -a -t vnode -u 0 -f jetflash.img
    # mdconfig -f jetflash.img -u 0
    # fsck -t ufs -p /dev/md0s1a
    # fsck -t ufs -y /dev/md0s1d
    # fsck -t ufs -p /dev/md0s1d
    # mount /dev/md0s1a /mnt
    # mount /dev/md0s1d /mnt/home
    
  3. 良品に書き戻し
  4. 今回は幸い8GBのUSBメモリーが手元にあったので、こちらにパーティションを一つ作って書き戻し。/mnt2にマウントしておいてから

    # cd /mnt
    # tar cf - .??* * | (cd /mnt2 && tar xvpf -)
    

    という感じでリストアした後、/mnt2/etc/fstabを修正

  5. 後片付け ディスクイメージをアンマウント。
    # umount /mnt/home
    # umount /mnt
    # mdconfig -d -u 0
    

余談ではあるが、今回不良となったUSBメモリでは、不良ブロックのみが読み込みのみになるようだ。試しにフォーマットしなおしてみると普通に読み書きできる状態に戻ったと思いきや、 dd if=/dev/zero of=/dev/rdiskNとかしてみると、該当箇所で止まる。Transcend Online Recovery Tool を使っても直らなかった。永久保証を使ってみるか…もっとも今なら8GBぐらいだと実売価格1000円を切るし、やりとりの手間も惜しいといえば惜しいのだが…

Dan the Man with Too Many Storage Devices