The Daily Shaarli

All links of one day in a single page.

Today - 12/08/25

virsh - migrate

MASTER

echo -e -n "Give the domain name: " && read domain
echo -e -n "Give the path of pool (/vms/virt) : " && read pth_pool
pth_pool=${pth_pool:-/vms/virt}
echo -e -n "Give the path of disk ($pth_pool/${domain}.qcow2) : " && read pth_disk
pth_disk=${pth_disk:-$pth_pool/${domain}.qcow2}

pth_pool=/vms/virt
domain=cuckoo-1804
pth_disk=$pth_pool/${domain}.qcow2

sdate=$(date +%s)
pth_xml=/vms/share/${domain}-${sdate}

export LIBVIRT_DEFAULT_URI=qemu:///system # for virsh autoconnection
[ -d ${pth_xml} ] || mkdir -p ${pth_xml}

# dumps
echo "> ${domain}"
virsh dumpxml ${domain} > ${pth_xml}/${domain}.xml
for snapshot in $(virsh snapshot-list $domain --name); do
    echo "  ${snapshot}"
    virsh snapshot-dumpxml --domain ${domain} ${snapshot} > ${pth_xml}/${domain}_${snapshot}.xml
done

pth=/tmp/${domain}::${sdate}.tar.gz
cd ${pth_xml}
tar czf ${pth} *
echo -e "\nPlease copy this files to slave:"
echo ${pth}
echo ${pth_disk}

SECOND

echo -e -n "Give the path of snapshots compressed files: " && read pth_tgz
echo -e -n "Give the path of copied disk: " && read pth_disk
echo -e -n "Give the path of pool (/vms/virt) : " && read pth_pool
pth_pool=${pth_pool:-/vms/virt}

export LIBVIRT_DEFAULT_URI=qemu:///system # for virsh autoconnection
domain=${pth_tgz##*/}; domain=${name%::*}
sdate=${pth_tgz##*::}; sdate=${sdate%%.*}
pth_disk=${pth_pool}/${domain}.qcow2
pth_xml=/vms/share/${domain}-${sdate}

[ -d "${pth_xml}" ] || mkdir -p "${pth_xml}"
tar xzf ${pth_tgz} -C "${pth_xml}"

# create a volatily image
sudo qemu-img create -f qcow2 ${pth_disk} 100M
# define domain
virsh define ${pth_xml}/${domain}.xml
virt-clone --original ${domain} --name ${domain} --file ${pth_disk} --preserve-data

# restore snapshots to empty disk
for snapshot in ${lssnapshot}; do
    virsh snapshot-create ${domain} --xmlfile ${pth_tmp}/${domain}_${snapshot}.xml --atomic
done
# verify snapshots list
echo "- domain snapshots:"
virsh snapshot-list ${domain}

# full copy disk / qemu-img convert loses snapshots
if ! [ "${pth_disk%%/*}" = /vms/virt ]; then
    echo "copy disk from '${pth_disk}' to '/vms/virt/${pth_disk##*/}'"
    sudo cp -a ${pth_disk} ${pth_disk}
fi
# verify image snapshots list
echo "- disk snapshots:"
qemu-img snapshot -l ${pth_disk}

echo "Launch domain ${domain} in virt-manager (restart virt-manager)
virsh - clone
export LIBVIRT_DEFAULT_URI=qemu:///system # for virsh autoconnection
pth=/vms/virt
domain=cuckoo-1804
newdomain=cuckoo-1804-clone
pthdisk=$pth/${domain}.qcow2
pthnewdisk=$pth/${domain}-clone.qcow2
pthtmp=/vms/share/${domain}-${date +%s}
lssnapshot=$(virsh snapshot-list $domain --name)

[ -d ${pthtmp} ] || mkdir -p ${pthtmp}

# dump snapshots
for snapshot in ${lssnapshot}; do
    virsh snapshot-dumpxml --domain ${domain} ${snapshot} > ${pthtmp}/${domain}_${snapshot}.xml
done

# create a volatily image
sudo qemu-img create -f qcow2 ${pthnewdisk} 100M
# clone domain
virt-clone --original ${domain} --name ${newdomain} --file ${pthnewdisk} --preserve-data

# restore snapshots to empty disk
for snapshot in ${lssnapshot}; do
    virsh snapshot-create ${newdomain} --xmlfile ${pthtmp}/${domain}_${snapshot}.xml --atomic
done
# verify snapshots list
echo "- domain snapshots:"
virsh snapshot-list ${newdomain}

# full copy disk / qemu-img convert loses snapshots
sudo cp -a ${pthdisk} ${pthnewdisk}
# verify image snapshots list
echo "- disk snapshots:"
qemu-img snapshot -l ${pthnewdisk}

echo "Launch domain ${newdomain} in virt-manager (restart virt-manager)