KVM – прямые внешние снимки и соответствующие имена дисков

Если я хочу сделать внешний снимок для гостевого гостя KVM, я бы выполнил команду, как показано ниже:

# create the directory for the snapshot data mkdir /vms/$DOMAIN/snapshots/$SNAPSHOT_NAME # create the snapshot virsh snapshot-create-as \ --domain $DOMAIN $SNAPSHOT_NAME \ --diskspec vda,file=/vms/$DOMAIN/snapshots/$SNAPSHOT_NAME/disk.qcow2,snapshot=external \ --memspec file=/vms/$DOMAIN/snapshots/$SNAPSHOT_NAME/mem,snapshot=external \ --atomic 

Если моя VM была вызвана vm1 и мой снимок был вызван base-installation для моментального снимка сразу после новой установки, то у меня могла бы быть такая структура папок:

 / |- vms/ |- vm1/ |- disk.qcow2 |- snapshots/ |-base-installation/ |-disk.qcow2 |-mem 

Теперь эта структура – это то, что я хочу, чтобы она выглядела, но, к сожалению, файлы disk.qcow2 неправильны (нужно поменять местами). Файл disk.qcow2 в папке моментального снимка base-installation фактически представляет собой изображение наложенного диска, которое берет все будущие записи в виртуальную disk.qcow2 , а не является желаемым файлом резервного копирования только для чтения, представляющим состояние диска во время моментального снимка. Файл disk.qcow2 непосредственно в папке vm1 является файлом резервного vm1 только для чтения, а не последним изображением оверлейного диска.

Вопрос

