Portál AbcLinuxu, 21. říjen 2017 16:25

Zóny v systému Solaris

24. 11. 2009 | Filip Pytloun
Články - Zóny v systému Solaris  

Solarisové kontejnery, tzv. zóny, je technologie sloužící ke spuštění odděleného virtualizovaného systému na úrovni hostitelského. Nejedná se o plnohodnotnou virtualizaci, takže v zóně nemůžeme spustit jakýkoliv systém si zamaneme, ale pouze ty, které jsou podporované.

Úvod

V aktuální době je pro virtualizaci pomocí zón podporovaný pouze Solaris, ale existuje ještě projekt brandZ, který umožňuje virtualizaci Linuxu řady 2.4 anebo experimentálně 2.6. Projektem brandZ bych se chtěl zabývat až v pokračování článku, takže dneska si ukážeme jen vytváření Solaris zón a resource poolu.

Alternativou k zónám jsou na BSD Jaily a na Linuxu například OpenVZ.

Smysl použití

Proč používat zóny a ne například plnohodnotně virtualizované systémy?

Především kvůli hardwarovým nárokům. Zóna neprochází celým bootovacím procesem, takže nenačítá vlastní kernel, ale používá ten z hostitelského systému. Přesto je od hostitelského systému oddělena, můžeme jí efektivně přidělit výpočetní výkon, paměť a swap pomocí resource poolů, nastavením capped-cpu a capped-memory anebo použitím FSS (Fair Share Scheduler) přímo v zóně.

Zóny umožňují administrátorovi zajistit levné řešení se stejnou stabilitou a bezpečností jako při využití více fyzických serverů.

Typů zón (tzv. brands) existuje několik, v tomto článku se budu zabývat pouze výhozím typem v OpenSolarisu, kterým je ipkg.

Resource pooly

Resource pooly je jedna z možností rozdělení výkonu systému. Ve výchozím nastavení existuje pool_default, který obsahuje celý výkon a je přidělen k zóně global, kterou je sám hostitelský systém.

Začneme tím, že aktivujeme resource pooly a necháme si vypsat aktuální nastavení k naší zóně global, tzn. hostitelskému systému.

$ pooladm -e
$ pooladm 
 
system default
	string	system.comment 
	int	system.version 1
	boolean	system.bind-default true
	string	system.poold.objectives wt-load
 
	pool pool_default
		int	pool.sys_id 0
		boolean	pool.active true
		boolean	pool.default true
		int	pool.importance 1
		string	pool.comment 
		pset	pset_default
 
	pset pset_default
		int	pset.sys_id -1
		boolean	pset.default true
		uint	pset.min 1
		uint	pset.max 65536
		string	pset.units population
		uint	pset.load 157
		uint	pset.size 2
		string	pset.comment 
 
		cpu
			int	cpu.sys_id 1
			string	cpu.comment 
			string	cpu.status on-line
 
		cpu
			int	cpu.sys_id 0
			string	cpu.comment 
			string	cpu.status on-line

Graficky bychom aktuální stav zobrazili nějak takto:

solaris zony pool1

Máme globální zónu (hostitelský systém), využivající výchozí resource pool.

Pomocí resource poolů můžeme rozdělovat výkon jen na počet procesorů. Jelikož mám na laptopu jen dva, tak vytvořím jako příklad jen jeden resource pool s tím, že dostane minimálně a maximálně 1 procesor.

# Vytvoříme pset
$ poolcfg -c 'create pset zone0-pset (uint pset.min=1; uint pset.max=1)' 
 
# Vytvoříme pool
$ poolcfg -c 'create pool zone0'
 
# Přiřadíme pool k psetu
$ poolcfg -c 'associate pool zone0 (pset zone0-pset)'
 
# Uložíme konfiguraci a zobrazíme si výsledek
$ pooladm -c
$ pooladm 
 
system default
	string	system.comment 
	int	system.version 1
	boolean	system.bind-default true
	string	system.poold.objectives wt-load
 
	pool zone0
		int	pool.sys_id 1
		boolean	pool.active true
		boolean	pool.default false
		int	pool.importance 1
		string	pool.comment 
		pset	zone0-pset
 
	pool pool_default
		int	pool.sys_id 0
		boolean	pool.active true
		boolean	pool.default true
		int	pool.importance 1
		string	pool.comment 
		pset	pset_default
 
	pset zone0-pset
		int	pset.sys_id 1
		boolean	pset.default false
		uint	pset.min 1
		uint	pset.max 1
		string	pset.units population
		uint	pset.load 0
		uint	pset.size 0
		string	pset.comment 
 
	pset pset_default
		int	pset.sys_id -1
		boolean	pset.default true
		uint	pset.min 1
		uint	pset.max 65536
		string	pset.units population
		uint	pset.load 91
		uint	pset.size 2
		string	pset.comment 
 
		cpu
			int	cpu.sys_id 1
			string	cpu.comment 
			string	cpu.status on-line
 
		cpu
			int	cpu.sys_id 0
			string	cpu.comment 
			string	cpu.status on-line

