Przed klonowaniem upewnij się, że obraz źródłowy zawiera wszystko, co jest potrzebne do przyszłych klonów. Jeśli właśnie zainstalowałeś system operacyjny, zastanów się, czy nie warto zainstalować dodatkowych narzędzi, takich jak mc, nano, traceroute, skonfigurować sieci, hostname, motd dla SSH, iptables itp. Sprawdź działanie sieci, zainstaluj najnowsze aktualizacje. A może warto też skonfigurować httpd i serwer pocztowy? Upewnij się, że oryginalny obraz do sklonowania nie wzbudza podejrzeń i działa stabilnie. Gotowi? Do dzieła!
Sprawdźmy listę maszyn wirtualnych:
# virsh list --all Id Name State ---------------------------------------------------- 4 vm1 running
Stworzymy kopię vm1 i nazwiemy ją vm2.
Najpierw zatrzymamy oryginał:
# virsh suspend vm1
lub go wyłączymy:
# virsh shutdown vm1
Następnie proponuję rozważyć dwa warianty:
1. Wariant: narzędzie 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.
Ponieważ polecenie zostało wykonane jako root, virt-clone utworzył klon dysku vm1.img o nazwie vm2.img z właścicielem root:root, a nie qemu:qemu. Nie ma to wpływu na prędkość. Ważne jest, aby upewnić się, że dysk został utworzony:
# 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
Podczas uruchamiania vm2 możesz zobaczyć taki komunikat:
# 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
Zwróć uwagę na domain-vm1 w tekście błędu. Popraw to (znajdź domain-vm1 i zamień na domain-vm2):
# virsh edit vm2 Domain vm2 XML configuration edited.
# virsh start vm2
Domain vm2 started
2. Wariant (ręcznie)
Ponieważ vm2 już istnieje, stwórzmy vm3 i porównajmy wyniki.
Wyłączamy oryginał:
# virsh shutdown vm1
Kopiujemy dysk:
# cp /data/vms/{vm1,vm3}.img
Tworzymy dump xml od vm1:
# virsh dumpxml vm1 > /tmp/vm3-template.xml
Usuwamy UUID oryginału, libvirt doda nowe wartości:
# sed -i /uuid/d /tmp/vm3-template.xml # sed -i '/mac address/d' /tmp/vm3-template.xml
Zmieniamy nazwy ze starej na nową:
# sed -i s/vm1/vm3/ /tmp/vm3-template.xml
Tworzymy nową vm3:
# virsh define /tmp/vm3-template.xml # virsh start vm1 # virsh start vm3
Ten wariant podpatrzyłem tutaj: http://unix.stackexchange.com/questions/8351/
Analiza wyników
Różnicę, którą zauważyłem, stanowi to, że w pierwszym przypadku rozmiar dysku vm2 znacznie różnił się od rozmiaru 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
Wydaje się, że virt-clone podczas tworzenia klonu kopiuje tylko faktycznie zajęte przez masę wirtualną miejsce. Rozmiar vm2.img jest tylko nieznacznie większy niż wyniki polecenia "df -h" wykonanego w vm1, vm2 lub vm3 (ponieważ między klonowaniami nie wykonywałem żadnych operacji na gościach, ich rozmiar nie zmienił się względem "rodzica" vm1).
Ogólnie rzecz biorąc, gdy po raz pierwszy spotykasz się z czymś nowym, staraj się analizować zmiany po każdym kroku. Wykonałeś "sed -i /uuid/d /tmp/vm3-template.xml" – sprawdź. Porównaj z oryginałem. Następnie sklonuj vm2, dla pewności sprawdź katalog, w którym przechowywane są dyski gości. Utworzono nową sieć – upewnij się, czy został utworzony plik konfiguracyjny sieci w /etc/libvirt/qemu/networks. I tak dalej.
Gdziekolwiek coś zobaczysz, staraj się wszystko, co Ci nieznane, sprawdzić przed wykonaniem w konsoli. Widziałeś w tym artykule przykład polecenia virt-clone, nie lenij się, zajrzyj do internetu i poszukaj, kto jeszcze tak proponuje, co pisze man.
Staraj się dokumentować, zapisywać, komentować wszystkie swoje działania, a wtedy otrzymasz własny how-to i będziesz go używać, gdy za rok będziesz musiał stworzyć jeszcze kilka gości. Jeśli nie tworzysz regularnie maszyn wirtualnych, to normalne, że zapomnisz składnię, a historia może zostać wyczyszczona lub wypełniona tak dużą ilością różnych poleceń, a nawet z literówkami, że będziesz musiał znów wszystko analizować od nowa.
# virsh list --all Id Name State ---------------------------------------------------- 7 vm2 running 9 vm1 running 10 vm3 running