Есть ли способ, которым я могу изменить команду virsh snapshot-create-as чтобы он сохранил файл резервной virsh snapshot-create-as только для чтения на указанном пути disk-spec и сохранил файл диска указателя наложения, где он уже есть? Альтернативно, существует ли обходной путь, например «приостановка» виртуальной машины, обмен файлами на диске, обновление определения xml гостя и возобновление работы виртуальной машины? В идеале я не хочу закрывать гостя или вызывать заметный период простоя.

  • Как создать виртуальную машину с нуля с помощью virsh?
  • Изменение файлов внутри моментального снимка (файл qemu img)
  • Использование virsh для управления виртуальными машинами, созданными в virt-manager
  • Разрешить посетителям KVM виртуальную сеть виртуального доступа виртуальной сети получать доступ к реальной внутренней сети
  • Как удалить virsh-пул без volumegroup?
  • Как преобразовать параметры qemu для гостевого пользователя osx для libvirtd
  • Можно ли использовать комментарии в файлах virsh / libvirt xml?
  • Virsh (libvirt-bin) не может связываться с сервером Xen
  • One Solution collect form web for “KVM – прямые внешние снимки и соответствующие имена дисков”

    Мне удалось найти временное решение, выполнив промежуточный «моментальный снимок» и блокпалл в этот снимок, прежде чем удалять это из метаданных и выполнять «реальный» моментальный снимок, в результате чего изображение наложения возвращается туда, где мы начали, и данные, находящиеся в папка моментальных снимков. Это немного хлопот, и, надеюсь, в будущем будет лучшее собственное решение, однако я подробно описал шаги ниже, если, как и я, вы просто не можете ждать.

    меры

    Сначала настройте свои настройки соответствующим образом:

     # Your settings may vary DOMAIN="guest1" SNAPSHOT_NAME="base-installation" VMS_DIR="/vms" 

    Теперь мы создаем каталог, в котором будут храниться данные моментальных снимков.

     mkdir -p $VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME 

    Теперь мы создаем наш промежуточный снимок, который создаст оверлейное изображение в каталоге моментальных снимков, который мы только что создали.

     virsh snapshot-create-as \ --domain $DOMAIN intermediary_snapshot \ --diskspec vda,file=$VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/disk.qcow2,snapshot=external \ --memspec file=$VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/mem,snapshot=external \ --atomic 

    Примечание. У меня был ping, работающий в виртуальной машине, и, похоже, он остановился только на секунду, когда эта команда запустилась.

    Теперь мы используем blockpull для перемещения данных из файла резервной копии в активное оверлейное изображение в каталоге моментальных снимков.

     virsh blockpull \ --domain $DOMAIN \ --path $VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/disk.qcow2 \ --wait \ --verbose 

    Примечание. Вы не должны --base аргумент --base для этой команды, иначе он ничего не сделает, потому что если вы укажете --base он заставит команду оставить указанную базу в качестве базового каталога и будет только сливать промежуточные слои (которые мы имеем ни один), а не базовый каталог.

    Предыдущая команда заняла у меня около 30 секунд, но в то время vm с радостью выполнял пинг.

    ls -alh показывает, что образ disk.qcow2 каталога disk.qcow2 снимка теперь имеет здоровый размер в размере 2,2 ГБ, но что более важно, qemu-img info disk.qcow2 показывает файл резервной qemu-img info disk.qcow2 , поэтому мы знаем, что все данные теперь находятся в каталоге моментальных снимков и это «автономный образ».

    Теперь мы очищаем метаданные, удаляя информацию об этом промежуточном шаге снимка.

     virsh snapshot-delete \ --domain $DOMAIN \ intermediary_snapshot \ --metadata 

    Теперь мы также удалим исходный файл резервной копии, который нам больше не нужен, а также файл промежуточных memspec, который мы никогда не будем использовать.

     rm $VMS_DIR/$DOMAIN/disk.qcow2 rm $VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/mem 

    На этом этапе я тестировал завершение работы, а затем вручную запускал экземпляр, чтобы проверить, что он был счастлив, и все работает.

    На этом этапе вы можете подумать о том, что закончили все «подготовку», теперь мы просто делаем снимок, но указываем, что изображение наложения попадает в каталог верхнего уровня $ DOMAIN, а файл memspec входит в папку моментальных снимков рядом с образами диска.

     virsh snapshot-create-as \ --domain $DOMAIN $SNAPSHOT_NAME \ --diskspec vda,file=$VMS_DIR/$DOMAIN/disk.qcow2,snapshot=external \ --memspec file=$VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/mem,snapshot=external \ --atomic 

    Это оно!

    Влияние на хранение

    Стоит отметить, что если вы хотите повторить описанные выше шаги, чтобы сделать много снимков, вы получите полностью восстанавливаемые снимки, которые не зависят от каких-либо других файлов в каждой папке моментальных снимков, но это будет тратить много места. Для последующих снимков вы, вероятно, захотите изменить команду blockpull с аргументом --base , чтобы каждый снимок использовал предыдущий моментальный снимок как --base изображение, а не объединять его.

    Восстановление моментального снимка

    Если вы выполните список снимков, вы увидите новый снимок. Однако вы не сможете выполнить команду virsh snapshot-revert поскольку virsh snapshot-revert внешних снимков пока не поддерживается (по крайней мере, не в Ubuntu 16.04, которое я использую), поэтому нам нужно сделать это вручную, уничтожив текущее активное оверлейное изображение. …

     rm $VMS_DIR/$DOMAIN/disk.qcow2 

    Затем создайте новое оверлейное изображение из базового образа моментального снимка, с которого мы хотим восстановить:

     qemu-img create \ -b $VMS_DIR/$DOMAIN/snapshots/$SNAPSHOT_NAME/disk.qcow2 \ -f qcow2 \ $VMS_DIR/$DOMAIN/disk.qcow2 

    Теперь вы можете просто запустить гостя.

     sudo virsh start $DOMAIN 

    Я еще не понял, как использовать файлы memspec, к сожалению, и это самая большая проблема, отсутствующая в этом ответе.

    Рекомендации

    Пытаясь все это понять, появилась отличная статья fedorapeople.org, в которой объясняется, как объединить внешние снимки, которые я нашел наиболее полезными.

    Linux и Unix - лучшая ОС в мире.