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
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' 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ć
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
Popraw opis skryptu, 4 parametr to RAM, a nie dysk 🙂
Dobry “przewodnik”, pewnie skorzystam 🙂
Dzięki właśnie szukałem dobrego tutka OpenVZ 😉 Dzięki że Ci się chciało 😉