Сервер в кармане, или просто о сложном!

главная - Статьи - Виртуализация



Клонирование виртуальных машин 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

Удачи!



Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?