Danilo Poccia - Tecnologia et al.
Installare una zona su UFS e clonarla con ZFS
Il manuale di amministrazione delle zone di Solaris 10 anche nella versione 8/07 (aka Update 4) indica di non installare le zone con zonepath su ZFS, in quanto in tal caso non è ancora supportata la procedura di patching e upgrade.
Per rispettare tale vincolo, ma poter allo stesso tempo sfruttare i vantaggi di ZFS (in particolare snapshot e cloni) è possibile utilizzare come zonepath un filesystem UFS creato su un volume ZFS.
Supponiamo di voler creare una zona "zone1" e poi clonarla in "zone2" e "zone3" senza occupare il triplo dello spazio disco, ma solo lo spazio necessario per le effettive differenze ("delta") delle nuove zone. Questi sono i passi operativi:
- Creare un volume ZFS ad esempio da 10GB in un pool di nome "tank"
# zfs create -V 10g tank/zone1vol
- Creare un filesystem UFS nel volume appena creato e montarlo come "/zone/zone1" (il mount può essere reso persistente aggiungendo il filsystem al file "/etc/vfstab")
# newfs /dev/zvol/dsk/tank/zone1vol
# mkdir -m 700 -p /zone/zone1
# mount /dev/zvol/dsk/tank/zone1vol /zone/zone1 - Configurare la nuova zona "zone1" in modalità whole root (ovvero con una copia locale di tutti i file di sistema), in modo da evidenziare meglio i vantaggi del cloning (in questo esempio come scheda di rete utilizzo una interfaccia wireless "wpi0")
# zonecfg -z zone1
zone1: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zone1> create -b
zonecfg:zone1> set zonepath=/zone/zone1
zonecfg:zone1> add net
zonecfg:zone1:net> set physical=wpi0
zonecfg:zone1:net> set address=192.168.1.201/24
zonecfg:zone1:net> end
zonecfg:zone1> info
zonename: zone1
zonepath: /zone/zone1
brand: native
autoboot: false
bootargs:
pool:
limitpriv:
scheduling-class:
ip-type: shared
net:
address: 192.168.1.201/24
physical: wpi0
zonecfg:zone1> verify
zonecfg:zone1> commit
zonecfg:zone1> exit - Installare zone1
# zoneadm -z zone-one install
Preparing to install zone <zone1>.
Creating list of files to copy from the global zone.
Copying <162382> files to the zone.
Initializing zone product registry.
Determining zone package initialization order.
Preparing to initialize <1220> packages on the zone.
Initialized <1220> packages on zone.
Zone <zone1> is initialized.
Installation of <1> packages was skipped.
The file </zone/zone1/root/var/sadm/system/logs/install_log> contains a log of the zone installation. - Verificare l'installazione della zona
# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- zone1 installed /zone/zone1 native shared - Verificare lo spazio occupato per questa zona (di tipo whole root), nel mio caso sono circa 2.53GB
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 11.2G 80.8G 18K none
tank/export_home 1.23G 80.8G 1.23G /export/home
tank/zone1vol 2.53G 88.3G 2.53G - - Effettuare il detach della zona
# zoneadm -z zone1 detach
- Per effettuare il flush su disco del filesystem UFS è necessario forzare un lock, in quanto i metadati di UFS sono aggiornati subito su disco, ma i dati sono gestiti dalla cache di sistema (demone fsflush). Se non si forza il lock in scrittura lo snapshot potrebbe contenere dati e metadati tra loro disallineati.
# lockfs -w /zone/zone1
# lockfs
Filesystem Locktype Comment
/zone/zone1 write - Creare uno snapshot del volume che contiene il filesystem con la zona in detach
# zfs snapshot tank/zone1vol@detach
- Rimuovere il lock, in modo che il file system torni accedibile in scrittura
# lockfs -u /zone/zone1
- Creare due cloni dello snapshot precedentemente creato
# zfs clone tank/zone1vol@detach tank/zone2vol
# zfs clone tank/zone1vol@detach tank/zone3vol
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 11.2G 80.8G 18K none
tank/export_home 1.23G 80.8G 1.23G /export/home
tank/zone1vol 2.53G 88.3G 2.53G -
tank/zone1vol@detach 0 - 2.53G -
tank/zone2vol 0 80.8G 2.53G -
tank/zone3vol 0 80.8G 2.53G - - Creare i nuovi path e effettuare il mount dei filesystem UFS contenuti nei volumi ZFS clonati (il mount può essere reso persistente aggiungendo il filsystem al file "/etc/vfstab")
# mkdir -m 700 -p /zone/zone2
# mkdir -m 700 -p /zone/zone3
# mount /dev/zvol/dsk/tank/zone2vol /zone/zone2
# mount /dev/zvol/dsk/tank/zone3vol /zone/zone3 - Configurare una nuova zona "zone2" a partire dal filesystem UFS contenuto nel secondo volume e ricordarsi di cambiare l'IP address
# zonecfg -z zone2
zone2: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zone2> create -a /zone/zone2
zonecfg:zone2> select net physical=wpi0
zonecfg:zone2:net> set address=192.168.1.202/24
zonecfg:zone2:net> end
zonecfg:zone2> info
zonename: zone2
zonepath: /zone/zone2
brand: native
autoboot: false
bootargs:
pool:
limitpriv:
scheduling-class:
ip-type: shared
net:
address: 192.168.1.202/24
physical: wpi0
zonecfg:zone2> verify
zonecfg:zone2> commit
zonecfg:zone2> exit - Allo stesso modo configurare una nuova zona "zone3" a partire dal filesystem UFS contenuto nel terzo volume e ricordarsi di cambiare l'IP address
# zonecfg -z zone3
zone3: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zone3> create -a /zone/zone3
zonecfg:zone3> select net physical=wpi0
zonecfg:zone3:net> set address=192.168.1.203/24
zonecfg:zone3:net> end
zonecfg:zone3> info
zonename: zone3
zonepath: /zone/zone3
brand: native
autoboot: false
bootargs:
pool:
limitpriv:
scheduling-class:
ip-type: shared
net:
address: 192.168.1.203/24
physical: wpi0
zonecfg:zone3> verify
zonecfg:zone3> commit
zonecfg:zone3> exit - La situazione delle zone è la seguente
# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- zone1 configured /zone/zone1 native shared
- zone2 configured /zone/zone2 native shared
- zone3 configured /zone/zone3 native shared - Effettuare l'attach delle tre zone
# zoneadm -z zone1 attach
# zoneadm -z zone2 attach
# zoneadm -z zone3 attach - Lo stato delle zone ora è cambiato
# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
- zone1 installed /zone/zone1 native shared
- zone2 installed /zone/zone2 native shared
- zone3 installed /zone/zone3 native shared - Rispetto all'occupazione su disco, le due nuove zone whole root occupano circa 150KB l'una, ma tale valore non è realistico in quanto molte configurazioni di una zona sono effettuate al primo boot
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 11.2G 80.8G 18K none
tank/export_home 1.23G 80.8G 1.23G /export/home
tank/zone1vol 2.53G 88.3G 2.53G -
tank/zone1vol@detach 148K - 2.53G -
tank/zone2vol 150K 80.8G 2.53G -
tank/zone3vol 150K 80.8G 2.53G - - Effettuare il boot delle tre zone su tre terminali diversi, ad esempio per la prima zona si avrebbe (nota: si esce dalla console premendo in rapida successione i caratteri '~' (tilde) e '.' (punto), il carattere '~' su una tastiera italiana si può ottenere con AltGrf + '^')
# zoneadm -z zone1 boot; zlogin -C zone1
[Connected to zone 'zone1' console]
SunOS Release 5.11 Version snv_72 32-bit
Copyright 1983-2007 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
Hostname: zone1
zone1 console login: root
Password:
Sep 20 22:37:58 zone1 login: ROOT LOGIN /dev/console
Sun Microsystems Inc. SunOS 5.11 snv_72 October 2007
# - Dopo aver atteso un po' di tempo, in modo da lasciar terminare i processi di configurazione per il primo boot, fermiamo le tre zone ed usciamo dalle console (attenzione: questi comandi vanno eseguiti nelle rispettive console delle zone)
# init 5
~. - Vediamo ora l'occupazione "realistica" delle zone clonate
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
tank 11.4G 80.6G 18K none
tank/export_home 1.23G 80.6G 1.23G /export/home
tank/zone1vol 2.62G 88.0G 2.59G -
tank/zone1vol@detach 31.5M - 2.53G -
tank/zone2vol 94.1M 80.6G 2.59G -
tank/zone3vol 93.0M 80.6G 2.59G -
Le zone "clonate" occupano poco meno di 100MB di spazio disco ciascuna.
Questo esempio non analizza le performance di una configurazione di questo tipo che ha dei pro e dei contro nell'utilizzo di volumi ZFS clonati.
Tutte le considerazioni precedenti rimangono valide se i volumi ZFS utilizzati sono esportati come iSCSI target da un nodo che ha accesso allo storage (il pool "tank" nell'esempio) ad un altro nodo con le zone "installate". In tal caso l'attach ed il detach possono avvenire anche su sistemi differenti (con lo stesso livello di package/patch) e quindi si possono clonare zone da un nodo verso altri.
Posted at 10:44AM set 21, 2007 by danilop in Solaris | Comments[1]



Cool! Lo provero' sul mio portatile fresco di Developer Edition ;-)
Keep it up Danilo!
Posted by Ricky on settembre 21, 2007 at 03:45 PM CEST #