Difference between revisions of "Sysadmin/Migrate virtual machine"
< Sysadmin
Jump to navigation
Jump to search
Line 3: | Line 3: | ||
* First, create the logical volume and attach it to the running VM: | * First, create the logical volume and attach it to the running VM: | ||
− | treehouse# scp | + | treehouse# scp VMNAME:/boot/{vmlinuz,initrd}-2.6.31-22-server /srv/vm/kernel/ubuntu/ |
− | treehouse# virsh vol-create-as treehouse | + | treehouse# virsh vol-create-as treehouse VMNAME-root 10G |
− | treehouse# virsh attach-disk | + | treehouse# virsh attach-disk VMNAME /dev/treehouse/VMNAME-root vdc |
− | treehouse# virsh console | + | treehouse# virsh console VMNAME |
* From within the VM, format the new volume and move things over | * From within the VM, format the new volume and move things over | ||
− | + | 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 | |
* Then edit the VM configuration to make it boot without GRUB, using externally provided kernel and initrd: | * Then edit the VM configuration to make it boot without GRUB, using externally provided kernel and initrd: | ||
− | treehouse# virsh edit | + | treehouse# virsh edit VMNAME |
<os> | <os> | ||
Line 26: | Line 26: | ||
<kernel>/srv/vm/kernel/ubuntu/vmlinuz-2.6.31-22-server</kernel> | <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> | <initrd>/srv/vm/kernel/ubuntu/initrd.img-2.6.31-22-server</initrd> | ||
− | <cmdline>console=tty0 console=ttyS0,115200n8 vga=normal root=LABEL= | + | <cmdline>console=tty0 console=ttyS0,115200n8 vga=normal root=LABEL=VMNAME-root ro</cmdline> |
<boot dev='hd'/> | <boot dev='hd'/> | ||
</os> | </os> | ||
Line 33: | Line 33: | ||
... | ... | ||
<disk type='block' device='disk'> | <disk type='block' device='disk'> | ||
− | <source dev='/dev/treehouse/ | + | <source dev='/dev/treehouse/VMNAME-root'/> |
<target dev='vda' bus='virtio'/> | <target dev='vda' bus='virtio'/> | ||
</disk> | </disk> | ||
Line 41: | Line 41: | ||
* Reboot | * Reboot | ||
− | #treehouse virsh destroy | + | #treehouse virsh destroy VMNAME |
− | #treehouse virsh start | + | #treehouse virsh start VMNAME --console |
=== How to migrate a file-based guest to LVM (offline method) === | === How to migrate a file-based guest to LVM (offline method) === |
Revision as of 01:06, 23 January 2011
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 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
- From within the VM, format the new volume and move things over
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
- Then edit the VM configuration to make it boot without GRUB, using externally provided kernel and initrd:
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>
- Reboot
#treehouse virsh destroy VMNAME #treehouse virsh start VMNAME --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