動機
HyperVで動かしていたVM,なぜか大量のチェックポイントが生成されてしまい,チェックポイントを削除してマージもできなくなった.
そこで,新VM(第2世代)を作成し,旧VM(第1世代)からファイルをコピーすることにした.
手順
新VM
- 新VMを準備.このとき世代を第2世代で作成した.セキュアブートはMicrosoft WindowsからMicrosoft UEFI証明機関に変更しておく.LiveCDで起動.こちらもDebianのnetinstで起動.
- ipを192.168.xxx.yyyに設定
- ディスクのパーティションを設定する.
- EFI用にパーティション(sda1)を準備.
- /用のパーティション(sda2)を用意.このとき元のVMだとext4でフォーマットしていたが,btrfsにした.
- swap用のパーティション(sda3)を用意.
mkdir /tmp/root
mount -t btrfs -o compress=lzo /dev/sda2 /tmp/root
btrfs subvolume create /tmp/root/@rootfs
umount /tmp/root
mount -t btrfs -o compress=lzo,subvol=@rootfs /dev/sda2 /tmp/root
- これで新VMの準備ができたので,旧VMからファイルを受け取るために以下のコマンドを実行.
cd /tmp/root; nc -l -p 12345| tar xvpf -
旧VM
- 旧VMのlinuxをシャットダウン
- LiveCDで起動.今回はDebianのnetinstを使った.
- 旧VMからファイルを送る.まずファイルシステムをマウントする.
mkdir /tmp/root; mount /dev/sda2 /tmp/root; cd /tmp/root
- 新VM(192.168.xxx.yyy)へファイルを送信する.netinstではrsyncとかないのでncを使う.
tar cvf - . | nc 192.168.xxx.yyy 12345
新VMの後処理
- EFIパーティションをマウント
mount /dev/sda1 /tmp/root/boot/efi
- chroot後に必要なファイルシステムを設定.
for f in /dev /dev/pts /proc /sys ; do mount -B $f /tmp/root$f; done
chroot /tmp/root
modprobe efivarfs
grub-install --target=x86_64-efi --efi-directory=/boot/efi --recheck /dev/sda
- /etc/fstabを修正.blkidでuuidを確認して変更する.また/をext4からbtrfsに変更したのでファイルシステムとオプション
compress=lzo,subvol=@rootfs
などを設定.
まとめ
LiveCDで起動して,ファイルシステムをtarとncを使ってリモートへ送ってコピーする.今回はHyperVで行なったが,実機でも同じようにできるはず.またイメージではなくファイルのコピーを行なっているので,ext4からbtrfsへファイルシステムの変更も可能.
HyperVのVMを第2世代にしたことで,biosではなくEFIでブートすることになるが,grubの設定を更新することで無事にブートした.
netinstのイメージがあったのでnetinstを利用したが,別のliveCDがあればそれを使うのが便利だとおもう.試してないがantiXとかを使うと使えるコマンドも増えてよさそう.