OpenVZ – instalacja i konfiguracja pod Debianem

openvz_logo
Jakiś czas temu szukałem dobrego kursu/tutoriala na temat instalacji i konfiguracji OpenVZ pod Debianem co bym mógł użytkownikom podsyłać aby nie tłumaczyć ciągle jak to się robi. Znalazłem w Internecie sporo pomocy i opisów jak zainstalować i jak skonfigurować OpenVZ łącznie z podstawowymi komendami zarządzania kontenerami. Postanowiłem więc wykonać krok po kroku to co jest opisywane w znalezionych przeze mnie kursach/pomocach, ale niestety jak zwykle to bywa musiałem się posiłkować dwoma lub trzema takimi kursami w jednym czasie aby poprawnie zainstalować i skonfigurować OpenVZ. W jednym kursie brakowało opisu wymaganych paczek , w innym opisie była dobrze opisana instalacja, ale totalnie beznadziejnie opisane było tworzenie i konfigurowanie kontenerów itp. oraz nigdzie nikt nie napisał o potrzebie przekonfigurowania GRUBa przy czym może to być konieczna rzecz do wykonania. Miałem wrażenie, że większość kursów napisanych przez ludzi, które można znaleźć w necie to kopiuj i wklej z innego bloga. Jakiś gość przeczytał coś na kogoś blogu i na jego podstawie napisał swój wpis traktujący o tym samym czyli powielił te same błędy i braki, a samemu nie chciało się mu poszukać i dopisać brakującej treści na temat np. konfiguracji (lub nawet nie miał świadomości, że takie coś ktoś będzie potrzebować…). Czyli zataczamy błędne koło przy temacie szukania pomocy w necie, bo część tych pomocy to typowe zapchaj dziury na kogoś blogu żeby tylko było wrażenie, że coś się tu dzieje i że ktoś się na czymś zna. Mało autorskiej treści i wszystko opisane po łebkach z powielonymi błędami lub brakującymi komendami.
Postanowiłem napisać swój własny mały poradnik jak zainstalować i skonfigurować OpenVZ oraz jak się nim w zakresie podstawowym posługiwać. Nie ma tutaj niczego specjalnego tylko instalacja, konfiguracja, podstawowe zarządzanie i komendy. Koniec marudzenia więc zapraszam do lektury (komentarze, uwagi, maile na temat poradnika mile widziane). 🙂

 
Co to jest OpenVZ
OpenVZ jest to narzędzie do wirtualizacji w systemie Linux dzięki, któremu tworzymy kontenery. Warto mieć na uwadze, że każdy z kontenerów korzysta z tego samego kernela co system host. 😉 Zainteresowani tematem wiedzą co to jest OpenVZ (bo przeczytali o nim gdzieś w Internecie lub ktoś im o tym opowiedział), a kto się chce dowiedzieć odsyłam do wiki (aby nie powielać tego samego):
Wikipedia OpenVZ: https://pl.wikipedia.org/wiki/OpenVZ
 

Przygotowanie do instalacji OpenVZ
Całość opisuję z przyjęciem, że posiadasz czystą instalację Debiana (np. w wersji 7.4) czyli bez wstępnie skonfigurowanych już i przygotowanych narzędzi/programów/usług oraz posiadasz podstawową wiedzę z zakresu obsługi systemu Linux. Z racji aby nie pisać ciągle sudo coś tam, sudo coś tam innego (jak to jest w przypadku kursów Ubuntu) będziemy pracować na koncie root. Z resztą jeśli ktoś ma zainstalowany świeży minimalny system to nawet nie ma skonfigurowanego sudo.

Na początek logujemy się na konto root w systemie. Następnie musimy zainstalować odpowiedni kernel ze wsparciem dla OpenVZ. Nie próbowałem uruchamiać OpenVZ na kernelu innym niż przygotowany pod OpenVZ czyli wykorzystuje kernel 2.6.32-openvz.
 
Najpierw jednak trzeba dodać do listy sources apt adres do repozytorium OpenVZ.

echo >> /etc/apt/sources.list deb http://download.openvz.org/debian wheezy main

 
Ściągamy i dodajemy klucz repozytorium:

wget http://ftp.openvz.org/debian/archive.key && apt-key add archive.key

 
Aktualizujemy apt:

apt-get update

 
Po tych czynnościach instalujemy odpowiedni kernel.
Dla systemu x86 (686):

apt-get install linux-image-openvz-686

 
Dla systemu x64 (AMD64):

apt-get install linux-image-openvz-amd64

 
Dla ułatwienia edycji plików zainstalujemy jeszcze edytor Nano

