BrandZ - Linuxové zóny

Obrázek uživatele mira

V předchozím příspěvku Kenji popsal, co to zóny vlastně jsou, jak se s nimi pracuje a jak se jim dá přidělovat různý výkon. V tomto článku nastíním jak takovou jednoduchou zónu s Linuxem nastavit. Ukázka se bude týkat distribuce Debian GNU/Linux.

Motivace

Mám aplikaci spustitelnou pouze na Linuxu ale chtěl bych ji používat i v OpenSolarisu. Zároveň chci využít technických možností OpenSolarisu jako jsou právě zóny a ZFS.

Co je to BrandZ

OpenSolaris neumožňuje spouštět aplikace z jiných systémů, tzn. aplikace, které nejsou nativní. V současné chvíli tu není žádný ELF emulátor, který by to umožňoval. Zóny, které mají schopnost spouštět jiné než nativní Solaris aplikace se nazývají brandované zóny, BrandZ. Zóny jsou rozšířené o podporu linuxového userlandu. Aplikace potom běží ve virtuálním prostředí i když hostitel je OpenSolaris.

OpenSolaris standardně umožňuje emulaci linuxového kernelu verze 2.4 a experimentálně verze 2.6. Pokud chceme použít právě kernel 2.6, který je pro novější distribuce, jako je např. CentOS 5.x nebo mnou použitý Debian 5.x nutný, stačí si ze stránek projektu stáhnout šablonu rozšířenou o verzi kernelu. Pro starší CentOS 4.x bez problému postačí i kernel 2.4 což ale v dnešní době není úplně to pravé oříškové.

Poznámka: Experimentální podpora kernelu 2.6 je dostupná pouze pro OpenSolaris. Klasický Solaris 10 v tuto chvíli takovou možnost nenabízí.
Poznámka 2: Linuxové zóny nepodporují přímý přístup k hw sítě, tzv. ip-type=exclusive.

# wget -O /etc/zones/SUNWlx26.xml http://hub.opensolaris.org/bin/download/Community+Group+brandz/linux_2_6/SUNWlx26.xml

Konfigurace

Konfigurace se provádí úplně stejně jako u klasické zóny, pouze navíc specifikujeme, že se jedná o linuxový userland, lx brand pomocí přepínače -t a názvu šablony. V našem případě právě SUNWlx26.

# zonecfg -z debian
debian: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:debian> create -t SUNWlx26
zonecfg:debian> set zonepath=/zones/debian
zonecfg:debian> add net
zonecfg:debian:net> set physical=e1000g0
zonecfg:debian:net> set address=192.168.4.2
zonecfg:debian:net> end
zonecfg:debian> verify
zonecfg:debian> commit
zonecfg:debian> exit

Instalace

Nainstalovat systém je možné přímo z CD, iso souboru nebo předpřipraveného archivu, což je asi nejrychlejší a nejpohodlnější. Poslední možností je využít přímo ZFS a celý systém pouze naklonovat z nějakého jiného. V praxi si tak nainstalujeme jeden čistý systém, vytvoříme snapshot a každou další zónu během vteřiny naklonujeme pomocí zfs clone. Ukážeme si později.

Díky ZFS může mít každá zóna vlastní pool, který se vytvoří automaticky. Výhody z toho plynoucí netřeba opakovat. Ostatně jak bývá u ZFS dobrým zvykem, o vytvoření a připojení se nemusí uživatel vůbec starat.

# zfs create -o mountpoint=/zones rpool/zones

Já jsem pro instalaci použil svůj předpřipravený archiv s nainstalovaným Debian GNU/Linux 5.0.3 (51MB), kterou jsem si připravil na jiném počítači pomocí utility debootstrap.
# zoneadm -z debian install -d /tmp/debian-lenny.tar.gz
A ZFS file system has been created for this zone.
Installing zone 'debian' at root directory '/zones/debian'
from archive '/tmp/debian-lenny.tar.gz'
 
This process may take several minutes.
 
Setting up the initial lx brand environment.
System configuration modifications complete.
Setting up the initial lx brand environment.
System configuration modifications complete.
 
Installation of zone 'debian' completed successfully.
 
Details saved to log file:
    "/zones/debian/root/var/log/debian.install.719.log"

Spuštění

Před spuštěním ověříme stav zóny.

