Solaris 10 a zóny

O Solarisu jste už určitě slyšeli, je to UNIX z dílny SUN Microsystems a funguje na platformě SPARC a x86/x86_64. Spolu s novou verzí tohoto operačního systému (verze 10, vyšla oficiálně na začátku 2005) nám firma SUN Microsystems připravila i některá zajímavá vylepšení jako je nástroj dtrace, SMF nebo třeba podporu pro zóny. Tento článek je právě o konfiguraci a používání zón v Solarisu 10 případně OpenSolarisu.

Zóny jsou jakousi abstraktní vrstvou operačního systému umožňující spouštění různých aplikací ve svém vlastním prostředí na společném hardware. Procesy jsou uzavřené v zóně a nemůžou ji nijak “opustit” a případně ohrozit jiné zóny. Procesy v zóně také nemají přístup k hardware.

Máme dva druhy zón. Globální zóna, může být pouze jedna a je to vlastní bežící operační systém. Dále máme lokální zóny (non-global zone), kterých je možné v globální zóně provozovat až 8192. Počet lokálních zón je limitován použitým hardwarem. Minimální nároky na jednu lokální zónu jsou 40MiB RAM a 320MiB volného prostoru na pevném disku. Každá zóna má oddělený systém uživatelských účtů (samostatný /etc/passwd a pod.), samostatný souborový systém, vlastní nastavení sítě a přidělené systémové prostředky. Lokální zóna je vlastně takový virtuální počítač, lze ji zapnout, vypnout, restartovat a překonfigurovat nezávisle na dalších zónách.

Použitý hardware

Instalaci popisovanou v článku jsem prováděl na počítači Ultra 10 s procesorem UltraSPARC IIi 440MHz a 384 MiB RAM. Solaris pro x86 podporuje zóny úplně stejně jako varianta pro SPARC, takže si to mlžete zkusit i sami na svém počítači. Pokud nechcete instalovat Solaris přímo na pevný disk, lze použít například virtuální stroj VMWare, ale doporučuji nějakou poslední verzi. Pro VMWare je dostupná zkušební licence na 30 dní. Pro Solaris doporučuji minimálně 256MiB RAM, ale pokud můžete, dejte mu víc, zvlášť v grafickém prostředí je to znát.

Informace o použitém operačním systému:

root@draslik:~# uname -a
SunOS draslik 5.10 Generic_118822-02 sun4u sparc SUNW,Ultra-5_10

Informace o nastavení sítě systému, ve kterém budeme vytvářet zónu.

root@draslik:~# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.0.14 netmask ffffff00 broadcast 192.168.0.255
        ether 8:0:20:c6:8e:9f

Nastavení zóny

Vytvoříme si adresář /zones do kterého budeme zóny umisťovat. V adresáři /zones je třeba zajistit dostatek místa, zónu lze udělat třeba 500MiB velikou nebo může mít také několik GiB.

Ověříme v jakém stavu jsou zóny v systému, všechny si vypíšeme:

root@draslik:~# zoneadm list -vc
  ID NAME             STATUS         PATH
   0 global           running        /

Jak je vidět z výpisu, v systému existuje jen jedna globální zóna a to vlastní operační systém.

Zóna, kterou si tu vytvoříme jako vzorovou se jmenuje appserv (poběží v ní aplikační server). K nastavení parametrů zóny slouží program zonecfg.

Příkaz create -b slouží k vytvoření čisté konfigurace bez předvoleb. Pokud nepoužijete parametr -b, tak se vytvoří zóna, kde budou některé adresáře sdílené s hlavním OS. Zónu umístíme do adresáře /zones/appserv/ a nastavíme autoboot.

Další krok je přiřazení síťového rozhraní. Na mém počítači se síťovka jmenuje hme0. Na x86 počítačích to bude pravděpodobně pcn0, přesný název zjistíte z výpisu ifconfig -a. Zóna může síťové rozhraní sdílet s nějakou jinou zónou nebo ho může mít pouze pro sebe.

Rozhodl jsem se, že adresáře /opt/sfw a /platform můžu v zóně appserv sdílet s globální zónou. V zóně appserv jsou sdílené adresáře přístupné pouze pro čtení.

Nakonec zkontrolujeme parametry zóny, uložíme a ještě si vypíšeme celou konfiguraci. Stiskem ctrl-d ukončíme práci.

Pokud potřebujete založit více zón, je možné sepsat všechny příkazy do souborů a ty pak zpracovat například ve skriptu pomocí zoneadm -f soubor-s-prikazy.

root@draslik:~# zonecfg -z appserv
zonecfg:appserv> create -b
zonecfg:appserv> set zonepath=/zones/appserv
zonecfg:appserv> set autoboot=true          
zonecfg:appserv> add net          
zonecfg:appserv:net> set address=192.168.0.100
zonecfg:appserv:net> set physical=hme0        
zonecfg:appserv:net> end              
zonecfg:appserv> add inherit-pkg-dir
zonecfg:appserv:inherit-pkg-dir> set dir=/opt/sfw
zonecfg:appserv:inherit-pkg-dir> end             
zonecfg:appserv> add inherit-pkg-dir
zonecfg:appserv:inherit-pkg-dir> set dir=/platform
zonecfg:appserv:inherit-pkg-dir> end              
zonecfg:appserv> verify
zonecfg:appserv> commit
zonecfg:appserv> info  
zonepath: /zones/appserv
autoboot: true
pool: 
inherit-pkg-dir:
        dir: /opt/sfw
inherit-pkg-dir:
        dir: /platform
net:
        address: 192.168.0.100
        physical: hme0
