Showing posts with label virtualization. Show all posts
Showing posts with label virtualization. Show all posts

Monday, December 26, 2011

Konfiguracja maszyny wirtualnej na KVM

KVM jest coraz atrakcyjniejszym rozwiązaniem oferującym wirtualizację, do tego jest standardowo w jadrze systemu Linux, więc nic nie musimy dodatkowo instalować.

Do pełnej wirtualizacji lepiej nadają się systemy uniksowe, jeżeli chcesz wirtualizować systemy z rodziny Windows niezbędne będzie użycie sterowników parawirtualizowanych dla systemu Wondows jako gościa.

Dlatego KVM świetnie nadaje się do wyrtualizacji serwerów Linux. Jeżeli chcesz postawić serwer WWW w bezpiecznym środowisku, czy zbudować wirtualną sieć z serwerami Linux, KVM jest świetnym rozwiązaniem.

W końcu, co najważniejsze, to zanosi się na to, że KVM ma szansę stać się w najbliższej przyszłości numerem 1 wśród rozwiązań wirtualizacyjnych dla platformy Linux. Więcej informacji na ten temat można znaleźć na stronie Open Virtualization Alliance oraz na stronie projektu www.linux-kvm.org.

Przedstawię w jaki sposób używać KVM. Ponieważ używam dystrybucji Debian, będzie to sposób konfiguracji charakterystyczny dla tego systemu, tzw. "Denian's way". Co prawda określenie to odnosi się głównie do konfiguracji sieci, ale może również kojarzyć się z nieużywaniem specjalnych narzędzi tworzonych przez Red Hat, takich jak Virsh.

Pierwsze co musimy przygotować to wirtualne karty sieciowe dla naszych gości. Do tego trzeba zbudować most, tworzący wirtualny przełącznik, którego co najmniej jeden port będzie rzeczywistym interfejsem sieciowym. Dzięki niemu będziemy przekazywać połączenia między siecią wirtualną a rzeczywistą. Oczywiście sposobów konfiguracji może być wiele, my zakładamy, że host gości będzie miał połączenie z internetem.

Do stworzenia mostu musimy mieć zainstalowaną paczkę bridge-utils, chyba że w naszym systemie dostępne jest już polecenie brctl. Sam most będziemy tworzyć poprzez modyfikację pliku /etc/network/interfaces, a nie brctl.
Natomiast do stworzenia wirtualnych interfejsów, które mamy zamiar później dołączyć do mostu
być może potrzebna jeszcze będzie paczkę vtun, jeżeli jeszcze jej nie mamy. Po instalacji tej paczki należy ręcznie zamontować jej moduł: modprobe tun. W przyszłości system podczas startu załaduje go sam. Do zarządzania tymi interfejsami będzie nam jeszcze potrzebne narzędzie tunctl, które zawiera paczka uml-utilities.

Teraz możemy już przystąpić do konfiguracji interfejsów, więc odpalamy w vim'e plik /etc/network/interfaces i z przykładowej konfiguracji:
auto lo 
iface lo inet loopback 
allow-hotplug eth0 
iface eth0 inet dhcp 
auto eth0
tworzymy coś takiego:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5). 
# The loopback network interface
auto lo
iface lo inet loopback 
# The primary network interface
allow-hotplug eth0 
iface eth0 inet manual 
# RouterOS
iface tap0 inet manual
pre-up tunctl -b -u grzesiek
pre-up ifconfig tap0 up
post-down tunctl -d tap0 
# Fedora 16
iface tap1 inet manual
pre-up tunctl -u grzesiek -t tap1
pre-up ifconfig tap1 up
post-down tunctl -d tap1 
# CentOS 6
iface tap2 inet manual
pre-up tunctl -u grzesiek -t tap2
pre-up ifconfig tap2 up
post-down tunctl -d tap2 
# CentOS 6 x86_64
iface tap3 inet manual
pre-up tunctl -u grzesiek -t tap3
pre-up ifconfig tap3 up
post-down tunctl -d tap3 
iface br0 inet static
address 10.0.0.1
netmask 255.255.255.0
gateway 172.16.16.101
broadcast 10.0.0.255
network 10.0.0.0
bridge_ports eth0 tap0 tap1 tap2 tap3
bridge_maxwait 0
bridge_stp off
bridge_fd 0 
auto eth0
auto tap0
auto tap1
auto tap2
auto tap3
auto br0
To moja przykładowa konfiguracja na laptopie. Zmieniamy konfigurację eth0 na manual, natomiast całą konfiguracje wpisujemy dla br0, naszego nowego mostu. Jak widzimy do tego mostu należą eth0, tap0, tap1, tap2, tap3. Każdy interfejs tapX jest oddzielny dla każdego hosta, w ich konfiguracji należy zmienić nazwę użytkownika, z jakim prawami jest tworzony nowy interfejs. W moim przypadku jest to "grzesiek".

