главная - Статьи - Виртуализация
Клонирование виртуальных машин KVM
Дата обновления: 31.03.2020Теги: Виртуальные машины Linux kvm
Перед клонированием убедитесь, что исходник содержит все необходимое для будущих клонов. Если вы только что установили операционную систему, подумайте, возможно имеет смысл доустановить mc, nano, traceroute, настроить сети, hostname, motd для ssh, iptables и др. Проверьте работу сети, установите последние обновления. А может быть, и httpd с почтовым сервером настройте. Убедитесь, что оригинал для клонирования не вызывает подозрений и работает стабильно. Готовы? Поехали!
Смотрим список виртуальных машин:
# virsh list --all Id Name State ---------------------------------------------------- 4 vm1 running
Создадим копию vm1 и назовем ее vm2.
Для начала остановим оригинал:
# virsh suspend vm1
или выключим его:
# virsh shutdown vm1
Дальше предлагаю рассмотреть два варианта:
1-й вариант: утилита virt-clone:
# virt-clone -o vm1 -n vm2 -f /data/vms/vm2.img --connect=qemu:///system
WARNING Setting the graphics device port to autoport, in order to avoid conflicting.
Allocating 'vm2.img' | 20 GB 00:00:06
Clone 'vm2' created successfully.
Т.к. команду мы выполняли от root, то virt-clone создала клон диска vm1.img с именем vm2.img с владельцем root:root, а не qemu:qemu. На скорость не влияет. Главное, убедиться, что диск создан:
# ls -al /data/vms/
total 3104656
drwxr-xr-x. 2 root root 4096 Apr 27 06:17 .
drwxr-xr-x. 5 root root 4096 Apr 19 17:45 ..
-rw-r--r--. 1 qemu qemu 21478375424 Apr 27 06:17 vm1.img
-rw-r--r--. 1 root root 1587609600 Apr 27 06:17 vm2.img
При запуске vm2 можете увидеть такое сообщение:
# virsh start vm2
error: Failed to start domain vm2
error: internal error: process exited while connecting to monitor: 2016-04-27T10:19:21.991952Z qemu-kvm: -chardev socket,id=charchannel0, path=/var/lib/libvirt/qemu/channel/target/domain-vm1/org.qemu.guest_agent.0,server,nowait: Failed to bind socket: Permission denied 2016-04-27T10:19:21.992122Z qemu-kvm: -chardev socket,id=charchannel0,path=/var/lib/libvirt/qemu/channel/target/domain-vm1/org.qemu.guest_agent.0, server,nowait: chardev: opening backend "socket" failed
Обратите внимание на domain-vm1 в тексте ошибки. Исправляем это (ищем domain-vm1 и заменяем на domain-vm2):
# virsh edit vm2
Domain vm2 XML configuration edited.
# virsh start vm2
Domain vm2 started
2-й вариант (ручками)
Т.к. vm2 уже есть, создадим vm3 и сравним результаты.
Выключаем оригинал:
# virsh shutdown vm1
Копируем диск:
# cp /data/vms/{vm1,vm3}.img
Делаем дамп xml от vm1:
# virsh dumpxml vm1 > /tmp/vm3-template.xml
Удаляем UUID оригинала, libvirt добавит новые значения:
# sed -i /uuid/d /tmp/vm3-template.xml
# sed -i '/mac address/d' /tmp/vm3-template.xml
Переименовываем имена со старого на новое:
# sed -i s/vm1/vm3/ /tmp/vm3-template.xml
Создаем новую vm3:
# virsh define /tmp/vm3-template.xml
# virsh start vm1
# virsh start vm3
Этот вариант я подсмотрел здесь: http://unix.stackexchange.com/questions/8351/
Разбор полетов
В чем я увидел отличия, так это в том, что в первом случае размер диска vm2 сильно отличался от размера vm3:
# ls -al --block-size=M /data/vms/
total 4550M
drwxr-xr-x. 2 root root 1M Apr 27 06:44 .
drwxr-xr-x. 5 root root 1M Apr 19 17:45 ..
-rw-r--r--. 1 qemu qemu 20484M Apr 27 07:00 vm1.img
-rw-r--r--. 1 qemu qemu 1515M Apr 27 07:00 vm2.img
-rw-r--r--. 1 qemu qemu 20484M Apr 27 06:59 vm3.img
Судя по всему, virt-clone при создании клона копирует только реально занятое виртуальной машиной место. Размер vm2.img лишь чуть-чуть больше, чем показания "df -h", выполненной в vm1, vm2 или vm3 (т.к. между клонированиями я ничего с гостями не делал, то и размер их не менялся относительно "предка" vm1).
Вообще, когда вы с чем-то сталкиваетесь впервые, старайтесь анализировать изменения после каждого шага. Сделали "sed -i /uuid/d /tmp/vm3-template.xml" - посмотрели. Сравнили с оригиналом. Потом склонировали vm2, на всякий случай просмотрите директорию, где у вас хранятся диски гостей. Создали новую сеть - поинтересуйтесь, был ли создан файл настроек сети в /etc/libvirt/qemu/networks. Ну и в таком роде.
Где бы вы что-то ни увидели, старайтесь все, что вам незнакомо, проверять до выполнения в консоли. Увидели в этой статье пример команды virt-clone, не поленитесь, сходите в интернет и поищите, кто еще так предлагает, что пишет man.
Старайтесь все ваши действия документировать, записывать, комментировать и тогда вы получите свой собственный how-to и будете его использовать, когда надо будет через год создать еще парочку гостей. Если вы не создаете виртуальные машины регулярно, то будет нормально, если вы забудете синтаксис, а history может быть очищена или заполнена таким количеством всяких команд, да еще и с очепятками, что вам опять придется разбираться по-новой.
# virsh list --all Id Name State ---------------------------------------------------- 7 vm2 running 9 vm1 running 10 vm3 running
Удачи!
Авторизуйтесь для добавления комментариев!