apt-get install nano

 
Instalacja kernela to nie wszystko. Trzeba teraz wskazać GRUBowi, który kernel ma uruchamiać przy starcie systemu, bo po restarcie będzie uruchamiany domyślny kernel zainstalowany z systemem czyli GRUB nie będzie uruchamiać naszego kernela dla openvz.
Musimy edytować plik grub w katalogu /etc/default/ czyli:

nano /etc/default/grub

 
Zmieniamy tylko dwie linie tak jak podano poniżej:

GRUB_DEFAULT=2
GRUB_TIMEOUT=2

 
GRUB_DEFAULT ma być na 2 co nakazuje GRUBOwi wybranie opcji startowej nr 2 (czyli pozycja nr 3 w menu rozruchu) z menu w czasie uruchamiania (opcja 0 to normalny start, a opcja 1 to start awaryjny więc nasz zainstalowany kernel jest opcją 2).
GRUB_TIMEOUT=2 to czas przez który będzie widoczne menu wyboru. Ustawmy 2 sekundy (w razie czego można będzie podpiąć monitor + klawiaturę i przy starcie wybrać inną opcję startu – o ile oczywiście to robimy na serwerze domowym).

Zachowujemy zmiany wciskając Ctrl+O, a następnie wychodzimy wciskając Ctrl+X (lub wciskamy CTRL+X i odpowiadamy twierdząco na pytanie czy chcemy zapisać zmiany i wciskamy enter potwierdzając nazwę pliku do zapisu).
 
Wykonujemy aktualizację ustawień gruba

update-grub

 
Dostaniemy odpowiedź w stylu

Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-4-686-pae
Found initrd image: /boot/initrd.img-3.2.0-4-686-pae
Found linux image: /boot/vmlinuz-2.6.32-openvz-686
Found initrd image: /boot/initrd.img-2.6.32-openvz-686
done

 
Restartujemy system

reboot

 
Po restarcie systemu sprawdzamy kernel

uname -r

 
Powinno być (na przykładzie jądra dla x86)

2.6.32-openvz-686

 
Instalacja OpenVZ
Po wstępnych przygotowaniach przechodzimy do instalacji OpenVZ.

Instalujemy potrzebne paczki

apt-get install vzctl vzquota vzdump ploop

Po instalacji sprawdzamy czy działa usługa OpenVZ

service vz status

System powinien wyświetlić komunikat

OpenVZ is running...

Tworzymy symlink dla wstecznej kompatybilności i ułatwienia poruszania się/odnajdywania katalogu kontenerów

ln -s /var/lib/vz /vz

 
Następnie przechodzimy do edycji sysctl.conf w celu zapewnienia działania sieci w kontenerach itp.

nano /etc/sysctl.conf

 
Ustawiamy wszystkie parametry jak poniżej, a te brakujące po prostu należy dopisać

net.ipv4.conf.all.rp_filter=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.default.forwarding=1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.ip_forward=1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.eth0.proxy_arp=1
net.ipv4.conf.all.forwarding=1

 
Po edycji zachowujemy zmiany CTRL+O i wychodzimy CTRL+X (lub wciskamy CTRL+X i odpowiadamy twierdząco na pytanie czy chcemy zapisać zmiany i wciskamy enter potwierdzając nazwę pliku do zapisu). W celu sprawdzenia zmian w sysctl wykonujemy komendę:

sysctl -p

 
Edytujemy plik vz.conf, który jest w katalogu /etc/vz

nano /etc/vz/vz.conf


Zmieniamy linię:

#NEIGHBOUR_DEVS=detect


