Migrating Proxmox LVM-Thin Volumes to another Proxmox Host
Introduction
In an earlier post, i've discribed how to migrate VMWare ESXi Virtual Machines (or mostly their disks) to a new Proxmox KVM machine. This time i had to move a Proxmox VM to another Proxmox host. Both hosts using LVM-Thin Logical Volumes to store guest data instead of disk files like VirtualBox.
This small guide shows you how you can accomplish moving rather large logical volumes between hosts without storing any intermediate files (to save precious disk space).
Preparations
The method i've used is basically simply using dd
to read and also write the actual data on both sides. For the network communication i've used ssh
. This is rather simple to use with ssh keys and all the data copied over the network is secure.
You can even use this method to move data over the Internet safely.
We first have to add the ssh's public key from the source host - let's call him shost
- to the authorized_keys
file from the root
user of the destination host, called dhost
.
# Get the shost's ssh public key
~$ cat /root/.ssh/id_rsa.pub
Then insert it's contents to the destination hosts authorized_keys file
# Paste the shost's ssh public key in a newline here
~$ vim /root/.ssh/authorized_keys
After saving, try to establish a connection from the source to the destination host, and add the dhost's
SSH Host key once.
# I expect that you're already root on shost, so there is no need to add a login user to the ssh command. The logged-in user is used by default here
~$ ssh dhost
The authenticity of host 'dhost (192.168.1.3)' can't be established.
ECDSA key fingerprint is xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yey
Warning: Permanently added 'dhost,192.168.1.3' (ECDSA) to the list of known hosts.
Now that you can login from shost
to dhost
without a password, we can continue with the actual migration
Data Migration over SSH
As i said, i've used dd
to read and write the data. I also used pv
, so i have a nice progress bar as well.
First check the used Logical Volume on shost
of the machine you want to use. For that, go to the machine, then into the hardware tab. The logical volume path should read like local-lvm:vm-100-disk-1
. We need the vm-100-disk-1
part and will call it <shost lv>
. Also check the actual disk size. In our example it's 100 Gigabytes.
Now create the same machine on dhost
with the same disk size like on shost
. After creating it, also read the logical volume name here. We will call this one <dhost lv>
.
Now let us copy the stuff over. Make sure the Virtual Machine is actually shutdown.
~$ dd if=/dev/pve/<shost lv> conv=sparse | pv -s 100G | ssh dhost dd of=/dev/pve/<dhost lv>
Execute this command and dd
will read off of the source hosts logical volume but will seak and ignore NUL blocks (zeroes) to save disk space, shift it through pv
with a pre-defined size, so it can calculate the progress you see while copying and then pipe it through ssh
to the destination hosts dd
which writes the data back to the new logical volume bit by bit.
Start the machine on the new host
After successfully copying the data, and after you made sure that you recreated the VM correctly on the new host, you can simply start it there and see it booting. That's it! If it wasn't successful you can simply boot the old VM at any time.
Disclaimer
I don't take any responsibilities for any damage this may cause.