Před klonováním se ujistěte, že zdrojový obraz obsahuje vše potřebné pro budoucí klony. Pokud jste právě nainstalovali operační systém, zvažte, zda nemá smysl doinstalovat mc, nano, traceroute, nakonfigurovat sítě, hostname, motd pro SSH, iptables atd. Otestujte funkčnost sítě, nainstalujte nejnovější aktualizace. Případně nakonfigurujte httpd a poštovní server. Ujistěte se, že originál určený ke klonování nevyvolává podezření a funguje stabilně. Jste připraveni? Pojďme na to!
Podívejme se na seznam virtuálních strojů:
# virsh list --all Id Name State ---------------------------------------------------- 4 vm1 running
Vytvoříme kopii vm1 a pojmenujeme ji vm2.
Nejprve zastavíme originál:
# virsh suspend vm1
nebo ho vypneme:
# virsh shutdown vm1
Dále doporučuji zvážit dvě možnosti:
1. možnost: utilita 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.
Pokud jsme příkaz spustili jako root, vytvořil virt-clone klon disku vm1.img s názvem vm2.img s vlastníkem root:root, nikoliv qemu:qemu. Nemá to vliv na rychlost. Důležité je ujistit se, že disk byl vytvořen:
# 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
Při spuštění vm2 můžete vidět takovou zprávu:
# 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
Všimněte si domain-vm1 v textu chyby. Opravíme to (najdeme domain-vm1 a nahradíme za domain-vm2):
# virsh edit vm2 Domain vm2 XML configuration edited.
# virsh start vm2
Domain vm2 started
2. možnost (ručně)
Pokud již vm2 existuje, vytvoříme vm3 a porovnáme výsledky.
Vypneme originál:
# virsh shutdown vm1
Zkopírujeme disk:
# cp /data/vms/{vm1,vm3}.img
Vytvoříme dump xml od vm1:
# virsh dumpxml vm1 > /tmp/vm3-template.xml
Odstraníme UUID originálu, libvirt přidá nové hodnoty:
# sed -i /uuid/d /tmp/vm3-template.xml # sed -i '/mac address/d' /tmp/vm3-template.xml
Přejmenujeme jména ze starého na nové:
# sed -i s/vm1/vm3/ /tmp/vm3-template.xml
Vytvoříme nový vm3:
# virsh define /tmp/vm3-template.xml # virsh start vm1 # virsh start vm3
Tuto možnost jsem viděl zde: http://unix.stackexchange.com/questions/8351/
Rozbor výsledků
Rozdíl, který jsem viděl, spočíval v tom, že v prvním případě se velikost disku vm2 výrazně lišila od velikosti vm3:
# ls -al --block-size=M /data/vms/ celkem 4550M drwxr-xr-x. 2 root root 1M dub 27 06:44 . drwxr-xr-x. 5 root root 1M dub 19 17:45 .. -rw-r--r--. 1 qemu qemu 20484M dub 27 07:00 vm1.img -rw-r--r--. 1 qemu qemu 1515M dub 27 07:00 vm2.img -rw-r--r--. 1 qemu qemu 20484M dub 27 06:59 vm3.img
Zdá se, že virt-clone při vytváření klony kopíruje pouze skutečně obsazené místo virtuálním strojem. Velikost souboru vm2.img je jen o něco větší než výstup příkazu „df -h“ spuštěného uvnitř vm1, vm2 nebo vm3 (protože jsem mezi klony s hosty nic nedělal, jejich velikost se vůči „rodiči“ vm1 nezměnila).
Obecně platí, že když se s něčím setkáte poprvé, snažte se analyzovat změny po každém kroku. Spustili jste „sed -i /uuid/d /tmp/vm3-template.xml“ – podívejte se na výsledek. Porovnejte ho s originálem. Poté jste klonovali vm2, pro jistotu zkontrolujte adresář, kde máte uloženy disky hostů. Vytvořili jste novou síť – zajímejte se, zda byl vytvořen konfigurační soubor sítě v /etc/libvirt/qemu/networks. A podobně.
Kdekoliv uvidíte něco neobvyklého, snažte se vše, co vám není známé, ověřit v konzoli před jeho provedením. Uviděli jste v tomto článku příklad příkazu virt-clone, neváhejte a podívejte se na internet, kdo jiný to doporučuje, nebo si přečtěte manuálovou stránku (man).
Snažte se všechny své akce dokumentovat, zapisovat a komentovat, a získáte tak vlastní návod, který budete moci použít, až budete za rok potřebovat vytvořit další pár hostů. Pokud virtuální stroje nevytváříte pravidelně, je zcela normální, že si zapomenete syntaxi, a historie příkazů může být vyčištěna nebo zaplněna tolika různými příkazy, často s překlepy, že budete muset vše znovu prozkoumat.
# virsh list --all Id Name State ---------------------------------------------------- 7 vm2 running 9 vm1 running 10 vm3 running