Pokud bychom pset.min nastavili na 0, měla by globální zóna veškerý výkon (viz pset.minpset.maxpset_default) a náš nový pool by měl výkon maximálně jednoho procesoru. Jelikož jsme nastavili pset.min na 1, tak našemu novému poolu garantujeme výkon jednoho procesoru.

Grafické znázornění:

solaris zony pool2

Zóny

Začneme tím, že vytvoříme vlastní oddíl pro ukládání zón a hned jeden pro naši cvičnou zónu.

$ zfs create rpool/export/zones
$ zfs create rpool/export/zones/zone0
$ zfs list|grep zone
rpool/export/zones          38K  11,8G    19K  /export/zones
rpool/export/zones/zone0    19K  11,8G    19K  /export/zones/zone0

Ještě upravíme oprávnění, jinak nám zoneadm nedovolí nainstalovat zónu.

$ chmod -R 700 /export/zones

A teď se pustíme do zóny samotné.

$ zonecfg -z zone0
zone0: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zone0> create
# Místo umístění naší zóny
zonecfg:zone0> set zonepath=/export/zones/zone0
# Chceme, aby zóna nabootovala po bootu fyzického stroje?
zonecfg:zone0> set autoboot=true
# Přiřadíme zónu k resource poolu zone0
zonecfg:zone0> set pool=zone0
# Přidáme síťové rozhraní e1000g0
zonecfg:zone0> add net
zonecfg:zone0:net> set physical=e1000g0
# Přiřadíme IP adresu
zonecfg:zone0:net> set address=192.168.1.15/24
zonecfg:zone0:net> end
zonecfg:zone0> verify
zonecfg:zone0> commit
zonecfg:zone0> exit

To by bylo, teď samotná instalace zóny, to bude chvíli trvat, tak si zatím skočte třeba někam na kafe nebo oběd.

zoneadm -z zone0 install

Hotovo? Tak můžeme nabootovat a přihlásit se do naší nové zóny.

$ zoneadm -z zone0 ready
$ zoneadm list
global
zone0
$ zoneadm -z zone0 boot
$ zlogin -C zone0

Bude následovat krátký konfigurátor a pak už jen login prompt.

zone0 console login: root
Password: 
Nov  3 13:36:01 zone0 login: ROOT LOGIN /dev/console
Sun Microsystems Inc.   SunOS 5.11      snv_111b        November 2008
root@zone0:~# zoneadm list
zone0
root@zone0:~# pooladm
 
system default
	string	system.comment 
	int	system.version 1
	boolean	system.bind-default true
	string	system.poold.objectives wt-load
 
	pool zone0
		int	pool.sys_id 1
		boolean	pool.active true
		boolean	pool.default false
		int	pool.importance 1
		string	pool.comment 
		pset	zone0-pset
 
	pset zone0-pset
		int	pset.sys_id 1
		boolean	pset.default false
		uint	pset.min 1
		uint	pset.max 1
		string	pset.units population
		uint	pset.load 44
		uint	pset.size 1
		string	pset.comment 
 
		cpu
			int	cpu.sys_id 0
			string	cpu.comment 
			string	cpu.status on-line
 
root@zone0:~# psrinfo 
0	on-line   since 10/27/2009 10:31:46

No, není to nádhera? :-)

Máme zónu s přiděleným jedním procesorem a systémem odděleným od hostitelského. Můžeme si s ním dělat, co chceme, spustit si na něm odděleně některé služby, cokoliv.

Graficky teď máme něco takového:

solaris zony pool3

Připojení adresáře z globálního systému do zóny

Teď vypneme zónu a trošku si s ní pohrajeme.

Co třeba připojit svůj domovský adresář do zóny?

