強引なやり方のためfsck
覚悟。
dd
- 物理サーバーにssh
- nfs や usbをマウント
dd if=/dev/sda | gzip -c > /mnt/nfs/disk.dd.gz
1TBで6時間くらいかかった。
ソフトウェアRAID1の場合、sdaとsdbとあるが、sdaだけddで良い。
ソフトウェアRAID0やRAID5などの場合はddどうするのかね。
イメージの扱い
- 元のディスクより大きいサイズのディスクを用意。(今回1TBのイメージだったので、2TBを用意した。)
gzip -d disk.dd.gz
qemu-convert -O qcow2 disk.dd disk.qcow2
- disk.qcow2 を利用して 仮想マシンを(今回はkvmを使った) で起動
- ストレージタイプは
virtio
を選びたいところだが、CentOSの起動時に以前のストレージタイプ(sda
)を指定しているため、sata
にする。ネットワークは無効にしておいたほうが良い。 - DISKチェック。singleユーザーで起動
fsck -y /dev/md1
reboot
無事起動したことを確認。
- ログインできたらディスクの空きをゼロ埋めする。
dd if=/dev/zero of=zero bs=1M; rm -f zero
- 仮想マシンを停止し仮想ディスクイメージをトリム。今一度
qemu-img convert -O qcow2 disk.dd disk.dd.trim
dd以外の方法
無停止の dd だとデーターの欠損が気になるため
物理サーバをコンテナ化 (OpenVzの例) - Qiitaのようにtarで固めるか、
/boot/grub/menu.lst で root=/dev/md1
と指定がある場合は適宜書き換える。
ソフトウェアRAID1の場合
- CentOS5 のDVDで起動しても /dev/md?? は認識しなかった。
-
clonezilla-live-20161121-yakkety-amd64.iso
(ubuntu 16.10ベース) だと /dev/md126, /dev/md127 で認識した。
旧DISKをマウント
mkdir rootdir
mount -o ro /dev/md126 old
mount -o ro /dev/md127 old/boot
新DISKをマウント
# CentOS5ではext4は使えない
mkfs.ext3 /dev/sdb1
mkfs.ext3 /dev/sdb2
mkswap /dev/sdb3
mkdir newdir
mount -o ro /dev/sdb2 new
mount -o ro /dev/sdb1 new/boot
DISKコピー
rsync -a old/ new/
sync;sync;sync
編集
/etc/mdadm.conf
/etc/fstab
/boot/grub/menu.lst
- CentOSのDVDから
linux rescue
で起動。- /mnt/sysimage に自動マウントされていない場合、/etc/fstabが間違っている。
# mount /dev/sda2 /mnt/sysimage
# mount /dev/sda1 /mnt/sysimage/boot
cd /mnt/sysimage
# mount -o bind /dev dev
# mount -t proc none proc
# mount -o bind /sys sys
chroot .
grub-install /dev/sda
grubをインストールして起動確認
起動に失敗する場合
## `switchroot: mount failed: No such file or directory`
で起動に失敗するなら
# mkinitrd /boot/initrd-2.6.xx.x.img 2.6.xx.x
/boot/grub/device.map
- (hd0) /dev/sda
+ (hd0) /dev/vda
grub-install /dev/vda
sata -> virtio に変更も上記にて成功した。
手動でgrubセットアップ方法
手動でgrubセットアップ
# grub --device-map=/dev/null
device (hd0) /dev/vda
root (hd0,0)
setup (hd0)
quit