Перед клонуванням переконайтеся, що джерело містить усе необхідне для майбутніх клонів. Якщо ви щойно встановили операційну систему, подумайте, можливо, має сенс доустановити 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