$ zoneadm -z zone0 halt
$ zonecfg -z zone0
# Přídáme filesystém
zonecfg:zone0> add fs
# Adresář v globální zóně, který chceme připojit
zonecfg:zone0:fs> set dir=/export/home/kenji
# Místo v zone0, kam ho chceme připojit
zonecfg:zone0:fs> set special=/export/home/kenji
# Typ loopback
zonecfg:zone0:fs> set type=lofs
# Oprávnění k zápisu
zonecfg:zone0:fs> set options=[rw,nodevices]
zonecfg:zone0:fs> end
zonecfg:zone0> commit
zonecfg:zone0> exit
$ zoneadm -z zone0 boot
$ zlogin -C zone0
root@zone0:~# ls /export/home/kenji/
Data                 TODO                 zony_a_crossbow.txt
Downloads            basne.txt
Plocha               packages

Pokud byste v zóně chtěli mít některé věci stejné jako v globální zóně, například abyste nemuseli manuálně instalovat všechny aplikace, můžete před instalací zóny použít parametr inherit-pkg-dir a nastavit jej třeba na /usr, /lib, /bin apod.

Capped CPU a memory

Pokud nepotřebujeme nebo nechceme vytvářet celý resource pool, můžeme jednotlivým zónám přidat resource capped-cpu a capped-memory.

Parametr ncpu v resource capped-cpu může být i menší než 1, přičemž celá čísla udávají celé procesory.

$ zonecfg -z zone0
zonecfg:zone0> add capped-cpu
zonecfg:zone0:capped-cpu> set ncpus=0,5
zonecfg:zone0:capped-cpu> end
zonecfg:zone0> add capped-memory
zonecfg:zone0:capped-memory> set physical=512M
zonecfg:zone0:capped-memory> set swap=1024M
zonecfg:zone0:capped-memory> set locked=10M
zonecfg:zone0:capped-memory> end
zonecfg:zone0> commit
zonecfg:zone0> exit

Tím jsem jednoduchým způsobem přidělil zóně polovinu výkonu jednoho procesoru, nastavil maximální paměť na 512 MB, swap na 1024 MB a locked memory na 10 MB.

Příkazem info si mohu prohlédnout všechna nastavení zóny.

nename: zone0
zonepath: /export/zones/zone0
brand: ipkg
autoboot: false
bootargs: 
pool: zone0
limitpriv: 
scheduling-class: 
ip-type: shared
hostid: 
fs:
        dir: /export/home/kenji
        special: /export/home/kenji
        raw not specified
        type: lofs
        options: [rw,nodevices]
net:
        address: 192.168.1.15/24
        physical: e1000g0
        defrouter: not specified
capped-cpu:
        [ncpus: 0,50]
capped-memory:
        physical: 512M
        [swap: 1G]
        [locked: 10M]
rctl:
        name: zone.cpu-cap
        value: (priv=privileged,limit=50,action=deny)
rctl:
        name: zone.max-swap
        value: (priv=privileged,limit=1073741824,action=deny)
rctl:
        name: zone.max-locked-memory
        value: (priv=privileged,limit=10485760,action=deny)i

Fair Share Scheduler

Pokud nám nevyhovuje přidělování výkonu pomocí capped nebo resource poolů, můžeme použít FSS.

FSS funguje tak, že přidělíme jednotlivým zónám garantovaný výkon číslem, udávajícím prioritu dané zóny. Čím vyšší hodnota, tím větší výkon přidělíme.

Nejprve nastavíme FSS pro výchozí resource pool, aktualizujeme nastavení a přesuneme všechny procesy pod FSS.

$ poolcfg -c 'modify pool pool_default (string pool.scheduler="FSS")'
$ poolcfg -c
$ priocntl -s -c FSS -i class TS
$ priocntl -s -c FSS -i pid 1

Zbývá přidělit jednotlivým zónám část výkonu (jakoby pomyslnou prioritu). Například takto.

zonecfg:zone0> add rctl
zonecfg:zone0:rctl> set name=zone.cpu-shares
zonecfg:zone0:rctl> add value (priv=privileged,limit=3,action=none)
zonecfg:zone0:rctl> end
zonecfg:zone0> exit
zonecfg:zone1> add rctl
zonecfg:zone1:rctl> set name=zone.cpu-shares
zonecfg:zone1:rctl> add value (priv=privileged,limit=2,action=none)
zonecfg:zone1:rctl> end
zonecfg:zone1> exit

Zóna

zone0

má teď přidělenou prioritu 3 a zóna zone1 prioritu 2. Zóna zone0 má tedy garantovaný větší výpočetní výkon nez zóna zone1.

Graficky:

solaris zony pool4

Čistka

