Sysadmin/Migrate virtual machine

From Sugar Labs

Jump to: navigation, search

Contents

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

treehouse# scp VMNAME:/boot/{vmlinuz,initrd}-2.6.31-22-server /srv/vm/kernel/ubuntu/
treehouse# virsh vol-create-as treehouse VMNAME-root 10G
treehouse# virsh attach-disk VMNAME /dev/treehouse/VMNAME-root vdc
treehouse# virsh console VMNAME
VMNAME# mkfs.ext4 -L VMNAME-root -O flex_bg,extent,uninit_bg,sparse_super /dev/vdc
VMNAME# tune2fs -c -1 -i 0 /dev/vdc
VMNAME# mount /dev/vdc /mnt
VMNAME# rsync -PHAXphax --numeric-ids --delete / /mnt/
VMNAME# vim /mnt/etc/fstab
VMNAME# umount /mnt
VMNAME# ^D
treehouse# virsh edit VMNAME
 <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=VMNAME-root ro</cmdline>
   <boot dev='hd'/>
 </os>
 ...
 <devices>
   ...
   <disk type='block' device='disk'>
     <source dev='/dev/treehouse/VMNAME-root'/>
     <target dev='vda' bus='virtio'/>
   </disk>
   ...
 </devices>
#treehouse virsh destroy VMNAME
#treehouse virsh start VMNAME --console

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

This method works by taking down the virtual machine during the migration and mounting the partition inside the hard drive image. Mounting qcow2 files require a fancier method.

fdisk -l -u vm.img
mount -o loop,offset=$((63 * 512)) vm.img /mnt/
virsh vol-create-as treehouse VMNAME-root 10G
virsh attach-disk rt /dev/treehouse/VMNAME-root vdc
mkfs.ext4 -L rt-root -O flex_bg,extent,uninit_bg,sparse_super /dev/treehouse/VMNAME-root
tune2fs -c -1 -i 0 /dev/treehouse/VMNAME-root
mkdir /mnt2/VMNAME-root
mount  /dev/treehouse/VMNAME-root  /mnt2/VMNAME-root/
rsync -HAXphax --numeric-ids --delete /mnt/VMNAME-root/ /mnt2/VMNAME-root/

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.


Alternative to convert file based VM to block based LVM (Assumes server is treehouse)

Stop the VM

sudo virsh stop name_of_vm

Convert the qcow2 file to a raw file

sudo qemu-img convert "name_of_vm".qcow2 -O raw "name_of_vm".raw

Create the LVM - Make sure the "size_of_vm" is equal or greater than the size of your raw image

sudo virsh vol-create-as treehouse "name_of_vm" "size_of_vm"

Copy the raw image to the LVM

sudo dd if="name_of_vm".raw of=/dev/treehouse/"name_of_vm" bs=1M

Edit the VM configuration

sudo virsh edit "name_of_vm"
   <devices>
     ...
     <disk type='block' device='disk'>      <----- change disk type to block
       <source dev='/dev/treehouse/"name_of_vm"'/>      <------ note that the source is now dev= and not file=
       <target dev='vda' bus='virtio'/>
     </disk>
     ...
   </devices>

Now start your VM and your all set

Personal tools
Namespaces
Variants
Actions
Sugar
Projects
Teams
Local Labs
Using the Wiki
Google translations