Debian – wirtualizacja KVM Qemu

kvmbanner-logo3Przyszedł czas na zmianę domowego serwera na nowszy i przy okazji wprowadzenia kilku zmian. Przy okazji postanowiłem opisać coś niecoś o wirtualizacji KVM. Na starym serwerze bazowałem na OpenVZ/kontenerach z racji, że mój stary serwer nie ma sprzętowej obsługi wirtualizacji, a i ja sam nie miałem potrzeby używania pełnej wirtualizacji. Teraz razem z nowym serwerem postanowiłem zmienić podejście i wykorzystać maszyny KVM oraz OpenVZ, ale o moim domowym serwerze kiedy indziej. Tutaj opiszę instalację oraz podstawową obsługę KVM-Qemu. Trochę czytania tutaj jest, ale to tak na dobrą sprawę tylko ułamek wiedzy na temat wirtualizacji przy użyciu kvm-qemu (całość tego opisu testowałem w Debianie 8.3).

 

Instalacja
Wszystkie operacje wykonujemy jako root lub z sudo. Najpierw sprawdzamy czy mamy sprzętowe wsparcie wirtualizacji:

egrep '(vmx|svm)' --color=always /proc/cpuinfo

Jeśli nie ma vmx lub svm to niestety nie mamy sprzętowego wsparcia KVM (można też sprawdzić czy w BIOS jest włączone wsparcie wirtualizacji jeśli procesor takie posiada).
 
Najpierw standardowo aktualizacja repozytorium:

apt-get update

 
Przechodzimy do instalacji kvm, qemu-kvm i narzędzi do zarządzania i tworzenia wirtualnych maszyn

apt-get install kvm qemu-kvm libvirt-bin virtinst -y

 
Następnie dodajemy aktualnego użytkownika do grupy libvirt oraz kvm (komenda sama pobiera nazzwę zalogowanego usera):

adduser `id -un` libvirt
adduser `id -un` kvm

Można też dodać każdego innego użytkownika:

adduser nazwa_użytkownika libvirt
adduser nazwa_użytkownika kvm

 
Następnie możemy sprawdzić aktualną listę wirtualnych maszyn komendą:

virsh -c qemu:///system list

lub

virsh list --all

 
Powinna się wyświetlić pusta lista:

 Id    Name                           State
----------------------------------------------------

 
Następnym krokiem jest instalacja narzędzi do tworzenia mostków (bridge) aby wirtualne maszyny miały dostęp do sieci:

apt-get install bridge-utils -y

 
Po instalacji przechodzimy do konfiguracji sieci:

nano /etc/network/interfaces

Ja używam edytora nano do edycji pliku.
 
Ustawiamy sieć jak poniżej. Adresy IP każdy musi wpisać swoje. U mnie to wygląda tak:

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.0.10
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        dns-nameservers 208.67.222.222 8.8.8.8        
        bridge_ports eth0
        bridge_fd 9
        bridge_hello 2
        bridge_maxage 12
        bridge_stp off

Krótkie wyjaśnienie:
address – adres naszego serwera hosta
network – podsieć do jakiej należy
netmask – maska podsieci
gateway – brama naszej sieci (IP routera głównego / z Internetem zazwyczaj)
dns-nameservers – serwery DNS
bridge_ports – ustawienie interfejsu sieciowego do mostka (w moim przypadku to jest eth0, ale może to być eth1, eth2. Należy wcześniej sprawdzić jakie mamy karty sieciowe. Karty/interfejsy sieciowe sprawdzamy komendą ifconfig).
 
Ustawienie DNS dla naszego serwera wpisaliśmy w konfiguracji mostka, ale można to zrobić w pliku /etc/resolv.conf

nano /etc/resolv.conf

Zawartość pliku możemy ustawić jak poniżej:

nameserver 208.67.222.222
nameserver 8.8.8.8

Jest to adres do OpenDNS i DNS Google.
 
Po ustawieniu sieci restartujemy sieć:

/etc/init.d/networking restart

 
Wpisujemy komendę:

ifconfig

Powinniśmy zobaczyć listę interfejsów sieciowych podobną jak poniżej:

br0       Link encap:Ethernet  HWaddr d1:00:39:47:e8:5f
          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe90::d210:99ef:fe97:c84f/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:83 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:10687 (10.4 KiB)  TX bytes:648 (648.0 B)