Tak a to je pro dnešek vše. Nakonec po sobě uděláme pořádek.

$ zoneadm -z zone0 halt
$ zoneadm -z zone0 uninstall
$ zfs destroy -r rpool/export/zones/zone0
$ zfs destroy -r rpool/export/zones
$ poolcfg -c 'destroy pool zone0'
$ poolcfg -c 'destroy pset zone0-pset'
$ pooladm -c
$ pooladm -d


Poznámka: Článek původně vyšel v blogu na opensolaris.cz; na AbcLinuxu.cz vychází se svolením autora.

Související články

Seriál: OpenSolaris
Tvorba balíčků pro Solaris
Solaris patchování - opravy nainstalovaných balíčků
Solaris 10 a zóny
Co je na tom Solarisu 10 tak úžasného!?
OpenBoot Prompt
Java pod GPL
Rich Green, viceprezident Sunu o open source

Odkazy a zdroje

Zóny

Další články z této rubriky

Paralelizace běžných činností v konzoli pomocí GNU Parallel
Unixové nástroje – 26 (triky pro práci v Bashi)
Unixové nástroje – 25 ((s,c)fdisk, gdisk, parted a findmnt)
Linux: systémové volání splice()
Bootování ze sítě: pxelinux a kořenový adresář na NFS

Diskuse k tomuto článku

24.11.2009 00:17 pytel na brambory
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
Odpovědět | Sbalit | Link | Blokovat | Admin
Pěkný článek, akorát si nejsem jistej kterej ten "scheduler" si mám vybrat. Máš tam 3 typy:

1) Resource pooly
2) Capped CPU a memory
3) Fair Share Scheduler

Možná by neškodilo napsat k čemu a proč je jich tolik a čím se který liší nebo tak. Jinak já jsem nikdy nepotřeboval měnit nic, žádné pooly ani resourci jsem nemusel řešit, rovnou jsem šel zonecfg, zoneadm atd.

Jinak ZFS taky není podmínkou.

Mnoho informací, mohlo být více kontextu, ale jinak fakt hezký !!!
24.11.2009 01:40 Riddick
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
Vyzera to úžasne.. takže ak som to spravne pochopil možem mat 5 zona v kazdej bude mi bezat napr. apache s inou IP. nejako sa moc do toho nerozumiem len tak premyslam. a este nieco aky je rozdiel medzi opensolaris zonami a freebsd jailom? ja som skor na freebsd tak sa pytam.
24.11.2009 02:01 sunsparc
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
možem mat 5 zona v kazdej bude mi bezat napr. apache s inou IP.

Přesně tak!
Můžeš ty zóny nakonfigurovat tak, že se budou tvářit jako naprosto oddělené počítače, včetně balíků, jůzrů atd. Dá se to udělat různě.

Zóny vs. Jaily: http://uadmin.blogspot.com/2005/06/zones-vs-jail.html
7.12.2009 20:26 m;)
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
bohuzial ten clanok resp porovnanie je uz dost neaktualne.

freebsd jails uz umoznuju viacere ipv4/ipv6 v kazdom jaili ako aj podporu sctp, pridelenie konkretnych procesorov pre jail, hierarchicke jaili (!) a ine.

spolu so zfs (diky sun!:)), ktory je uz na freebsd v produkcnej kvalite, sa ich moznosti a praca s nimi podstatne zlepsili.

okrem toho existuju nadstavbove nastroje na pohodlnejsiu administraciu jailov, ako napr: http://www.freshports.org/sysutils/ezjail/
Genunix avatar 24.11.2009 08:22 Genunix | skóre: 17 | blog: Memdump
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
Také může mít každá z těch pěti zón virtuální síťové rozhraní a IP z virtuální sítě. Z globální zóny se pak dá řešit loadbalancing pomocí ipfilteru a round-robin :-) Tomu bych se rád věnoval v dalším dílu.
*´¨`*.¸.·´¨`*.¸.·*´`*·>>>
24.11.2009 09:09 x
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
S nadsenim okolo Jail bych byl opatrny viz. http://www.youtube.com/bsdconferences#p/u/29/JaVnNllZxn4
7.12.2009 20:07 m;)
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
mozes to prosim rozviest ? odkazovane video sa zaobera prototypmi pre netbsd a openbsd, nie freebsd jails. nepozeral som to cele, ale ani v popise nic o freebsd jails nebolo.
25.11.2009 21:40 Zdenek Kotala
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
Jsou firmy co provozuji webhosting v zonach, takze jsou ty weby od sebe oddeleny a pritom vse bezi na jednom stroji. Zalezi samozrejmne na zatizeni, ale stovky zon na jednom stroji neni problem.
Genunix avatar 24.11.2009 08:24 Genunix | skóre: 17 | blog: Memdump
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
Odpovědět | Sbalit | Link | Blokovat | Admin
Děkuji za ohlasy. Kdyby někdo měl zájem o PDF verzi, například pro offline prohlížení, tak je na stažení zde.
*´¨`*.¸.·´¨`*.¸.·*´`*·>>>
24.11.2009 10:17 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše zoneadm -z zon0 install
Odpovědět | Sbalit | Link | Blokovat | Admin
To by bylo, teď samotná instalace zóny, to bude chvíli trvat, tak si zatím skočte třeba někam na kafe nebo oběd.

