Sysadmin/Migrate virtual machine: Difference between revisions

No edit summary
 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
=== Importing an existing disk image into libvirt ===
Let's assume you already have a disk file and you want to add it to a pool.
There doesn't seem to be a direct way to do this with virsh, but you can create a blank disk and then copy your image into it:
# virsh vol-create-as boot new.img 1G --format raw
# virsh vol-upload --pool boot new.img existing.img
=== Copying LVM volumes across machines ===
Create the new volume, format and mount it:
# virsh vol-create-as nvme-pool new-root 20G
# mkfs.ext4 -L new-root -O mmp,flex_bg,extent,uninit_bg,sparse_super /dev/nvme-pool/new-root
# tune2fs -c -1 -i 0 /dev/nvme-pool/new-root
# mkdir /new-root
# mount /dev/nvme-pool/new-root /new-root
Copy the contents of the remote filesystem (this can be done while the VM is online, but you might want to shutdown any running database to get a consistent snapshot):
# rsync -PHAXphax lightwave:/ /new-root/
Don't forget to unmount your new filesystem!
# umount /new-root
# rmdir /new-root
=== Importing a VM from existing disk files ===
# virt-install -v --accelerate --nographics --vcpus 2 --ram 1024 --os-type linux --os-variant=ubuntu20.04 --network bridge:br0 --disk vol=boot/NEWVM-boot.img,bus=virtio --disk vol=nvme-pool/NEWVM-root,bus=virtio --name NEWVM --import
The new VM will boot and probably fail to mount the root because the UUID changed.
You can fix this by dropping into grub the usual way:
* virsh start --console NEWVM
* press ESC before the kernel starts
* press e to edit a menu entry
* modify the kernel command line (for example, root=/dev/vdb)
* hit ctrl-x to boot
After booting, remember to update your grub.cfg and test it:
# update-grub
# reboot
=== 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, take a copy of the kernel and initrd:


  treehouse# scp VMNAME:/boot/{vmlinuz,initrd}-2.6.31-22-server /srv/vm/kernel/ubuntu/
  treehouse# scp VMNAME:/boot/{vmlinuz,initrd}-2.6.31-22-server /srv/vm/kernel/ubuntu/
* Then, create the logical volume and attach it to the running VM:
  treehouse# virsh vol-create-as treehouse VMNAME-root 10G
  treehouse# virsh vol-create-as treehouse VMNAME-root 10G
  treehouse# virsh attach-disk VMNAME /dev/treehouse/VMNAME-root vdc
  treehouse# virsh attach-disk VMNAME /dev/treehouse/VMNAME-root vdc
Line 45: Line 94:


=== How to migrate a file-based guest to LVM (offline method) ===
=== 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.


* 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 54: Line 106:
  mount -o loop,offset=$((63 * 512)) vm.img /mnt/
  mount -o loop,offset=$((63 * 512)) vm.img /mnt/


* 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
 
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 ===
=== How to migrate an LVM-based guest to another host ===
Line 78: Line 138:




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


Stop the VM
Stop the VM