Danilo Poccia - Tecnologia et al.

venerdì set 21, 2007

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:

  1. Creare un volume ZFS ad esempio da 10GB in un pool di nome "tank"
    # zfs create -V 10g tank/zone1vol
  2. 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
  3. 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
  4. 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.
  5. 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
  6. 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  -
  7. Effettuare il detach della zona
    # zoneadm -z zone1 detach
  8. 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 
  9. Creare uno snapshot del volume che contiene il filesystem con la zona in detach
    # zfs snapshot tank/zone1vol@detach
  10. Rimuovere il lock, in modo che il file system torni accedibile in scrittura
    # lockfs -u /zone/zone1
  11. 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  -
  12. 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
  13. 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
  14. 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
  15. 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
  16. Effettuare l'attach delle tre zone
    # zoneadm -z zone1 attach
    # zoneadm -z zone2 attach
    # zoneadm -z zone3 attach
  17. 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
  18. 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  -
  19. 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
    #
  20. 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
    ~.
  21. 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.

Comments:

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 #

Post a Comment:
  • HTML Syntax: NOT allowed





    follow me on Twitter

    Calendar

    Feeds

    Search

    Blogroll

    Navigation

    Referrers

    Recent Entries