# zoneadm list -icv
  ID NAME             STATUS     PATH                           BRAND    IP    
   0 global           running    /                              native   shared
   - devzone          installed  /zones/devzone                 ipkg     shared
   - debian           installed  /zones/debian                  lx       shared

Pokud je zóna ve stavu installed, nic nám nebrání ji spustit.
# zoneadm -z debian boot

Práce se zónou

Zónu máme nastavenou, nakonfigurovanou a vše šlo jako po drátku, tak i běžící. Teď už je to rutinní záležitost. Veškerá práce s ní je jako s každou jinou, nativní či nenativní.

# zoneadm list -icv
  ID NAME             STATUS     PATH                           BRAND    IP    
   0 global           running    /                              native   shared
   1 debian           running    /zones/debian                  lx       shared
   - devzone          installed  /zones/devzone                 ipkg     shared

Do zóny vstupujeme pomocí příkazu zlogin nebo na konzoli s přepínačem -C. Další parametry jsou předány přímo systému.
# zlogin debian "uname -a"
Linux debian 2.6.18 BrandZ fake linux i686 GNU/Linux

Tipy triky, možné problémy

Cestu k archivu je vždy nutné zadat absolutní cestou. Použít ./debian-lenny.tar.gz nestačí. Obvykle vám systém sice vyhubuje ale zóna se občas dostane do stavu incomplete a nelze ji nainstalovat, dokud ji neodinstalujeme a nezačneme opět od začátku. Jinými slovy, nesmažete to co zvládl rozbalit, než narazil na chybu. Na tom se dá chvíli ztratit nejen čas ale i klidné nervy.

Jindy se nám může stát, že použijeme archiv, který není správný nebo instalační iso, které je prozměnu nepodporované. Za validní Linux se v tomto případě považuje RPM-based distribuce ale podle toho co jsem vysledoval, tak jen pro samotnou instalaci. V průběhu rozbalování se systém odkazuje na některé soubory, které jsou právě jen v RPM-based distribucích. Ty se poté snaží upravit. Na samotný běh to vliv nemá.

# zoneadm -z debian install -d /iso
A ZFS file system has been created for this zone.
 
Checking for valid Linux distribution ISO images...
 
No valid ISO images available or mountable.
 
Installation of supported Linux distribution to zone
  'debian' FAILED Monday 09 November 2009 02:57:22 PM CET.
 
Cleaning up after failed install...
 
Installation of zone 'debian' FAILED.
 
See the log file:
  '/zones/debian/root/var/log/debian.install.4333.log'
for details.
# zoneadm list -ivc
  ID NAME             STATUS     PATH                           BRAND    IP    
   0 global           running    /                              native   shared
   - devzone          installed  /zones/devzone                 ipkg     shared
   - debian           incomplete /zones/debian                  lx       shared
# zoneadm -z debian uninstall
Are you sure you want to uninstall zone debian (y/[n])? y
The ZFS file system for this zone has been destroyed.

Mnohem jednoduší je novou zónu nainstalovat z jiné funkční již nastavené pomocí klonovaní, které nám ZFS nabízí. Navíc lze zónu nainstalovat jedním příkazem. Samotná instalace pak trvá skutečně jen zlomek vteřiny.
# zfs snapshot rpool/zones/debian@install
# zonecfg -z novy-debian "create -t SUNWlx26; set zonepath=/zones/novy-debian"
# zoneadm -z novy-debian clone -s rpool/zones/debian@install debian

Linuxové zóny rovněž neumožňují přidat další disk, tzv. dataset, což je určitě škoda. Berličkou je vytvořit si nový pool a připojit ho přímo do adresářové struktury zóny. Úplně křišťálové řešení to není, systém nám za to bude po právu hubovat. Pool je tedy třeba ručně připojit pokaždé až po startu zóny. V každém případě, jde to ale nedoporučuji.
# zfs create -o mountpoint=/zones/debian/root/data rpool/zones/debian/data
# echo test > /zones/debian/root/data/file.txt
# zlogin debian cat /data/file.txt
test
# zoneadm -z debian reboot
# zlogin debian cat /data/file.txt
cat: /data/file.txt: No such file or directory
# zfs mount rpool/zones/debian/data
# zlogin debian cat /data/file.txt
test

Zdroje

PřílohaVelikost
Debian GNU/Linux 5.0.350.7 MB
CentOS 5.494.25 MB