OmniOS - Zones
Zones - kontenery lub uściślając: lekka wirtualizacja, jest to technologia pozwalająca na uruchomienie odseparowanej instancji systemu gospodarza w ściśle ograniczonym i kontrolowanym środowisku. OmniOS pozwala obecnie utworzyć tylko duże kontenery ("Whole Root zone") wymagające stworzenia pełnej minimalnej kopii plików systemowych (w odróżnieniu od małych kontenerów, które pozwalają współdzielić pewne zasoby plikowe ze środowiskiem strefy globalnej.
Przykład utworzenia kontenera używanego przeze mnie jako środowisko do budowy oprogramowania:
Zaczynam od utworzenia dedykowanego interfejsu sieciowego dla kontenera.
root@test-builder:~# dladm show-vnic
LINK OVER SPEED MACADDRESS MACADDRTYPE VID
vnic0 rge0 100 2:8:20:dd:a5:25 random 0
myzone0 rge0 100 2:8:20:27:74:79 random 0
myzone1 rge0 100 2:8:20:bd:ad:91 random 0
printer0 rge0 100 2:8:20:af:cc:46 random 0
root@test-builder:~# _
root@test-builder:~# dladm create-vnic -l rge0 myzone2
Następnie rozpoczynam konfigurację kontenera:
root@test-builder:~# zonecfg -z pkgsrc64
pkgsrc64: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:pkgsrc64> create
zonecfg:pkgsrc64> set zonepath=/tank/zones/pkgsrc64
zonecfg:pkgsrc64> set autoboot=true
zonecfg:pkgsrc64> set limitpriv=default,dtrace_proc,dtrace_user
zonecfg:pkgsrc64> set ip-type=exclusive
zonecfg:pkgsrc64> add net
zonecfg:pkgsrc64:net> set physical=myzone2
zonecfg:pkgsrc64:net> end
zonecfg:pkgsrc64> verify
zonecfg:pkgsrc64> commit
zonecfg:pkgsrc64> exit
root@test-builder:~# _
Możliwości konfiguracji tworzonego kontenera są rozbudowane i odsyłam po szczegóły do podręcznika dla polecenia zonecfg, jednak na moje potrzeby powyższe minimum będzie wystarczające. Po stworzeniu konfiguracji nowego kontenera możemy wykonać polecenie jego instalacji:
root@test-builder:~# zoneadm -z pkgsrc64 install
A ZFS file system has been created for this zone.
Publisher: Using omnios (http://pkg.omniti.com/omnios/release/ ).
Publisher: Using ms.omniti.com (http://pkg.omniti.com/omniti-ms/).
Publisher: Using perl.omniti.com (http://pkg.omniti.com/omniti-perl/).
Image: Preparing at /tank/zones/pkgsrc64/root.
Cache: Using /var/pkg/publisher.
Sanity Check: Looking for 'entire' incorporation.
Installing: Packages (output follows)
Packages to install: 379
Create boot environment: No
Create backup boot environment: No
Services to change: 5
DOWNLOAD PKGS FILES XFER (MB)
Completed 379/379 39407/39407 251.0/251.0
PHASE ACTIONS
Install Phase 57108/57108
PHASE ITEMS
Package State Update Phase 379/379
Image State Update Phase 2/2
Note: Man pages can be obtained by installing pkg:/system/manual
Postinstall: Copying SMF seed repository ... done.
Done: Installation completed in 177,945 seconds. Next Steps: Boot the zone, then log into the zone console (zlogin -C)
to complete the configuration process.
root@test-builder:~# _
Uruchamiam stworzony kontener
root@test-builder:~# zoneadm -z pkgsrc64 boot
W tym momencie możemy zalogować się już do nowego środowiska. Jego stan jest taki, jak po nowej instalacji systemu, więc będzie konieczne wprowadzenie podstawowej konfiguracji.
root@test-builder:~# zlogin pkgsrc64
[Connected to zone 'pkgsrc64' pts/3]
OmniOS 5.11 006 June 2014
root@pkgsrc64:~# _
root@pkgsrc64:~# passwd
passwd: Changing password for root
New Password:
Re-enter new Password:
passwd: password successfully changed for root
root@pkgsrc64:~# _
Tworzenie kontenera rozpocząłem od stworzenia dedykowanego interfejsu sieciowego, by uruchomiona instancja systemu była widziana w sieci jako odrębny host. W tym celu konfiguruję w kontenerze unikatowy numer IP z używanej puli:
root@pkgsrc64:~# dladm show-phys
root@pkgsrc64:~# dladm show-vnic
LINK OVER SPEED MACADDRESS MACADDRTYPE VID
myzone2 ? 100 2:8:20:98:5:c1 random 0
root@pkgsrc64:~# _
root@pkgsrc64:~# ipadm show-addr
ADDROBJ TYPE STATE ADDR
lo0/v4 static ok 127.0.0.1/8
lo0/v6 static ok ::1/128
root@pkgsrc64:~# _
root@pkgsrc64:~# ipadm create-if myzone2
root@pkgsrc64:~# ipadm create-addr -T static -a 192.168.88.13/24 myzone2/v4static
root@pkgsrc64:~# ipadm show-addr
ADDROBJ TYPE STATE ADDR
lo0/v4 static ok 127.0.0.1/8
myzone2/v4static static ok 192.168.88.13/24
lo0/v6 static ok ::1/128
root@pkgsrc64:~# _
root@pkgsrc64:~# route -p add default 192.168.88.1
add net default: gateway 192.168.88.1
add persistent net default: gateway 192.168.88.1
root@pkgsrc64:~# echo "nameserver 192.168.88.1" >> /etc/resolv.conf
root@pkgsrc64:~# cp /etc/nsswitch.conf{,.bak}
root@pkgsrc64:~# cp /etc/nsswitch.{dns,conf}
root@pkgsrc64:~# ping wp.pl
wp.pl is alive
root@pkgsrc64:~# _
Mamy działające środowisko w oparciu o które można uruchamiać serwisy sieciowe lub używać je do dowolnych innych celów, w szczególności gdy chodzi nam o podniesienie poziomu bezpieczeństwa serwera i odseparowanie środowiska usługowego od systemu gospodarza.