Difference between revisions of "Sysadmin/Migrate virtual machine"

From Sugar Labs
Jump to navigation Jump to search
Line 1: Line 1:
== How to migrate a file-based guest to LVM (online method) ==
+
=== How to migrate a file-based guest to LVM (online method) ===
  
 
* First, create the logical volume and attach it to the running VM:
 
* First, create the logical volume and attach it to the running VM:
Line 44: Line 44:
 
  #treehouse virsh start lightwave --console
 
  #treehouse virsh start lightwave --console
  
== How to migrate a file-based guest to LVM (offline method) ==
+
=== How to migrate a file-based guest to LVM (offline method) ===
  
 
* Determine the offset of the root partition within the raw disk image:
 
* Determine the offset of the root partition within the raw disk image:
Line 56: Line 56:
 
* Then create an LV and copy over everything as in the online case
 
* Then create an LV and copy over everything as in the online case
  
== How to migrate an LVM-based guest to another host ==
+
=== How to migrate an LVM-based guest to another host ===
  
 
(untested procedure)
 
(untested procedure)
Line 76: Line 76:
 
Make sure you pass all the fancy switches to rsync or you'll loose
 
Make sure you pass all the fancy switches to rsync or you'll loose
 
information on the copy.
 
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

Revision as of 10:24, 16 August 2010

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.


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