Co tedy instalace dělá, když tak dlouho trvá? Instalujete nový obraz Solarisu? Jakou verzi? Odkud? Co konfigurace?

Nestálo by za to podrobněji vysvětlit, na jaké úrovni se tento druh zóny virtualizuje? Co všechno je samostatné, co je sdílené? Jak si zóna s globálním systémem vyměňuje informace? Nějaké srovnání třeba s linuxovým OpenVZ / User Mode Linuxem? Kam se ukládá konfigurace zóny?

24.11.2009 13:21 kos
Rozbalit Rozbalit vše Re: zoneadm -z zon0 install
To by mě taky zajímalo, vytvoření openvz kontejneru trvá 3 vteřiny...
Genunix avatar 24.11.2009 15:29 Genunix | skóre: 17 | blog: Memdump
Rozbalit Rozbalit vše Re: zoneadm -z zon0 install
Instaluje nový obraz systému z repozitáře opensolarisu. Možností jak tento proces urychlit je klonování zón.
Děkuji za nápady na doplnění informací. Možná tyto informace přidám do dalšího dílu.
*´¨`*.¸.·´¨`*.¸.·*´`*·>>>
25.11.2009 17:56 Petr
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
Odpovědět | Sbalit | Link | Blokovat | Admin
Super, díky moc - tohle se hodí.

Uvítal bych i nějaké "howto" na domácí Solaris server/router.

V bodech:
1) minimální instalace
2) konfigurace síťovky-1, konfigurace síťovky-2
3) instalace a konfigurace DHCP serveru
4) nastavení NATu
5) priority nebo fair-play v rámci jedné sítě
6) instalace a konfigurace SAMBA pro jednoduché sdílení souborů se ZFS


Určitě pokračuj !!!
26.11.2009 11:36 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
Odpovědět | Sbalit | Link | Blokovat | Admin
Vzhledem k tomu, že webhostingů se Solarisem je opravdu hodně málo, existuje nějaký důvod, proč nepoužít zóny pro webhostingové řešení?
27.11.2009 08:33 Zdenek Kotala
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
V US se to normalne pouziva. U nas ne, a podle mne hlavni duvod je neznalost Solarisu. Rada webhostingovych adminu nezna poradne ani linux nebo windows natoz pak po nich chtit solaris. O hostovanych databazich jako MySQL ci PostgreSQL ani nemluve. Nevyhodou zon oproti jednomu apachi s virtualnimi servery je, ze pro kazdou zonu je treba vlastni IP, coz samozrejmne dokud nebude IPv6 muze byt docela problem. I kdyz pokud clovek potrebuje https, tak se vlastni IP take nevyhne.
Genunix avatar 27.11.2009 09:08 Genunix | skóre: 17 | blog: Memdump
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
Je možné použít virtuálních rozhraní a virtuální LAN + ipfilter pro port forwarding nebo load balancing. Ale nevím jestli by zrovna tohle mělo smysl pro Apache virtualhosty, spíš pro zajištění dostupnosti služeb.
Jinak naprosto souhlasím.
*´¨`*.¸.·´¨`*.¸.·*´`*·>>>
27.11.2009 12:55 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Zóny v systému Solaris
Nevyhodou zon oproti jednomu apachi s virtualnimi servery je, ze pro kazdou zonu je treba vlastni IP
To vyřeší reverzní proxy, ne? nginx, lighttpd... Pak nebude třeba více veřejných IP adres (předpokládám že tohle byla ta nevýhoda). Samozřejmě pokud klient bude zónu chápat jako virtuální server se vším všudy, tu IP asi chtít bude, ale tomu stejně už není vyhnutí.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.