Sysadmin/Migrate virtual machine

< Sysadmin
Revision as of 20:54, 14 August 2010 by Bernie (talk | contribs)

How to migrate a file-based guest to LVM (online method)

  • First, create the logical volume and attach it to the running VM:
treehouse# scp lightwave:/boot/{vmlinuz,initrd}-2.6.31-22-server /srv/vm/kernel/ubuntu/
treehouse# virsh vol-create-as treehouse lightwave 10G
treehouse# virsh attach-disk lightwave /dev/treehouse/lightwave-root vdc
treehouse# virsh console lightwave
  • From within the VM, format the new volume and move things over
lightwave# mkfs.ext4 -L lightwave-root -O flex_bg,extent,uninit_bg,sparse_super /dev/vdc
lightwave# tune2fs -c -1 -i 0 /dev/vdc
lightwave# mount /dev/vdc /mnt
lightwave# rsync -PHAXphax --numeric-ids --delete / /mnt/
lightwave# vim /mnt/etc/fstab
lightwafe# umount /mnt
lightwave# ^D
  • Then edit the VM configuration to make it boot without GRUB, using externally provided kernel and initrd:
treehouse# virsh edit lightwave
 <os>
   <type arch='x86_64' machine='pc-0.11'>hvm</type>
   <kernel>/srv/vm/kernel/ubuntu/vmlinuz-2.6.31-22-server</kernel>
   <initrd>/srv/vm/kernel/ubuntu/initrd.img-2.6.31-22-server</initrd>
   <cmdline>console=tty0 console=ttyS0,115200n8 vga=normal root=LABEL=lightwave-root ro</cmdline>
   <boot dev='hd'/>
 </os>
 ...
 <devices>
   ...
   <disk type='block' device='disk'>
     <source dev='/dev/treehouse/lightwave-root'/>
     <target dev='vda' bus='virtio'/>
   </disk>
   ...
 </devices>
  • Reboot
#treehouse virsh destroy lightwave
#treehouse virsh start lightwave --console

How to migrate a file-based guest to LVM (offline method)

  • Determine the offset of the root partition within the raw disk image:
fdisk -l -u vm.img
  • Convert the start offset to bytes:
mount -o loop,offset=$((63 * 512)) vm.img /mnt/
  • Then create an LV and copy over everything as in the online case

How to migrate an LVM-based guest to another host

(untested procedure)

First, shutdown the VM, then do:

mount /dev/treehouse/beamrider-root /mnt
ssh housetree mount /dev/housetree/beamrider-root /mnt
rsync -PHAXphax --delete --numeric-ids /mnt/ housetree:/mnt/
rsync -a /etc/libvirt/qemu/beamrider.xml housetree:/etc/libvirt/qemu/
umount /mnt
ssh housetree umount /mnt

Then log to $OTHERHOST and create the domain in virsh.

Downtime can be reduced to just a few minutes by doing a first rsync iteration from within the VM while it's still running.

Make sure you pass all the fancy switches to rsync or you'll loose information on the copy.