eth0      Link encap:Ethernet  HWaddr d1:00:39:47:e8:5f
          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:38689 errors:0 dropped:0 overruns:0 frame:0
          TX packets:22053 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:53887876 (51.3 MiB)  TX bytes:1989025 (1.8 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

 
Dla pewności możemy wykonać restart serwera i po restarcie sprawdzić czy wszystko jest ok.

reboot

Po restarcie możemy wykonać ping żeby sprawdzić czy na pewno działa ustawienie sieci i połączenie z Internetem:

ping google.pl

powinniśmy zobaczyć:

PING google.pl (216.58.209.35) 56(84) bytes of data.
64 bytes from waw02s05-in-f35.1e100.net (216.58.209.35): icmp_seq=1 ttl=58 time=11.2 ms
64 bytes from waw02s05-in-f35.1e100.net (216.58.209.35): icmp_seq=2 ttl=58 time=14.4 ms
64 bytes from waw02s05-in-f35.1e100.net (216.58.209.35): icmp_seq=3 ttl=58 time=30.5 ms
64 bytes from waw02s05-in-f35.1e100.net (216.58.209.35): icmp_seq=4 ttl=58 time=33.9 ms
64 bytes from waw02s05-in-f35.1e100.net (216.58.209.35): icmp_seq=5 ttl=58 time=9.96 ms
64 bytes from waw02s05-in-f35.1e100.net (216.58.209.35): icmp_seq=6 ttl=58 time=39.5 ms
64 bytes from waw02s05-in-f35.1e100.net (216.58.209.35): icmp_seq=7 ttl=58 time=18.5 ms
--- google.pl ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6007ms
rtt min/avg/max/mdev = 9.966/22.606/39.578/11.017 ms

Działanie ping przerywamy wciskając CTRL+C.
 
Żeby łączyć się przy użyciu np. graficznego virt-managera należy zainstalować virt-managera na serwerze:

apt-get install virt-manager

Co do instalacji Virt-Managera klienta w np. Ubuntu odsyłam do howtoforge, bo sam z tego nie korzystam: Virt-manager on Ubuntu

 

Katalogi i tworzenie wirtualnej maszyny
Opiszę sposób w jaki tworzę wirtualne maszyny i przygotowuję całe środowisko. Domyślnie po instalacji narzędzi do wirtualizacji jest tworzony katalog /var/lib/libvirt gdzie jest cała struktura do przechowywania tego co związane z naszymi wirtualnymi maszynami, a także /etc/libvirt gdzie są przechowywane ustawienia wirtualnych maszyn. Tymi katalogami zajmiemy się za chwilę. Zazwyczaj najpierw tworzę dysk przy użyciu qemu-img i wtedy dopiero wirtualną maszynę, której wskazuję dany utworzony dysk.
Na początek aby był porządek utworzę użytkownika „vms” do przechowywania obrazów iso, dysków oraz wszystkiego co związane w wirtualnymi maszynami.

adduser vms

Zostaniemy poproszeni o hasło więc wpisujemy swoje hasło dostępu dla tego użytkownika. Dodajemy użytkownika vms do grupy libvirt i kvm:

adduser vms libvirt
adduser vms kvm

 
Przenosimy katalog /var/lib/libvirt do /home/vms:

mv /var/lib/libvirt /home/vms/libvirt

Następnie robimy dowiązanie symboliczne do przeniesionego katalogu:

ln -s /home/vms/libvirt /var/lib/libvirt

 
Robimy to samo dla katalogu /etc/libvirt czyli przenosimy:

mv /etc/libvirt /home/vms/libvirt-etc

Tworzymy dowiązanie:

ln -s /home/vms/libvirt-etc /etc/libvirt

 
W katalogu /etc/libvirt są przechowywane ustawienia wirtualnych maszyn. Teraz to wszystko będzie fizycznie przechowywane w katalogu /home/vms/libvirt-etc, a w miejscu domyślnym (/etc/libvirt) jest dowiązanie symboliczne.
 
Dlaczego tak? Ponieważ u mnie /home jest na osobnej partycji, która jest większa to jedna rzecz, a druga, że łatwiej będzie robić backup, operować tym wszystkim itp. jak będzie w jednym miejscu na użytkowniku/w katalogu vms. Dyski w RAID-1 na serwerze to jedno, ale backupy różnych ustawień i konfiguracji to druga sprawa, a ja nie lubię szukać wszystkiego po cały systemie. Każdy robi jak uważa, ale dla mnie tak jest wygodniej. Dla bezpieczeństwa nie zmieniam właściciela i uprawnień struktury katalogów libvirt. Czyli żeby tam wykonywać operacje, zmiany trzeba mieć uprawnienia root.
 
Teraz przechodzimy do tworzenia dysku dla naszej wirtualnej maszyny. Utworzymy przykładową wirtualną maszynę. U siebie korzystam w swoich maszynach z formatu qcow2 i w takim formacie utworzymy dysk:

qemu-img create -f qcow2 /home/vms/libvirt/images/hdd1.qcow2 10G

Komenda utworzy nam dysk dynamiczny w formacie qcow2 w katalogu /home/vms/libvirt/images o nazwie hdd1.qcow2 i max wielkości 10GB.
 
Następnie tworzymy katalog na obrazy ISO:

mkdir /home/vms/iso

Wchodzimy do katalogu iso i ściągamy obraz już archiwalnego wydania Debian Squeeze 7.9 (lub co kto tam chce):

cd /home/vms/iso/ && wget http://cdimage.debian.org/mirror/cdimage/archive/7.9.0/i386/iso-cd/debian-7.9.0-i386-netinst.iso

Ta komenda wejdzie do katalogu /home/vms/iso i rozpocznie tam ściąganie obrazu iso Debiana Squeeze 7.9.
 
Gdy już obraz się ściągnie przechodzimy do utworzenia wirtualnej maszyny. Do tego celu wykorzystamy narzędzie virt-install (więcej pomocy na temat tego narzędzia można uzyskać wpisując man virt-install). W tym celu wpisujemy komendę:

virt-install --name vmaszyna01 --ram 512 --cdrom=/home/vms/iso/debian-7.9.0-i386-netinst.iso --disk path=/home/vms/libvirt/images/hdd1.qcow2,size=10,format=qcow2 --network=bridge:br0 --graphics vnc,listen=0.0.0.0,port=50000 --noautoconsole --os-type linux --virt-type=kvm --vcpus=2 --accelerate --hvm --os-variant debiansqueeze

Krótkie wyjaśnienie najważniejszych elementów:
–name – nazwa wirtualnej maszyny
–ram – ilość przydzielonego RAM w MB
–cdrom – wskazuje miejsce obrazu ISO, z którego ma skorzystać wirtualna maszyna przy pierwszym uruchomieniu
–disk – wskazuje miejsce, nazwę, rozmiar, format wirtualnego dysku
–network – wskazuje typ/urządzenie sieciowe dla wirtualnej maszyny (w tym przypadku jest to utworzony wcześniej mostek br0)
–graphics – określa dostęp przez pulpit zdalny czyli VNC, który będzie nasłuchiwać na każdym adresie IP na porcie 50000 (adres i port można dowolnie zmieniać). UWAGA: dla każdej wirtualnej maszyny port VNC musi być inny.
–noautoconsole – wyłącz automatyczne tworzenie konsoli
–os-type – określa typ systemu jaki będzie na wirtualnej maszynie
–virt-type – określa typ wirtualizacji
–vcpus – przydziela wpisaną ilość procesorów/rdzeni z których może korzystać wirtualna maszyna
–os-variant – rekomendowany parametr określający typ instalowanego systemu. Pozwala to wg. instrukcji w znacznym stopniu poprawić wydajność wirtualnej maszyny. Dzięki temu parametrowi kvm dobierze odpowiednią konfigurację.
 
Po wykonaniu komendy zobaczymy informację:

Starting install...
Creating domain...                                                          |    0 B     00:01
Domain installation still in progress. You can reconnect to
the console to complete the installation process.

 
Możemy sprawdzić listę wirtualnych maszyn:

virsh list --all

Powinno się wyświetlić:

 Id    Name                           State
----------------------------------------------------
 2     vmaszyna01                     running

 
Teraz żeby połączyć się do wirtualnej maszyny potrzebujemy VNC. Skorzystamy w tym celu z klienta TightVNC, którego można ściągnąć tutaj: http://www.tightvnc.com/download.php
 
Po instalacji uruchamiamy TightVNC viewer i łączymy się z adresem naszego serwera hosta na porcie 50000. Czyli w polu address wpisujemy: 192.168.0.10:50000 i klikamy connect:
tvnc01
 
Po połączeniu zobaczymy podobny ekran jak poniżej:
kvm_vnc01
 
Teraz już możemy przez pulpit zdalny zainstalować system na wirtualnej maszynie.
 

Zarządzanie wirtualną maszyną
Wirtualną maszynę możemy włączać, wyłączać, usypiać itd. W tym celu używamy narzędzia virsh. Czyli łączymy się z qemu:

virsh --connect qemu:///system

Po połączeniu zobaczymy powitanie:

Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # 

wpisujemy komendę:

list --all

pokaże się lista z wirtualnymi maszynami i ich stanem. W tym przypadku powinna być jedna wirtualna maszyna ze stanem running.

W celu uruchomienia wirtualnej maszyny używamy komendy start (nazwa_maszyny w tym przypadku to vmaszyna01):

start vmaszyna01

 
W celu wyłączenia maszyny:

shutdown vmaszyna01

 
W celu natychmiastowego wyłączenia (jak w przypadku odcięcia prądu czyli jak nie zadziała shutdown 😉 ):

destroy vmaszyna01

 
W celu uśpienia wirtualnej maszyny:

suspend vmaszyna01

 
W celu ustawienia autostartu danej wirtualnej maszyny przy starcie systemu hosta wpisujemy:

autostart vmaszyna01

Zostanie zwrócona informacja:

Domain vmaszyna01 marked as autostarted

Teraz wirtualna maszyna zostanie automatycznie uruchomiona przy starcie systemu matki/uruchamianiu serwera.
 
Żeby wyłączyć autostart należy w konsoli virsh/shell użyć komendy:

autostart vmaszyna01 --disable

Zostanie zwrócona informacja:

Domain vmaszyna01 unmarked as autostarted

 
W celu edycji ustawień danej wirtualnej maszyny wpisujemy:

edit vmaszyna01

Edit pozwala zmienić parametry wirtualnej maszyny. Po zmianie i zapisaniu parametrów konfiguracji w pliku należy uruchomić ponownie wirtualną maszynę. Wtedy mamy pewność, że nasze zmiany zostały ponownie wczytane przy uruchamianiu wirtualnej maszyny. Może też być tak, że najpierw trzeba będzie wyłączyć wirtualną maszynę, edytować konfigurację, zapisać zmiany i dopiero wtedy uruchomić wirtualną maszynę z nową konfiguracją.
 
W celu sprawdzenia informacji o danej wirtualnej maszynie należy użyć komendy:

dominfo vmaszyna01

 
W celu wykonania backupu pliku konfiguracji można użyć komendy:

dumpxml vmaszyna01 > vmaszyna01_backup.xml

 
Na podstawie pliku konfiguracyjnego możemy odtworzyć wirtualną maszynę:

create vmaszyna01_backup.xml

 
Żeby usunąć wirtualną maszynę należy wykonać:

shutdown vmaszyna01
destroy vmaszyna01
undefine vmaszyna01

Możemy undefine wpisać z przełącznikami, które usuną wszystkie snapshoty i zarządzane obrazy przez tą wirtualną maszynę:

undefine vmaszyna01 --managed-save --snapshots-metadata

 
Następnie usuwamy pliki/wirtualne dyski twarde z dysku:

rm /home/vms/libvirt/images/hdd1.qcow2.img

Żeby wyjść z shella/powłoki virsh wpisujemy:

quit

 
Jeśli chcemy już utworzoną wcześniej maszynę uruchomić z jakiegoś obrazu iso (lub zamontować jako napęd cd) to musimy edytować plik konfiguracyjny. Czyli wchodzimy do shella virsh (jeśli w nim nie jesteśmy):

virsh --connect qemu:///system

Następnie edytujemy plik konfiguracyjny wybranej maszyny:

edit vmaszyna01

Odszukujemy sekcje

<disk type='block' device='cdrom'>

i zmieniamy na:

<disk type='file' device='cdrom'>
  <driver name='qemu' type='raw'/>
  <source file='/home/vms/iso/debian-7.9.0-i386-netinst.iso'/>
  <target dev='hda' bus='ide'/>
  <readonly/>
  <address type='drive' controller='0' bus='1' unit='0'/>
</disk>

Czyli zmieniamy type na ‚file’ i dopisujemy source file=…
W tym przypadku wskazujemy plik iso, z którego ma zostać uruchomiona maszyna. Należy przejść teraz do sekcji

<os>

i zmienić na:

  <os>
    <type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type>
    <boot dev='cdrom'/>
    <boot dev='hd'/>
  </os>

Zapisujemy zmiany i wychodzimy z edytora (jeśli używasz nano to CTROL+O, a następnie CTRL+X). Restartujemy wirtualną maszynę (destroy vmaszyna01 i start vmaszyna01). Ustawiliśmy boot cdrom jako pierwszy, ustawiliśmy cdrom jako file i ścieżkę do pliku iso. Maszyna uruchomi się teraz z obrazu iso. w celu wyłączenia takiego boot lub zmiany obrazu iso musimy ponownie edytować plik. Jeśli chcemy tylko podmontować obraz iso w wirtualnej maszynie wystarczy nie zmieniać sekcji

<os>

Czyli bootowanie zostawiamy na hd (domyślnie), ale ustawiamy plik w sekcji

<disk type='file' device='cdrom'>

i dopisujemy

<source file='scieżka_do_pliku_iso'/>

To by było tyle. Może się komuś przydadzą opisane tutaj podstawy tworzenia, zarządzania i konfiguracji wirtualnych maszyn w KVM-Qemu.

You can leave a response, or trackback from your own site.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Powered by WordPress | Designed by: NewWpThemes | Provided by Free WordPress Themes