Ubuntuの壊れかけたHDDからのデータ救出劇。

状況

HDDが死亡。

  • ディスクが読み込み専用になって気がつく。そのまま放置するといろいろ面倒な用途マシンので頑張って治すことにする。
  • Ubuntuusbメモリから起動してfdisk -lをすると見える。
    • しかし、sudo mount /dev/sda1 /mnt とかやってもマウントできない。
    • USBアダプだで接続しないとやばそうな気配を感じるほど末期。
    • USBアダプタでそのうち見えなくなる。

対策を次のようにした。

死亡HDDから吸い出しの儀

死亡HDDは次のアクションでどれぐらいヤバイ状況になるのかわからないので極力何もせずに吸い出しに専念する。

  • まず大容量のHDDを部屋の片隅から発掘した。幸いにも故障したHDDの数倍でかい容量のHDDが発掘される。
  • 次にこの死亡HDDと吸い出し先の数倍でかいHDDをマシンにつなぐ。
    • この際、死亡HDDは正常にマウントできないのでUSBアダプタ経由とした。
  • sudo fdisk -lでつながっていることを確認。
  • まずはddコマンドでHDD全体を吸い出す。ところが不良セクタ多数により吸い出せない。
  • 次のコマンドでエラーセクターはスキップして読み込む。512byteセクタなHDDなのでbs=512にしておく。
    • sudo mkdir /mnt2

    • sudo mount /dev/sdb1 /mnt2

    • sudo dd if=/dev/sdc of=/mnt2/sdc512.img bs=512 conv=noerror,sync

  • 不安になるほどうじゃうじゃエラーが出てくるので我慢して全部吸い出し終わるのを待つ。
  • 終わったら吸い出しファイルが異常なサイズになってないかは確認する。異常な場合は何か間違っているのでよく調べてね。
まずはマウントしてみよう

マウントをする。イメージファイルなのでデバイスではない。なのでまずはループバックデバイスにひも付けてデバイスとして見えるようにする。

  • sudo losetup /dev/loop1 /mnt2/sdc512.img

  • このままではfsckを流せないので、再度中のパーティションについてマッピングを行う。

    • sudo kpartx -a /dev/loop1

    • これにより、/dev/mapper/loop1p1とかでパーティションが見えるようになる。
  • fsckをかけてみる。

    • sudo fsck -yf /dev/mapper/loop1p1

  • スーパーブロックがぶっ壊れてダメな場合があるのでその場合スーパーブロックのみ再構築して再度fsckを試みる。

    • sudo mksf.ext4 -S /dev/mapper/loop1p1

    • sudo fsck -yf /dev/mapper/loop1p1

  • 中のファイルをマウントして取り出す。

    • sudo mkdir /mnt2p1

    • sudo mount /dev/mapper/loop1p1 /mnt2p1

    • sudo cp -pr /mnt2p1/xxxxx ./

VMのディスクの復旧と容量アップ

で、問題はここなのである。 せっかくの機会なのでディスクのサイズアップも行う。 手続きとしては次のようになる。

  1. 大きめのディスクイメージファイルを作る。
  2. 作ったディスクイメージにパーティーションを切る。
  3. 移行元のディスクイメージをマウントする
  4. ddでコピーする?それともフォーマットしてcopyコマンド?

  5. ddでコピーした場合。
    • ddでコピーすると動く。動くのだが・・・すぐに欠損セクタ由来と思われるfsエラーに引っかかってリードオンリーモードに入ってどうしようもなくなる。
    • とりあえずディストリ自身のバージョンアップを行うと以下の作業を延々と行うはめになる。
      • sudo fsck -yfc /dev/vda1

      • sudo reboot

      • sudo apt-get install -f

      • sudo dpkg –configure -a

      • エラーになって最初に戻る。
  6. フォーマットしてcopyコマンドでコピーした場合。
    まず、loopbackデバイスにひも付けて、マッピングしてフォーマットを行う。
    • sudo losetup /dev/loop2 /mnt2/newvmdisk.img

    • sudo kpartx -a /dev/loop2

    • sudo mkfs.ext4 /dev/mapper/loop2p1

    • sudo mkdir /mnt2loop2

    • sudo mount -t ext4 /dev/mapper/loop2p1 /mnt2loop2

    • sudo losetup /dev/loop1 /mnt2/oldvmdisk.img

    • sudo kpartx -a /dev/loop1

    • sudo fsck -yfc /dev/mapper/loop1p1

    • sudo mkdir /mnt2loop1

    • sudo mount -t ext4 /dev/mapper/loop1p1 /mnt2loop1

    • sudo cp -fr /mnt2loop1/* /mnt2loop2

  7. これだけでは当然ダメで、chrootしてgrubのインストールとupdate-grubを行う必要がある。
    • sudo mount –rbind /dev /mnt2loop2/dev

    • sudo mount –rbind /sys /mnt2loop2/sys

    • sudo mount -t proc proc /mnt2loop2/proc

    • sudo chroot /mnt2loop2 /bin/bash

    • # update-grub

  8. パスの関係上、grub-installだけはインストールCDで起動したVM上から行う必要がある。ないのかな?

    • # grub-install –recheck /dev/vda

  9. 仮にgrubが壊れていた場合。
    インストールしなおして再チャレンジするしかない。
    • sudo apt-get update

    • sudo apt-get install –reinstall grub

  10. 仮にsudoが壊れていた場合。

    とにかくgrubをいじってシングルユーザーモードで入って、rootのパスワードを設定する。sudoをそのまま再インストールか、再起動して再インストールする

qiita.com

  • $ su -

  • # apt-get update

  • # apt-get install –reinstall sudo

  • 運が良ければこのままディストリビューションのバージョンアップを行う。
    そう、運が良ければ。というのも不良セクター由来のバイナリ不良は各パッケージに及んでおり、パッケージ再インストールを行うより他確実に動く状態にはならない。fsckでは検出できない。 ディストリビューションのバージョンアップを行えればパッケージがほぼすべて最新バージョンに置き換わるはずである。
    • sudo do-releace-update

以上で動くようになるはず・・・

もちろん、不良セクター由来のデータ欠損はデータにも及んでいてだいぶ壊れてる気がするがないよりマシなのである。

くれぐれも多世代バックアップは欲しいなぁと思う次第。