Instalacja KVM
Wreszcie przystępujemy do instalacji wirtualizacji KVM, emulatora QEMU oraz towarzyszących narzędzi.
Instalujemy niezbędne pakiety:
# yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install # systemctl enable libvirtd && systemctl start libvirtd
Obrazy maszyn wirtualnych będziemy przechowywać w nowym katalogu /vms
# mkdir /vms
Dodajemy odpowiedni kontekst dla naszego katalogu, aby SELinux nie zgłaszał zastrzeżeń:
# semanage fcontext --add -t virt_image_t '/vms(/.*)?'
Sprawdzamy:
# semanage fcontext -l | grep virt_image_t /var/lib/imagefactory/images(/.*)? all files system_u:object_r:virt_image_t:s0 /var/lib/libvirt/images(/.*)? all files system_u:object_r:virt_image_t:s0 /vms(/.*)? all files system_u:object_r:virt_image_t:s0
Zastosujemy zmiany:
# restorecon -R -v /vms
i sprawdzamy, czy zostały one zastosowane:
# ls -aZ /vms drwxr-xr-x. root root unconfined_u:object_r:virt_image_t:s0 . dr-xr-xr-x. root root system_u:object_r:root_t:s0 ..
OK, pobieramy z sieci obraz iso systemu operacyjnego, który zostanie zainstalowany na maszynie wirtualnej, na przykład CentOS 7 minimal dla przyszłego serwera WWW? A może Tails? Kto wie :)
Tworzymy pierwszą maszynę wirtualną
Powyższe czynności tworzą na hoście interfejs sieciowy virbr0 o adresie IP 192.168.122.1:
# ip addr
Tworzona jest również domyślna sieć wirtualna:
# virsh net-list Name State Autostart Persistent ---------------------------------------------------------- default active yes yes
Sieć można edytować:
# virsh net-edit default <network> <name>default</name> <uuid>745f121b-3c89-1281-a19a-aa62808c4241</uuid> <forward mode="nat"> <bridge delay="0" name="virbr0" stp="on"> <mac address="16:18:00:21:8c:15"> <ip address="192.168.122.1" netmask="255.255.255.0"> <dhcp> <range end="192.168.122.254" start="192.168.122.2"> </range></dhcp> </ip> </mac></bridge></forward></network>
Na razie nie będziemy nic zmieniać i utworzymy maszynę wirtualną podłączoną do sieci default:
# virt-install --network network=default --name vm1 --ram=2048 --vcpus=1 --disk path=/vms/vm1.img,size=30,format=qcow2 --graphics vnc,password=vm1password --cdrom /vms-iso/CentOS-7-x86_64-Minimal-1503-01.iso --boot cdrom,hd,menu=on
Opis opcji:
--graphics vnc,password=vm1password
Tutaj podajemy hasło oraz możliwość podłączenia się do terminala maszyny wirtualnej przez VNC. Hasło może pojawić się w logach, więc nie wpisujcie tutaj niczego ważnego.
--network network=default - podłączamy naszą maszynę wirtualną do sieci wirtualnej o nazwie default (z którą już się zapoznaliśmy).
Można też użyć --network bridge:br0, na przykład jeśli utworzylibyśmy most o nazwie br0 dla wariantu numer 2.
Powyższe polecenie można wpisać od razu, jedną linią, zależnie od preferencji:
virt-install --network network=default --name vm1 --ram=2048 --vcpus=1 --disk path=/vms/vm1.img,size=30,format=qcow2 --graphics vnc,password=vm1password --cdrom /vms-iso/CentOS-7-x86_64-Minimal-1503-01.iso --boot cdrom,hd,menu=on
Po wykonaniu polecenia możesz zobaczyć komunikat:
WARNING Unable to connect to graphical console: virt-viewer not installed. Please install the 'virt-viewer' package. WARNING No console to launch for the guest, defaulting to --wait -1
Nam to nie przeszkadza, ponieważ nasz host maszyn wirtualnych i tak nie posiada menedżera okien. W każdym razie u mnie tak jest.
Starting install...
Allocating 'vm1.img'
| 30 GB 00:00:00
Creating domain...
| 0 B 00:00:00
Domain installation still in progress. Waiting for installation to complete.
Odważnie czekamy. Proces ten zajmie jakiś czas.
Po zakończeniu polecenia wyświetlimy listę maszyn wirtualnych:
# virsh list Id Name State ---------------------------------------------------- 2 vm1 running
Maszyny wirtualne można uruchamiać (virsh start vm1), wstrzymywać (virsh suspend vm1), wznowić (virsh resume vm1), wyłączać (virsh shutdown vm1) i wiele innych rzeczy z nimi robić. Zatem maszyna vm1 jest uruchomiona (można to sprawdzić poleceniem virsh domstate vm1). Jak do niej się podłączyć?
Podłączanie się do maszyny wirtualnej przez VNC
Na poprzednim etapie utworzyłeś maszynę wirtualną, wskazując jej napęd CD-ROM z systemem operacyjnym. Co dalej? Jak planujesz zainstalować i skonfigurować system operacyjny? Istnieją różne opcje. Można przygotować infrastrukturę i wdrażać gotowe obrazy itp. Jednak my uczymy się i nie mamy niczego poza świeżo pobranym z internetu plikiem obrazu ISO. W rzeczywistości nie jest to skomplikowane. Na poprzednim kroku określiliśmy parametr "--graphics vnc,password=vm1password". Oznacza to, że możemy połączyć się z terminalem (czyli ekranem) maszyny wirtualnej za pomocą protokołu VNC, na przykład programem TightVNC, podając adres IP hosta maszyn wirtualnych oraz port połączenia.
Naszej maszynie wirtualnej został przydzielony port VNC. Po połączeniu z tym portem zobaczysz "ekran" maszyny wirtualnej. Aby sprawdzić, jaki port został przydzielony konkretnej maszynie vm1, wykonaj polecenie:
# virsh vncdisplay vm1 127.0.0.1:0
Oznacza to, że port VNC to 5900+0=5900. Gdyby wynikiem było "127.0.0.1:1", port VNC wynosiłby 5901. I tak dalej.
Do portu 5900 należy łączyć się z hostem maszyn wirtualnych. To na nim otwarty jest ten port, a nie na maszynie wirtualnej vm1.
Domyślnie host maszyn wirtualnych (u nas jest to CentOS 7 minimal) nie powinien pozwalać na połączenia z żadnym portem oprócz SSH (22/tcp). Nie zalecam otwierania dostępu do portów VNC z zewnątrz. Jest to niebezpieczne. Aby uzyskać dostęp do ekranu maszyny wirtualnej z komputera z systemem Windows, na którym wszystko konfiguruję, utworzyłem tunelowanie portu w programie PuTTY: 5900 -> 127.0.0.1:5900.

