状況
HDDが死亡。
- ディスクが読み込み専用になって気がつく。そのまま放置するといろいろ面倒な用途マシンので頑張って治すことにする。
- Ubuntuのusbメモリから起動して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 mkdir /mnt2p1
sudo mount /dev/mapper/loop1p1 /mnt2p1
sudo cp -pr /mnt2p1/xxxxx ./
VMのディスクの復旧と容量アップ
で、問題はここなのである。 せっかくの機会なのでディスクのサイズアップも行う。 手続きとしては次のようになる。
- 大きめのディスクイメージファイルを作る。
- 作ったディスクイメージにパーティーションを切る。
- 移行元のディスクイメージをマウントする
ddでコピーする?それともフォーマットしてcopyコマンド?
ddでコピーした場合。
フォーマットして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
これだけでは当然ダメで、chrootしてgrubのインストールとupdate-grubを行う必要がある。
パスの関係上、grub-installだけはインストールCDで起動したVM上から行う必要がある。ないのかな?
# grub-install –recheck /dev/vda
仮にgrubが壊れていた場合。
インストールしなおして再チャレンジするしかない。sudo apt-get update
sudo apt-get install –reinstall grub
仮にsudoが壊れていた場合。
とにかくgrubをいじってシングルユーザーモードで入って、rootのパスワードを設定する。sudoをそのまま再インストールか、再起動して再インストールする
$ su -
# apt-get update
# apt-get install –reinstall sudo
運が良ければこのままディストリビューションのバージョンアップを行う。
そう、運が良ければ。というのも不良セクター由来のバイナリ不良は各パッケージに及んでおり、パッケージ再インストールを行うより他確実に動く状態にはならない。fsckでは検出できない。 ディストリビューションのバージョンアップを行えればパッケージがほぼすべて最新バージョンに置き換わるはずである。sudo do-releace-update
以上で動くようになるはず・・・
もちろん、不良セクター由来のデータ欠損はデータにも及んでいてだいぶ壊れてる気がするがないよりマシなのである。
くれぐれも多世代バックアップは欲しいなぁと思う次第。