Hlavní navigace

OpenVZ: templates a migrace fyzického stroje

11. 9. 2012
Doba čtení: 8 minut

Sdílet

V druhém dílu seriálu se podíváme na tvorbu template, což jsou vlastně zatarované virtuální servery připravené tak, aby vytváření nových serverů byla pro uživatele hračka. Zběžně se podíváme na migraci fyzického stroje do OpenVZ virtuálu a díl zakončíme prozkoumáním souborového systému virtualizačního serveru.

Na konci prvního dílu jsem vás nechal si samostatně prozkoumat nově vytvořený virtuální server. Asi jste se podívali na běžící procesy:

root@ve0:~# vzctl enter 1000
entered into CT 1000
root@deb6:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.3   8352   800 ?        Ss   13:59   0:00 init [2]
root       211  0.0  0.5  52020  1392 ?        Sl   13:59   0:00 /usr/sbin/rsyslogd -c4
root       237  0.0  0.3  20900   848 ?        Ss   13:59   0:00 /usr/sbin/cron
root       257  0.0  0.2  18632   632 ?        Ss   13:59   0:00 vzctl: pts/0
root       258  0.0  0.7  17708  1916 pts/0    Ss   13:59   0:00 -bash
root       263  0.0  0.3  14812  1028 pts/0    R+   13:59   0:00 ps aux

A nejspíš také na síťová rozhraní:

root@deb6:/# ifconfig -a
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:16436  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:
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

venet0    Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:127.0.0.1  P-t-P:127.0.0.1  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  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:
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

venet0:0  Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:172.16.206.105  P-t-P:172.16.206.105  Bcast:0.0.0.0  Mask:255.255.255.255
          UP BROADCAST POINTOPOINT RUNNING NOARP  MTU:1500  Metric:1

Asi vás zaujalo neobvyklé označení síťových rozhraní, jedná se o virtual network device - defaultní síťové rozhraní uvnitř CT. Před tím, než se dostaneme k síťování, bych se ještě zdržel u přípravy template.

OpenVZ Templates