Po pomyślnym zalogowaniu się przez SSH można uruchomić TightVNC i wskazać port 127.0.0.1::5900 (zwróć uwagę na podwójne dwukropki).
Jeśli po ponownym uruchomieniu maszyny będzie konieczne ponowne podłączenie obrazu ISO, można to zrobić za pomocą polecenia:
# virsh attach-disk vm1 /vms-iso/CentOS-7-x86_64-Minimal-1503-01.iso hdb --type cdrom --mode readonly
gdzie hdb to nazwa urządzenia blokowego CD-ROM. Nazwę tę można sprawdzić, przeglądając konfigurację maszyny wirtualnej (virsh edit vm1).
Zarządzanie maszynami wirtualnymi z hosta można realizować za pomocą zestawu poleceń konsolowych virsh. Niektórymi poleceniami już się zapoznałeś. Wpisz w konsoli:
# virsh help
a zobaczysz, ile wszystkich czynności można wykonać.
Włączanie/wyłączanie maszyn wirtualnych
Jeśli utworzysz maszynę wirtualną i spróbujesz ją wyłączyć, mimo komunikatu o pomyślnym wykonaniu, maszyna może nie zostać wyłączona:
# virsh domstate vm1 running # virsh shutdown vm1 Domain vm1 is being shutdown # virsh domstate vm1 running
Problem dotyczy obsługi ACPI przez maszynę wirtualną. Nie zawsze maszyna wirtualna przetworzy sygnał wyłączenia lub ponownego uruchomienia (virsh shutdown/restart vm1). W tej sytuacji mogą wystąpić następujące opcje:
Odłączenie zasilania (tzw. "pulling the plug"):
# virsh destroy vm1 Domain vm1 destroyed
Świadomie rozumiesz, do czego może to doprowadzić. Choć na początkowym etapie, przed instalacją systemu operacyjnego, pojawienie się błędów
Zawieszenie działania maszyny wirtualnej:
virsh suspend vm1
Nie zawsze konieczne jest zewnętrzne wyłączanie lub restartowanie maszyny. Do celów konserwacyjnych może wystarczyć zawieszenie działania. Nie jest to regułą, ale warto rozważyć.
Włączenie obsługi ACPI w maszynie wirtualnej.
Istnieją różne metody, na przykład takie (wykonaj wewnątrz maszyny wirtualnej, a nie na hoście):
yum install acpid chkconfig acpid on service acpid start
Automatyczne uruchamianie maszyn wirtualnych
Aby maszyna wirtualna vm1 uruchamiała się automatycznie po ponownym uruchomieniu hosta:
# virsh autostart vm1 Domain vm1 marked as autostarted
Wyłącz autostart dla vm1:
# virsh autostart vm1 --disable Domain vm1 unmarked as autostarted
Kontrola aktywności sieciowej maszyny wirtualnej KVM
Może być przydatne ocenianie aktywności sieciowej maszyny wirtualnej – na przykład ile ruchu zużyła. Może to również pomóc podczas debugowania sieci lub wyszukiwania wycieków ruchu. Na przykład:
# virsh domifstat vm1 vnet0 vnet0 rx_bytes 3063962 vnet0 rx_packets 3412 vnet0 rx_errs 0 vnet0 rx_drop 0 vnet0 tx_bytes 591996 vnet0 tx_packets 1731 vnet0 tx_errs 0 vnet0 tx_drop 0
Tutaj wszystko jest jasne, z wyjątkiem tego, skąd wziąć nazwę adaptera vnet0. Można znaleźć sekcję network w zrzucie konfiguracji maszyny wirtualnej (virsh dumpxml vm1) i w niej parametr dev:
<interface type='network'> <mac address='52:54:00:98:6c:e6'/> <source network='default' bridge='virbr0'/> <target dev='vnet0'/> <model type='rtl8139'/> <alias name='net0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
Podłączanie i odłączanie napędu CD-ROM
Podłącz obraz ISO do vm3 jako napęd CD-ROM:
# virsh attach-disk vm3 /data/vms-iso/CentOS-7-x86_64-Minimal-1511.iso hda --type cdrom --mode readonly Disk attached successfully
Tu należy być ostrożnym, ponieważ po ścieżce do pliku ISO na hoście następuje wskazanie nazwy urządzenia CD-ROM maszyny wirtualnej vm3. Jeśli nie jesteś pewien, jaką nazwę urządzenia należy podać (hda, hdb lub inną), sprawdź konfigurację maszyny wirtualnej:
# virsh edit vm3
Odłącz obraz ISO (nie usuwaj urządzenia z gościa, ale po prostu „wyjmij płytę CD z napędu”):
# virsh attach-disk vm5 "" hda --type cdrom --mode readonly