zonecfg:appserv> ^d

Instalace zóny

Zóna je nakonfigurovaná a připravená k instalaci:

root@draslik:~# zoneadm list -vc
  ID NAME             STATUS         PATH
   0 global           running        /
   - appserv          configured     /zones/appserv

Provedeme instalaci zóny, v závislosti na nastavení a rychlosti počítače to může trvat až půl hodiny.

root@draslik:~# zoneadm -z appserv install

Programem zoneadm můžete zónu také odinstalovat (uninstall), restartovat (reboot) nebo třeba nabootovat (boot)

Boot a první připojení do zóny

Zónu po nainstalování porpvé nastartujeme.

root@draslik:~# zoneadm -z appserv boot

První připojení do zóny slouží k jejímu nastavení, nastavuje se typ terminálu, časová zóna a heslo roota zóny. Nastavením vás provede sada textových dialogů. Pro připojení do lokální zóny z globální se používá program zlogin s parametrem -C v interaktivním režimu pro práci na konzoli.

zlogin -C appserv

“Proklikáme” se přes základní nastavovací dialogy, přihlásíme se do zóny a vytvoříme si uživatele abysme se mohli připojit přes ssh (nebo si povolíme přihlášení roota v konfiguraci ssh).

Pokud se k zóně přihlásíte klasickým způsobem přes zlogin, tak ve výchozí konfiguraci se ze zloginu dostane pomocí kombinace kláves ~. (vlnovka a tečka), v případě, že jste přihlášeni na server přes ssh, je třeba zmáčknout ~ dvakrát, první stisk totiž odchytí ssh.

root@draslik:~# zlogin -C appserv
[Connected to zone 'appserv' console]

appserv console login: ~.
[Connection to zone 'appserv' console closed]

Také si vlnovku můžete přemapovat třeba na zavináč pomocí parametru -e.

zlogin -C -e\@ appserv

Zlogin umí pracovat i v neinteraktivním režimu, například se tak dá velmi jednoduše zóna korektně vypnout.


zlogin appserv shutdown -y -i0 -g0

Informace o stavu zóny

Z globální zóny můžete získat informace o procesech v jednotlivých lokálních zónách. Pro výpis všech procesů v počítači a také pro informace o celkové spotřebě paměti a procesorového času jednotlivých zón lze použít příkaz

prstat -Z

Samozřejmě si můžete vypsat pouze procesy konkrétní zóny pomocí příkazu ps -fz nazev-zony přápadně použít prstaz -z nazev-zony.
Do jednotlivých zón je možné vstoupit i na úrovni filesystému z globální zóny, stačí když se podíváte do adresáře /zones/nazev_zony/root/.

Pro porovnání s normálním stavem ukážu jak vypadá konfigurace sítě v zóně global při nabootované zóně:

root@draslik:~# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000 
lo0:1: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        zone appserv
        inet 127.0.0.1 netmask ff000000 
hme0: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.0.14 netmask ffffff00 broadcast 192.168.0.255
        ether 8:0:20:c6:8e:9f 
hme0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        zone appserv
        inet 192.168.0.100 netmask ffffff00 broadcast 192.168.0.255

takto vypadá to samé nastavení při pohledu z lokální zóny appserv:

bash-3.00# ifconfig -a
lo0:1: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000 
hme0:1: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.0.100 netmask ffffff00 broadcast 192.168.0.255

Zóny umístěné na NFS

Na testovacím počítači jsem neměl dostatek místa na disku, tak jsem se rozhodl umístit zónu na NFS. Má to některé výhody. Použitá Ultra 10 je relativně pomalý počítač ohledně přístupu k disku (je v ní ATA33 disk) a tak 100Mbps síť bude docela dobrou náhradou za tento disk.

Zóny zatím nejde umístit přímo na NFS, zóna se odmítne nainstalovat. Proto jsem použil jednoduchou fintu.

NFS jsem namountoval do adresáře /.zones/

Vytvořil jsem si pomocí programu dd na NFS serveru 10GiB soubor.

dd if=/dev/null of=/.zones/zony.img bs=1k count=1 seek=10485760

Na tomto souboru jsem vyrobil souborový systém.

newfs /.zones/zony.img

a tentou soubor jsem namountoval do adresáře /zones/

mount `lofiadm -a /.zones/zony.img` /zones

Výpis připojenného souboru:

root@draslik:/# df -h /.zones /zones
Filesystem             size   used  avail capacity  Mounted on
tsunami:/export/hosts/draslik
                      10.0G   4.3G   5.7G    43%    /.zones
/dev/lofi/1            9.8G   3.0G   6.7G    31%    /zones

Potom je možné normálně nainstalovat zónu a přitom ji mít na NFS.

Něco na závěr

Škoda, že zóny nejdou používat i v Linuxu. Myslím, že chroot je docela dobrá věc, ale bohužel není tak propracovaný jako systém zón na Solarisu. User Mode Linux je zase složitější na správu a také má větší HW nároky, na druhou stranu je UML samostatně běžící jádro pod neprivilegovaným uživatelem a to zóny v Solarisu neumožňují.

Systém zón a jejich snadná správa je ideální pro vývojáře, kdy mohou různé vývojářské týmy efektivně sdílet jeden server aniž by se navzájem ovlivňovaly. Zóny také umožňují lepší zabezpečení systémů, kde na jednom serveru běží více služeb a potřebujete je nějak navzájem izolovat.

Další informace:

System Administration Guide: Solaris Containers-Resource Management and Solaris Zones
BigAdmin System Administration Portal – Solaris Zones

Článek vyšel 19.9.2005 na Abclinuxu.cz