Template není nic než zatarovaná distribuce. Proces vytvoření nového CT se sestává především z rozbalení template na to správné místo (/vz/private/<CTID>. Vhodně připravený template může ušetřit nudnou rutinní práci před předáním CT uživateli. Každý administrátor bude mít vlastní představu, co by uživateli chtěl nabídnout. Já obvykle se staženým template dělám následující:

Změním adresy serverů s aktualizačními balíčky na ftp.cz.debian.org hostované u nás na CESNETu, následně aktualizuji seznam balíčků a provedu upgrade na aktuální verze. Doinstaluji ssh, postfixdebsums. Nainstaluji syslog-ng, který nahradí rsyslog, a následně odstraním konfigurační soubory rsyslogu.

root@deb6:~# cat > /etc/apt/sources.list
deb http://ftp.cz.debian.org/debian/ squeeze main non-free contrib debports
deb-src http://ftp.cz.debian.org/debian/ squeeze main non-free contrib

deb http://security.debian.org/ squeeze/updates main non-free contrib
deb-src http://security.debian.org/ squeeze/updates main non-free contrib

# squeeze-updates, previously known as 'volatile'
deb http://ftp.cz.debian.org/debian/ squeeze-updates main non-free contrib
deb-src http://ftp.cz.debian.org/debian/ squeeze-updates main non-free contrib
^D
root@deb6:~# apt-get update && apt-get upgrade
root@deb6:~# apt-get install ssh postfix syslog-ng debsums
root@deb6:~# apt-get purge rsyslog

Přesvědčím se, že všechny md5sums nainstalovaných souborů sedí. Doplním chybějící md5sums u balíčků mawknetbase, zopakuji kontrolu a odstraním stažené deb balíčky z diskové cache apt. Je zbytečné, aby template byl o ně větší.

root@deb6:~# debsums |grep -v OK$
debsums: no md5sums for mawk
debsums: no md5sums for netbase
root@deb6:~# apt-get --reinstall install mawk netbase
root@deb6:~# debsums |grep -v OK$
root@deb6:~# apt-get clean

Určitě se vyplatí zkontrolovat časovou zónu. Autoři template rádi nechávají tu svoji a moskevským časem uživatele nenadchnete.

root@deb6:~# dpkg-reconfigure tzdata

Výše uvedené je pouze příklad. Dost možná budou vaše požadavky odlišné, podstatné je, abyste si template připravili tak, aby byl co nejpodobnější prostředí, které chcete poskytovat uživatelům.

Když jsem s template hotový, opustím prostředí containeru. Zastavím container a vytvořím gzipovaný tar s tímto containerem (ano, přepíšu původní stažený template, už mi k ničemu není). Tím mám připravený template s Debianem a můžu očekávat prvního uživatele.

root@deb6:~# exit
root@ve0:~# vzctl stop 1000
Stopping container ...
Container was stopped
Container is unmounted

root@ve0:~# cd /vz/private/1000
root@ve0:/vz/private/1000# tar zcf /vz/template/cache/debian-6-amd64.tar.gz .

CT s číslem 1000 si nechávám připravený pro situace, kdy Debian vydá novou subverzi distribuce. Pak ho spustím, aktualizuji balíčky a znovu zataruji do template. V případě vydání nové verze distribuce obvykle začínám s čistým template z OpenVZ repositáře.

Vytvoření virtuálního serveru pro uživatele

Vytvoření virtuálního serveru pro uživatele je s použitím předpřipraveného template velice snadné. Příkazem vzctl create … virtuální server vytvořím. Pomocí vzctl set … mu nastavím jmenný server. A virtuální server spustím příkazem vzctl start …. Přidám uživatelův SSH klíč do seznamu autorizovaných klíčů, aby se mohl do virtuálního serveru dostat. Ještě aktualizuji instalovaný software na poslední verze a vymažu nainstalované deb balíčky z disku.

root@ve0:~# export CTID=1200
root@ve0:~# vzctl create $CTID --ostemplate debian-6-amd64 --ipadd 172.16.206.200 --hostname ve$CTID
Creating container private area (debian-6-amd64)
Performing postcreate actions
Container private area was created

root@ve0:~# vzctl set $CTID --nameserver 192.168.1.1 --save
File resolv.conf was modified
Saved parameters for CT 1200

root@ve0:~# vzctl start $CTID
Starting container ...
Container is mounted
Adding IP address(es): 172.16.206.200
Setting CPU units: 1000
Set hostname: ve1200
File resolv.conf was modified
Container start in progress...

cat >> /vz/private/$CTID/.ssh/authorized_keys
ssh-dss AAA....
^D

root@ve0:~# vzctl exec $CTID 'apt-get update && apt-get upgrade'
root@ve0:~# vzctl exec $CTID 'apt-get clean'

A předávám uživateli!

Migrace fyzického stroje do VE

Předpřipravené template redukují potřebu přípravy zcela vlastního. Pokud se ale do této situace dostanete, hledejte tipy na OpenVZ wiki pod heslem creating template.

Při zavádění OpenVZ se pravděpodobněji než s přípravou vlastních template setkáte s potřebou migrace stávajícího fyzického serveru do OpenVZ kontejneru. Záleží na tom, jakou distribuci provozujete. Mé zkušenosti jsou spojeny s Debian Sarge a Etch, což je už značná historie, a tak nebudu zabíhat do detailů. Postup je ale relativně jednoduchý:

  • připravte adresáře /vz/private/<CTID> a /vz/root/<CTID>
  • připravte konfigurační soubor /etc/vz/<CTID>.conf (zkopírováním konfiguračního souboru nějakého jiného virtuálního serveru a následnou editací)
  • fyzický stroj nabootujte v single mode a pomocí rsync –numeric-ids -ravH … překopírujte disk do /vz/private/<CTID>. Použijete-li ke kopírování něco jiného, dbejte na zachování vlastnictví souborů tím správným uuid. Nekopírujte /proc, /sys, a pokud systém používá udev, hal a dbus, tak ani /dev
  • spusťte virtuální server
  • odstraňte všechny balíky, které manipulují s HW, počínaje ntpdate, přes hdparm, lm-sensors a konče kernelem

U současných distribucí pravděpodobně narazíte na problémy s udev, haldbus. Pokud to závislosti dovolí, pokuste se je odstranit a používejte statický /dev.

Na OpenVZ wiki máte k dispozici dokument Physical to container obsahující řadu tipů, jak v tomto případě postupovat. Užitečné pro vás budou také následující dva díly miniseriálu, které budou detailněji rozebírat operace s VE a omezování zdrojů VE.

Kde je co na OpenVZ

Z přečteného textu jste už získali hrubou představu, kde jsou jaké soubory na souborovém systému hostitele. Nyní se pokusím to popsat trochu systematičtěji.

/etc/vz/vz.conf

Základní konfigurační soubor OpenVZ /etc/vz/vz.conf se při běžném provozu vůbec nemění a případné změny obvykle vyžadují restart všech virtuálních serverů. Jedinou změnu, kterou pravděpodobně budete chtít proti distribučnímu nastavení provést, je přidání modulů pro iptables, o tom se zmíním v sekci o síťování.

/etc/vz/conf

Adresář /etc/vz/conf obsahuje konfigurační soubory jednotlivých virtuálních serverů. Jméno souboru vždy odpovídá číslu CTID a má příponu .conf. Krom konfiguračních souborů tam můžete nalézt několik příkladů konfigurace dle užití virtuálního serveru.

root@ve0:~# ls -l /etc/vz/conf
total 24
-rw-r--r-- 1 root root  252 Jan 27  2011 0.conf
-rw-r--r-- 1 root root 1749 May  6 17:44 1000.conf
-rw-r--r-- 1 root root 1550 Jan 27  2011 ve-basic.conf-sample
-rw-r--r-- 1 root root 1585 Jan 27  2011 ve-light.conf-sample
-rw-r--r-- 1 root root 1606 Jan 27  2011 ve-unlimited.conf-sample

Konfigurační soubory lze editovat přímo a nebo utilitou k tomu určenou (vzctl set …). K jejich obsahu se vrátím v článku o nastavování zdrojů, které jsou k dispozici jednotlivým virtuálním serverům.

/vz/template/cache

Adresář /vz/template/cache obsahuje komprimované template jednotlivých distribucí, v tomto případě si vypomáhám výpisem z našeho produkčního serveru:

# ls -l /vz/template/cache/
total 1559796
-rw-r--r-- 1 root root 205013149 Feb 26  2010 centos-5.4-x86_64.tar.gz
-rw-r--r-- 1 root root 107130998 Aug 10  2009 debian-4.0-i386-default.tar.gz
-rw-r--r-- 1 root root 124480195 Feb 17  2010 debian-5-x86_64-semik-minimal.tar.gz
-rw-r--r-- 1 root root 139817545 Sep 22  2009 debian-5-x86_64.tar.gz
-rw-r--r-- 1 root root 114388806 Apr 20 15:15 debian-6-amd64.tar.gz
...

/vz/private

Adresář /vz/private obsahuje podadresáře:

root@ve0:~# ls -l /vz/private
total 8
drwxr-xr-x 20 root root 4096 May 13 16:11 1000
...

Každý z nich je vyhrazen jednomu VE. Obsahem podadresářů je souborový systém virtuálního serveru:

root@ve0:~# ls -l /vz/private/1000/
total 108
drwxr-xr-x  2 root root   4096 Aug  6  2009 bin
drwxr-xr-x  2 root root   4096 Dec 15  2004 boot
drwxr-xr-x 11 root root  36864 May 20 16:12 dev
drwxr-xr-x 50 root root   4096 May 20 16:12 etc
...

/vz/root

Tento adresář obsahuje podadresáře stejně jako předchozí adresář private, jedná se o provozní instance souborových systémů virtuálních serverů. Obsah adresáře private je na to místo připojen pomocí mount -o bind … společně s několika dalšími souborovými systémy potřebnými pro běh CT:

Cloud23

root@ve0:/etc/vz# cat /proc/mounts
...
/var/lib/vz/private/1000 /var/lib/vz/root/1000 simfs rw,relatime 0 0
proc /var/lib/vz/root/1000/proc proc rw,relatime 0 0
sysfs /var/lib/vz/root/1000/sys sysfs rw,relatime 0 0
tmpfs /var/lib/vz/root/1000/lib/init/rw tmpfs rw,nosuid,relatime,size=131072k,nr_inodes=32768,mode=755 0 0
tmpfs /var/lib/vz/root/1000/dev/shm tmpfs rw,nosuid,nodev,relatime,size=131072k,nr_inodes=32768 0 0
devpts /var/lib/vz/root/1000/dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620 0 0
...

Z prostředí CT je pak připojený souborový systém vidět takto:

root@deb6:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/simfs            1.0G  369M  656M  36% /
tmpfs                 128M     0  128M   0% /lib/init/rw
tmpfs                 128M     0  128M   0% /dev/shm

Kromě výše uvedených souborů a adresářů se je na souborovém systému hostitele k dispozici ještě několik speciálních souborů, prostřednictvím kterých lze OpenVZ monitorovat. Na monitorování a na nastavování parametrů jednotlivých CT se podíváme v dalším dílu.

Autor článku

Jan Tomášek v současnosti pracuje pro CESNET, z. s . p. o. jako vývojář v oblasti PKI a správy uživatelských identit. Ve volném čase se věnuje krajinné fotografii a geocachingu.