Teraz należy zresetować sieć skryptem /etc/init.d/networking i sprawdzić czy istnieją wszystkie interfejsy tap (polecenie ifconfig) oraz czy poprawnie został stworzony most i dodane do niego interfejsy. Dla konfiguracji, którą przedstawiłem wynik polecenia brctl show powinien być następujący:


bridge name bridge id STP enabled interfaces
br0 8000.72a5b61e39bf no eth0
tap0
tap1
tap2
tap3

Teraz możemy sobie wybrać jakąś lokalizacje na przechowywanie obrazów i stworzyć obraz przykładowym poleceniem: qemu-img create -f raw routeros.raw 800M.
To polecenie stworzy obraz dysku o nazwie routeros.raw i rozmiarze 800 MB.
Następnie dla wygody tworzymy skrypt, który skonfiguruję zaporę dla wirtualnych hostów, aby przekazywać im połączenie internetowe:
#!/bin/sh
iptables -t nat -A POSTROUTING  -o wlan0 -j MASQUERADE
iptables -t nat -A POSTROUTING  -s 10.0.0.0/24 -d 0/0 -j MASQUERADE
Nie zapomnij włączyć przekazywania pakietów, odkomentuj linię net.ipv4.ip_forward=1 w pliku /etc/sysctl.conf i wydaj polecenie sysctl -p. Reguły te przekazują połączenie przez interfejs bezprzewodowy do sieci wirtualnej. Możemy dla wygody zapisać ten skrypt pod nazwą network.sh w katalogu, w którym będziemy przechowywać obrazy wirtualnych hostów i uruchamiać przed korzystaniem z nich. Oczywiście można dodać go do /etc/rc.local aby system robił to automatycznie.
Kolejnym krokiem jest stworzenie skryptu dla każdego hosta, tu przykładowy dla RouterOS:
#!/bin/sh
# -boot d z cdrom
kvm -hda /virt/routeros.raw -cdrom /virt/iso/mikrotik-5.8.iso -boot c -m 256 -net nic,macaddr=DE:AD:BE:EF:24:13 -net tap,ifname=tap0 -enable-kvm -smp 1 -daemonize & #-nographic 
Skrypt zapisujemy pod nazwą routeros.sh i za jego pomocą uruchamiamy wirtualny host. Watro wyjaśnić znaczenie poszczególnych opcji:
-hda - wskazuje na dysk host
-cdrom - wskazuje na obraz płyty w wirtualnym napędzie
-boot - decyduje o kolejności botowania, c oznacz dysk z opcji -hda, z oznacz obraz z -cdrom
-m - ilość pamięci przeznaczonej dla hosta
-net nic,macaddr - definiuje adres MAC interfejsu hosta
-net tap,ifname - wskazuje wirtualny interfejs przeznaczony dla danego hosta
-smp - ilość rdzeni przeznaczony dla hosta
-daemonize - uruchamia hosta w trybie demona, nie wyświetla jego terminalu w bieżącym, dzięki temu host może pracować jako serwer i nie blokować terinala
-nographic - nakazuje nie wyświetlać okna z monitorem hosta
Jeżeli pierwszy raz uruchamiamy hosta z pustym dyskiem i chcemy zainstalować system z obrazu to opcję -boot ustawiamy na d, po instalacji na c. gdy już skonfigurujemy ustawiania sieci w hoście i uzyskamy dostęp zdalny możemy użyć opcji -nographic, aby nie wyświetlał się zbędny ekran serwera.
Gdyby maszyna wirtualna się nie uruchomiła należy sprawdzić, czy mamy załadowane moduły kvm oraz dla procesorów Intel kvm_intel, a dla AMD kvm_amd. Oczywiście jeżeli procesor wspiera wirtualizację wszystko powinno działać bez zarzutu.