Na linię (czyli usuwamy komentarz -> znaczek # <-- i zmieniamy detect na all lub po prostu dopisujemy tą linię):

NEIGHBOUR_DEVS=all

Zapisujemy zmiany i restartujemy system

reboot

 
Tworzenie i konfiguracja kontenerów

Teraz możemy przystąpić do tworzenia kontenerów i konfigurowania ich parametrów. Najpierw musimy ściągnąć szablon systemu, którego chcemy użyć. W moim przypadku będzie to debian-7.0-x86-minimal. Cała lista dostępnych szablonów dostępna jest tutaj: http://wiki.openvz.org/Download/template/precreated

Przechodzimy do folderu z szablonami OpenVZ:

cd /vz/template/cache/

Ściągamy szablon:

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz

 
Teraz możemy utworzyć własny kontener z systemem Debian 7.0 x86. Opiszę tutaj krok po kroku komendy dodawania i zarządzania kontenerami (czyli potocznie jak to zrobić z palca). Jednakże niżej zamieściłem także źródło przygotowanego przeze mnie skryptu, który ułatwi wam tworzenie kolejnych kontenerów bez wstukiwania wszystkich komend (można oczywiście utworzyć odpowiedni plik konfiguracyjny w /etc/vz/conf, ale tym się nie będziemy tutaj zajmować).
 
Tworzenie kontenera odbywa się przy wykorzystaniu komendy vzctl create id . ID jest to identyfikator kontenera (numer) jaki chcemy nadać utworzonemu kontenerowi. Czyli utworzymy kontener wybierając szablon, który ściągneliśmy oraz wykorzystując config bazowy OpenVZ:

vzctl create 10 --ostemplate debian-7.0-x86-minimal --config basic

 
Po wykonaniu tej komendy mamy utworzony kontener z ID 10 więc przechodzimy do konfiguracji i ustawiania parametrów kontenera. Ustawienia wykonujemy używając komendy vzctl set id –save gdzie ostatni parametr –save zachowuje zmiany w pliku ustawień danego kontenera.

Czy kontener ma startować przy starcie systemu (opcja yes czyli tak):

vzctl set 10 --onboot yes --save

Ustawiamy hostname dla danego kontenera:

vzctl set 10 --hostname node1 --save

Ustawiamy adres IP, który ma mieć ten kontener:

vzctl set 10 --ipadd 192.168.0.210 --save

 
Tutaj się na chwilę zatrzymamy. Jeżeli sieć, którą posiadasz jest w zakresie np. 192.168.0.x (przykładowo) to kontener będzie miał dostęp do Internetu (najprawdopodobniej) jednak co zrobić jeśli chcemy aby kontener był w innej podsieci i miał połączenie z Internetem? W tym momencie musimy ustawić iptables czyli ustawiamy np. kontenerowi adres IP 192.168.2.100 i nie ma on dostępu do Internetu, bo jest w innej podsieci. Musimy ustawić NAT w iptables następująco (tutaj robimy to dla wszystkich adresów IP -> więcej informacji na ten temat tutaj: https://openvz.org/Using_NAT_for_container_with_private_IPs). Przyjmujemy, że adres serwera/hosta (systemu matki na którym działa OpenVZ) to 192.168.0.10 czyli:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.0.10

Teraz kontener już powinien móc łączyć się z Internetem. W linku, który podałem powyżej można doczytać więcej informacji na ten temat. Oczywiście trzeba będzie stworzyć odpowiedni skrypt, który będzie uruchamiany przy każdym starcie systemu hosta i ustawiał taki wpis w iptables.

 
Ustawiamy ilość socketów dla danego kontenera:

vzctl set 10 --numothersock 120 --save

Ustawiamy serwery nazw dla danego kontenera:

vzctl set 10 --nameserver 208.67.222.222 --nameserver 8.8.8.8 --save

Ustawiamy pamięć RAM, która ma być dostępna dla danego kontenera:

vzctl set 10 --ram 256M --save

Ustawiamy pamięć SWAP, która ma być dostępna dla danego kontenera:

vzctl set 10 --swap 512M --save

Ustawiamy wielkość przestrzeni na dysku twardym jaką może wykorzystać dany kontener:

vzctl set 10 --diskspace 5G --save

Dany kontener uruchamiamy komendą vzctl start id czyli w naszym przypadku:

vzctl start 10

 
Kontener wyłączamy komendą vzctl stop id i restartujemy komendą vzctl restart id.
Jeżeli chcemy dany kontener usunąć, bo już nie jest nam np. potrzebny to używamy komendy vzctl destroy id czyli:

vzctl destroy 10

Powyższa komenda usunie utworzony przez nas kontener 10.

Przejdźmy do uruchomienia kontenera czyli

vzctl start 10

Teraz jak już uruchomiliśmy kontener możemy na niego wejść przy użyciu komend vzctl enter id czyli:

vzctl enter 10

Żeby wyjść z danego kontenera to używamy komendy exit czyli:

exit

 
Dostępne kontenery i ich stan możemy wylistować używając komendy vzlist np.:

vzlist -a

Powyższa komenda wylistuje nam wszystkie dostępne kontenery i ich status

CTID      NPROC STATUS    IP_ADDR         HOSTNAME
 10         10  running   192.168.0.200   node1

 
Oczywiście można ustawiać jeszcze ograniczenia na procesor, zakresy dostępnej pamięci (dostępna pamięć, pamięć BURST) itd. Odsyłam w tym celu tutaj: https://openvz.org/Resource_shortage. W tym artykule poruszyliśmy podstawową instalację, konfigurację i uruchomienie wirtualizacji OpenVZ i w przypadku zastosowań domowych wiedza zawarta tutaj raczej wystarcza. 🙂

Dodatkowo po uruchomieniu kontenera możemy na nim wykonać zmianę hasła np. dla root bez wchodzenia w dany kontener. W tym celu należy użyć komend vzctl exec id komenda czyli:

vzctl exec 10 passwd 

Zostaniem poproszeni o wprowadzenie nowego hasła. Tym sposobem możemy wykonywać także inne komendy jak np.

vzctl exec 10 df -h

lub

vzctl exec 10 free -h

 
Tak jak napisałem wyżej zamieściłem tutaj skrypt pomagający tworzyć kontenery. Można oczywiście go rozwinąć i dodać dodatkowe opcje jak np. wybór szablonu, który mamy zamiar wykorzystać itd.

Tworzymy plik np. createvz w dowolny miejscu (może być nasz katalog domowy) np. nano createvz i wklejamy źródło:

#!/bin/bash

if [ "$1" != "" ] && [ "$2" != "" ] && [ "$3" != "" ] && [ "$4" != "" ] && [ "$5" != "" ] && [ "$6" != "" ]; then
  vzctl create $1 --ostemplate debian-7.0-x86-minimal --config basic &&
  vzctl set $1 --hostname $2 --save &&
  vzctl set $1 --ipadd $3 --save &&
  vzctl set $1 --numothersock 100 --save &&
  vzctl set $1 --swap $6 --save &&
  vzctl set $1 --ram $4 --save &&
  vzctl set $1 --diskspace $5 --save &&
  vzctl set $1 --nameserver 208.67.222.222 --nameserver 8.8.8.8 --save &&
  vzctl set $1 --onboot yes --save
else
  echo './create <id> <hostname> <ip> <ram> <diskpace> <swap>'
fi

Ustawiamy atrybut wykonywania

chmod +x createvz

Teraz możemy wykorzystać skrypt, który utworzy nam kontener z podanymi przez nas parametrami. Przykładowe wykorzystanie:

./createvz 101 dev101 192.168.20.101 512M 30G 1G

Skrypt utworzy kontener z ID 101, nazwą dev101, adresem IP 192.168.20.101, pamięcią RAM 512MB, dyskiem 30GB i swapem 1GB.

 
Wskazówka:
Pamiętaj o odpowiednim doborze adresacji sieci dla kontenerów oraz konfiguracji sieci. Jeżeli chcemy zmienić adres IP danego kontenera najpierw musimy usunąć stary adres IP (chyba, że chcemy aby kontener miał dodatkowy adres to wtedy niczego nie usuwamy), który został mu przydzielony czyli:

vzctl stop 10
vzctl set 10 --ipdel 192.168.0.210 --save
vzctl set 10 --ipadd 192.168.0.201 --save
vzctl start 10

W tym przykładzie zatrzymaliśmy kontener, usunęliśmy stary adres IP, dodaliśmy nowy adres IP i uruchomiliśmy kontener z nowym adresem IP.
 
W kontenerach możemy dokonywać zmian w locie czyli w trakcie działania danego kontenera (nie trzeba go restartować aby zmienić RAM, dysk, swap, CPU itd.). Czyli jeśli dany kontener działa i chcemy mu zwiększyć w locie ilość dostępnej pamięci RAM itd. bez zapisywania zmian to wystarczy wykonać komendę ustawiającą pamięć RAM bez parametru –save czyli:

vzctl set 10 --ram 1G

Tym sposobem zmieniliśmy pamięć RAM kontenera, ale zmiany nie zostały zapisane więc przy restarcie kontenera/ponownym uruchomieniu zostanie użyta opcja zapisana w configu czyli 256M.
 
Jeżeli ktoś chce się dowiedzieć więcej na temat backupowania i przywracania kontenerów to proszę się zainsteresować komendą/narzędziem vzdump.
Co do ustawiania iptables, NAT, przekierowań dla kontenerów podaję źródło z informacjami: https://openvz.org/Using_NAT_for_container_with_private_IPs
 
To chyba wszystko co jest potrzebne jako podstawa do obsługi OpenVZ. 🙂
Na temat baz danych w kontenerach napisałem tutaj OpenVZ – MySQL, PostgreSQL jak zainstalować i uruchomić
 

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

3 comments

  1. Wilk ( User Karma: 0 ) says:

    Nie rozumiem co jest źle w opisie skryptu.
    Jest: echo ‚./create ‚
    czyli echo ./create $1 $2 $3 $4 $5 $6

    Wygląda, że jest OK

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