From 8be67a2d5b16e3527b84c71a8e4ca9af13343efb Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Wed, 4 Sep 2024 02:13:22 +0300 Subject: [PATCH] Fix OpenNebula save/restore --- docs/installation/opennebula.en.md | 8 +++++++- docs/installation/opennebula.ru.md | 6 ++++++ opennebula/install.sh | 2 +- opennebula/remotes/vmm/kvm/restore.vitastor | 4 +++- opennebula/remotes/vmm/kvm/save.vitastor | 7 +++++-- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/docs/installation/opennebula.en.md b/docs/installation/opennebula.en.md index e256bd79..dfa734a3 100644 --- a/docs/installation/opennebula.en.md +++ b/docs/installation/opennebula.en.md @@ -28,7 +28,7 @@ Install OpenNebula. Then, on each node: ### oned.conf changes -1. Add deploy script override in kvm VM_MAD: add `-l deploy.vitastor` to ARGUMENTS: +1. Add deploy script override in kvm VM_MAD: add `-l deploy.vitastor` to ARGUMENTS. ```diff VM_MAD = [ @@ -49,6 +49,10 @@ Install OpenNebula. Then, on each node: ] ``` +Optional: if you also want to save VM RAM checkpoints to Vitastor, use +`-l deploy=deploy.vitastor,save=save.vitastor,restore=restore.vitastor` +instead of just `-l deploy=deploy.vitastor`. + 2. Add `vitastor` to TM_MAD.ARGUMENTS and DATASTORE_MAD.ARGUMENTS: ```diff @@ -141,6 +145,8 @@ The OpenNebula plugin includes quite a bit of bash scripts, so here's their desc | Script | Action | How to Test | | ----------------------- | ----------------------------------------- | ------------------------------------------------------------------------------------ | | vmm/kvm/deploy.vitastor | Start a VM | Create and start a VM with Vitastor disk(s): persistent / non-persistent / volatile. | +| vmm/kvm/save.vitastor | Save VM memory checkpoint | Stop a VM using "Stop" command. | +| vmm/kvm/restore.vitastor| Restore VM memory checkpoint | Start a VM back after stopping it. | | datastore/clone | Copy an image as persistent | Create a VM template and instantiate it as persistent. | | datastore/cp | Import an external image | Import a VM template with images from Marketplace. | | datastore/export | Export an image as URL | Probably: export a VM template with images to Marketplace. | diff --git a/docs/installation/opennebula.ru.md b/docs/installation/opennebula.ru.md index 225d85a8..41f5f03d 100644 --- a/docs/installation/opennebula.ru.md +++ b/docs/installation/opennebula.ru.md @@ -49,6 +49,10 @@ ] ``` +Опционально: если вы хотите также сохранять снимки памяти ВМ в Vitastor, добавьте +`-l deploy=deploy.vitastor,save=save.vitastor,restore=restore.vitastor` +вместо просто `-l deploy=deploy.vitastor`. + 2. Добавьте `vitastor` в значения TM_MAD.ARGUMENTS и DATASTORE_MAD.ARGUMENTS: ```diff @@ -144,6 +148,8 @@ iptables -I FORWARD 1 -s 10.0.3.0/24 -d 10.0.2.0/24 -j DROP | Скрипт | Описание | Как протестировать | | ----------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------ | | vmm/kvm/deploy.vitastor | Запустить виртуальную машину | Создайте и запустите виртуальную машину с дисками Vitastor: постоянным / непостоянным / волатильным (временным). | +| vmm/kvm/save.vitastor | Сохранить снимок памяти ВМ | Остановите виртуальную машину командой "Остановить". | +| vmm/kvm/restore.vitastor| Восстановить снимок памяти ВМ | Запустите ВМ после остановки обратно. | | datastore/clone | Скопировать образ как "постоянный" | Создайте шаблон ВМ и создайте из него постоянную ВМ. | | datastore/cp | Импортировать внешний образ | Импортируйте шаблон ВМ с образами дисков из Магазина OpenNebula. | | datastore/export | Экспортировать образ как URL | Вероятно: экспортируйте шаблон ВМ с образами в Магазин. | diff --git a/opennebula/install.sh b/opennebula/install.sh index 5ae0bc2c..14726f41 100755 --- a/opennebula/install.sh +++ b/opennebula/install.sh @@ -5,7 +5,7 @@ set -e reapply_patch() { if ! patch -f --dry-run -l -R $1 < $2 >/dev/null; then already_applied=0 - if ! patch -l -f $1 < $2; then + if ! patch --no-backup-if-mismatch -r - -l -f $1 < $2; then applied_ok=0 echo "ERROR: Failed to patch file $1, please apply the patch $2 manually" fi diff --git a/opennebula/remotes/vmm/kvm/restore.vitastor b/opennebula/remotes/vmm/kvm/restore.vitastor index 97c9baec..07d4a00a 100755 --- a/opennebula/remotes/vmm/kvm/restore.vitastor +++ b/opennebula/remotes/vmm/kvm/restore.vitastor @@ -19,7 +19,7 @@ XPATH="${DRIVER_PATH}/../../datastore/xpath.rb --stdin" while IFS= read -r -d '' element; do XPATH_ELEMENTS[i++]="$element" -done < <($XPATH \ +done < <(cat | $XPATH \ /VMM_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/VITASTOR_CONF \ /VMM_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/IMAGE_PREFIX) @@ -35,3 +35,5 @@ SRC_IMAGE="${IMAGE_PREFIX}-sys-${VM_ID}-checkpoint" exec_and_log "$CLI dd iimg=$SRC_IMAGE of=$FILE" "Error exporting checkpoint into from $SRC_IMAGE to $FILE" exec_and_log "$CLI rm $SRC_IMAGE" "Error removing checkpoint $SRC_IMAGE" + +"$DRIVER_PATH"/restore $@ diff --git a/opennebula/remotes/vmm/kvm/save.vitastor b/opennebula/remotes/vmm/kvm/save.vitastor index 36c308e3..981dc31c 100755 --- a/opennebula/remotes/vmm/kvm/save.vitastor +++ b/opennebula/remotes/vmm/kvm/save.vitastor @@ -14,13 +14,16 @@ FILE=$2 VM_ID=$4 DS_ID=$5 +rm -f "$FILE" +"$DRIVER_PATH"/save $@ + XPATH="${DRIVER_PATH}/../../datastore/xpath.rb --stdin" unset i j XPATH_ELEMENTS while IFS= read -r -d '' element; do XPATH_ELEMENTS[i++]="$element" -done < <($XPATH \ +done < <(cat | $XPATH \ /VMM_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/VITASTOR_CONF \ /VMM_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/IMAGE_PREFIX \ /VMM_DRIVER_ACTION_DATA/DATASTORE/TEMPLATE/POOL_NAME) @@ -39,7 +42,7 @@ fi DST_IMAGE="${IMAGE_PREFIX}-sys-${VM_ID}-checkpoint" -exec_and_log "$CLI dd if=$FILE oimg=$DST_IMAGE" "Error importing checkpoint into $DST_IMAGE" +exec_and_log "$CLI dd if=$FILE oimg=$DST_IMAGE conv=trunc" "Error importing checkpoint into $DST_IMAGE" exec_and_log "$RM -f $FILE" "Error removing checkpoint ($FILE)" exit 0