Sunday, January 30, 2011

KVM i LXC

Tydzień temu testowałem wirtualizację, którą mógłbym wprowadzić na serwerze. Poświęciłem na to dosłownie cały weekend, a robiłem to tak namiętnie, że prawie cały miniony tydzień spędziłem w łóżku!
Przynajmniej nauczyłem się dwóch nowych rzeczy ;) Pierwsza to pełna wirtualizacja sprzętowa na KVM, a druga to wirtualizacja LXC, tak zwana system-level.

Celem wirtualizacji było oddzielenie usług zewnętrznych od wewnętrznych. Czyli np. instalujemy nowy system na wirtualnej maszynie i tam stawiamy usługę WWW. Na macierzystej maszynie tylko przekierowujemy pakiety z portu 80. Wirtualna maszyna nie posiada publicznego adresu, tylko prywatny.

KVM sprawdziło się świetne, bardzo małe zużycie zasobów i możliwość odpalenie takiej maszyny bez trybu graficznego. Niestety VirtualBox w domu nie zastąpi, ponieważ nie wiem czemu ale nawet jak system Windows nic nie robi to jeden rdzeń ciągle jest wykorzystywany na 100% - jakby jakaś pętla w kółko chodziła. Niemniej jednak KVM na serwer byłby świetny, gdyby nie mały szkopuł, na moim serwerze procesor nie wspiera Intel VT, a KVM działa na zasadzie pełnej wirtualizacji oferowanej przez procesor.
Nic tylko czekać na lepszy serwer, a póki co KVM jest świetny w domowych testach jeżeli chodzi o Linuksa.

Tak więc zawiedziony moim prockiem na serwerze musiałem szukać dalej i znalazłem LXC. LXC to też wirtualizacja ale oferowana przez mechanizmy systemowe, rzekłbym nawet, że to nic innego jak odpowiednik BSD Jail na Linux. Też działa świetne, a nawet lepiej. Mniejsze zużycie procesora i nie wymaga procesora z technologią wirtualizacji. Jedyne co może się nie spodobać to to, że taki system w klatce nie jest kompletną kopią normalnego systemu, wielu rzeczy nie trzeba na nim uruchamiać, gdyż są one realizowane przez system gospodarza. Najważniejsze w tym systemie to same programy i ich środowisko, a nie mechanizmy systemowe.
Fajne jest to, że nie tak jak w KVM wszystkie dane znajdują się w jednym pliku jakim jest dysk wirtualnej maszyny tylko w nowej strukturze katalogów, która rozpoczyna się we wskazanym miejscu. Dzięki temu bez problemu możemy w każdej chwili sięgnąć po jakieś dane z wirtualnego systemu, co bardzo ułatwia tworzenie kopii danych.
Co do Debiana, to po raz kolejny okazał on się dobrym wyborem, ponieważ posiada potrzebne narzędzie zwane debootstrap do budowania struktury systemu bazowego. Ułatwia to tworzenie kontenera LXC.
Niedobrą informacją może być to, że w Debian Lenny LXC jeszcze nie ma, trzeba samemu je kompilować. Mi się udało dopiero wersję 6.0 LXC skompilować na tym systemie, ale ponieważ Squeeze tuż tuż to chyba poczekam i nie będę dalej w to się bawił.

KVM:
http://www.weilnetz.de/qemu-doc.html
http://wiki.debian.org/KVM
http://wiki.debian.org/QEMU#GuestsonNATedinternalnetwork
http://wiki.qemu.org/Qemu-doc.html

LXC:
http://www.ibm.com/developerworks/linux/library/l-lxc-containers/#running-lxc-tools
http://blog.foaa.de/2010/05/lxc-on-debian-squeeze/
http://blog.bodhizazen.net/linux/lxc-configure-ubuntu-lucid-containers/
http://wiki.debian.org/LXC