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