Jakiś czas temu postanowiłem wypiąć się na VMware (przyleci nowy kernel, i częto moduły do jądra nie chcą się kompilować) i przesiąść się na 100% open source. VirtualBox jakoś mi nie leży, poza tym Open Stack zaczął ostatnio dość mocno rządzić... Krótko mówiąc, wybór padł na KVM.
Owszem jest dość drewniany, nie jest tak wygodny jak VMware Player/Workstation czy choćby wspomniany VirtualBox, ale ma kilka unikalnych cech: Jest wmurowany w jądro, nie trzeba zatem nic rekompilować, integruje się z KSM co pozwala na solidny "overbooking" pamięci, jest elementem OpenStacka, ma command line i bez żadnego dodatkowego tańca deszczu, działa w trybie headless, czyli bez telewizora.
Czyż to nie jest zgrabne?:
sudo virsh start maszynka_wirtualna
Ale do rzeczy, ja dziś o klonowaniu, a konkretnie o jednym jego aspekcie: Linked clones. VMware pod tym względem nas mocno rozpieściło - ładny graficzny pająk pokazujący zależności pomiędzy migawkami, snapshoty, stan maszyny, a nie tylko dysków itd. W KVM tak nie ma. Linked clone dotyczy tylko dysków i w żadnym stopniu NIE CHRONI oryginału przed zmianami! Możliwy jest zatem następujący scenariusz:
Dlatego żeby uniknąć podobnej sytuacji, trzeba od razu podejśc do sprawy z pełną higieną, np.: oddzielna storage pula na "mastery", maszyny-szablony read-only, porządna dokumentacja itd. Można też dla bezpieczeństwa odłączyć obraz "master" od maszyny wirtualnej. Ale ja jak zwykle, na brudno:
Mam takie repozytoria:
$ sudo virsh pool-list --all
Nazwa Stan Automatyczne uruchamianie
-------------------------------------------
ajax nieaktywne tak
default aktywne tak
ISO aktywne tak
os nieaktywne tak
os-1 nieaktywne tak
removeable_seagate nieaktywne tak
vm aktywne tak
Repo "removeable_seagate" jest na zewnętrznym HDD. Pula "vm" jest na wewnętrznym SSD. Dla wygody kolejne polecenia będą wykonane w interaktywnym shellu virsh:
virsh # pool-start removeable_seagate
Uruchomiono pulę removeable_seagate
virsh # vol-list removeable_seagate
Nazwa Ścieżka
------------------------------------------------------------------------------
ARCUS.qcow2 /run/media/marcinek/Seagate_Enc/kvm/ARCUS.qcow2
CentOS7-Generic.qcow2 /run/media/marcinek/Seagate_Enc/kvm/CentOS7-Generic.qcow2
disk1.img /run/media/marcinek/Seagate_Enc/kvm/disk1.img
F24wrk.qcow2 /run/media/marcinek/Seagate_Enc
[ ... ]
Jak widać w puli removeable_seagate mam obraz o nazwie CentOS7-Generic.qcow2. To będzie mój master.
Do klonowania można użyć polecenia virsh: vol-clone ale z mojego punku widzenia ma dwie wady: klon powstaje w tej samej puli i albo utworzy pełną kopię, albo z opcją --prealloc-metadata powstanie plik rzadki (sparse), z którym niektóre programy, np do backupu, zachowując się dziwnie. dlatego użyję qemu-img. W shellu systemowym przechodzę to katalogu z pulą docelową i wołam klonowanie tak:
$ qemu-img create -f qcow2 \
-o backing_file=/run/media/marcinek/Seagate_Enc/kvm/CentOS7-Generic.qcow2 dns1.qcow2
Formatting 'dns1.qcow2', fmt=qcow2 size=34359738368 backing_file=/run/media/marcinek/Seagate_Enc/kvm/CentOS7-Generic.qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16
Poprawiam prawa dostępu:
$ ls -la dns1.qcow2
-rw-r--r--. 1 marcinek qemu 197120 03-18 12:56 dns1.qcow2
$ chmod g+rw dns1.qcow2
Jaki rozmiar ma moja nowa maszyna wirtualna ?
$ du -sm dns1.qcow2
1 dns1.qcow2
Teraz, np przy pomocy virtmanager'a tworzę maszynę wirtualną korzystającą z mojego sklonowanego dysku:
virsh # list
Identyfikator Nazwa Stan
----------------------------------------------------
1 dns1 uruchomiona
virsh # dumpxml 1
<domain type='kvm' id='1'>
<name>dns1</name>
<uuid>6a95c7c7-94df-4a77-997e-d36bb169b66d</uuid>
<title>DNS 1</title>
<description>Testowy dns do zabaway z dynamic update</description>
<memory unit='KiB'>1048576</memory>
[ ... ]
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/marcinek/vm/dns1.qcow2'/>
<backingStore type='file' index='1'>
<format type='raw'/>
<source file='/run/media/marcinek/Seagate_Enc/kvm/CentOS7-Generic.qcow2'/>
<backingStore/>
</backingStore>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</disk>
Po uruchomieniu i doinstalowaniu około 5MB pakietów, dysk-klon ma 21 MB.
Owszem jest dość drewniany, nie jest tak wygodny jak VMware Player/Workstation czy choćby wspomniany VirtualBox, ale ma kilka unikalnych cech: Jest wmurowany w jądro, nie trzeba zatem nic rekompilować, integruje się z KSM co pozwala na solidny "overbooking" pamięci, jest elementem OpenStacka, ma command line i bez żadnego dodatkowego tańca deszczu, działa w trybie headless, czyli bez telewizora.
Czyż to nie jest zgrabne?:
sudo virsh start maszynka_wirtualna
Ale do rzeczy, ja dziś o klonowaniu, a konkretnie o jednym jego aspekcie: Linked clones. VMware pod tym względem nas mocno rozpieściło - ładny graficzny pająk pokazujący zależności pomiędzy migawkami, snapshoty, stan maszyny, a nie tylko dysków itd. W KVM tak nie ma. Linked clone dotyczy tylko dysków i w żadnym stopniu NIE CHRONI oryginału przed zmianami! Możliwy jest zatem następujący scenariusz:
- Tworzymy maszynę master.
- Tworzymy połączonego z nią klona o nazwie clone.
- Uruchamiamy clone, coś na nim zmieniamy itd.
- Uruchamiamy master'a i coś nanim robimy.
- Clone szlag trafił.
Dlatego żeby uniknąć podobnej sytuacji, trzeba od razu podejśc do sprawy z pełną higieną, np.: oddzielna storage pula na "mastery", maszyny-szablony read-only, porządna dokumentacja itd. Można też dla bezpieczeństwa odłączyć obraz "master" od maszyny wirtualnej. Ale ja jak zwykle, na brudno:
Mam takie repozytoria:
$ sudo virsh pool-list --all
Nazwa Stan Automatyczne uruchamianie
-------------------------------------------
ajax nieaktywne tak
default aktywne tak
ISO aktywne tak
os nieaktywne tak
os-1 nieaktywne tak
removeable_seagate nieaktywne tak
vm aktywne tak
Repo "removeable_seagate" jest na zewnętrznym HDD. Pula "vm" jest na wewnętrznym SSD. Dla wygody kolejne polecenia będą wykonane w interaktywnym shellu virsh:
virsh # pool-start removeable_seagate
Uruchomiono pulę removeable_seagate
virsh # vol-list removeable_seagate
Nazwa Ścieżka
------------------------------------------------------------------------------
ARCUS.qcow2 /run/media/marcinek/Seagate_Enc/kvm/ARCUS.qcow2
CentOS7-Generic.qcow2 /run/media/marcinek/Seagate_Enc/kvm/CentOS7-Generic.qcow2
disk1.img /run/media/marcinek/Seagate_Enc/kvm/disk1.img
F24wrk.qcow2 /run/media/marcinek/Seagate_Enc
[ ... ]
Jak widać w puli removeable_seagate mam obraz o nazwie CentOS7-Generic.qcow2. To będzie mój master.
Do klonowania można użyć polecenia virsh: vol-clone ale z mojego punku widzenia ma dwie wady: klon powstaje w tej samej puli i albo utworzy pełną kopię, albo z opcją --prealloc-metadata powstanie plik rzadki (sparse), z którym niektóre programy, np do backupu, zachowując się dziwnie. dlatego użyję qemu-img. W shellu systemowym przechodzę to katalogu z pulą docelową i wołam klonowanie tak:
$ qemu-img create -f qcow2 \
-o backing_file=/run/media/marcinek/Seagate_Enc/kvm/CentOS7-Generic.qcow2 dns1.qcow2
Formatting 'dns1.qcow2', fmt=qcow2 size=34359738368 backing_file=/run/media/marcinek/Seagate_Enc/kvm/CentOS7-Generic.qcow2 cluster_size=65536 lazy_refcounts=off refcount_bits=16
Poprawiam prawa dostępu:
$ ls -la dns1.qcow2
-rw-r--r--. 1 marcinek qemu 197120 03-18 12:56 dns1.qcow2
$ chmod g+rw dns1.qcow2
Jaki rozmiar ma moja nowa maszyna wirtualna ?
$ du -sm dns1.qcow2
1 dns1.qcow2
Teraz, np przy pomocy virtmanager'a tworzę maszynę wirtualną korzystającą z mojego sklonowanego dysku:
virsh # list
Identyfikator Nazwa Stan
----------------------------------------------------
1 dns1 uruchomiona
virsh # dumpxml 1
<domain type='kvm' id='1'>
<name>dns1</name>
<uuid>6a95c7c7-94df-4a77-997e-d36bb169b66d</uuid>
<title>DNS 1</title>
<description>Testowy dns do zabaway z dynamic update</description>
<memory unit='KiB'>1048576</memory>
[ ... ]
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/home/marcinek/vm/dns1.qcow2'/>
<backingStore type='file' index='1'>
<format type='raw'/>
<source file='/run/media/marcinek/Seagate_Enc/kvm/CentOS7-Generic.qcow2'/>
<backingStore/>
</backingStore>
<target dev='vda' bus='virtio'/>
<alias name='virtio-disk0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</disk>
Po uruchomieniu i doinstalowaniu około 5MB pakietów, dysk-klon ma 21 MB.