sábado, 22 de noviembre de 2008

Actualizaste tu OpenSolaris y no te funcionan las zonas?

Resulta que si una persona realiza una serie de comandos normales en su maquinilla OpenSolaris, y resulta que de ellos se actualiza la versión a algo superior a snv_98, se encontrará con que no podrá seguir utilizando el mismo procedimiento que antes para generar una zona porque se encontrará con el error:

Error: no zonepath dataset.

ó

Error: unable to determine global zone boot environment.

Qué hacemos entonces?
Pues bien, el primer paso es entender que hay que generar un dataset diferente del que ahora tenemos, para entonces sí generar la zona como antes.
Pero antes de eso, tal parece que a nueva versión de ZFS ha cambiado, por lo que habrá que actualizarla, por un lado, y generar un nuevo BE (boot environment) que contiene un UUID que permite la generación de estas nuevas versiones de zonas.

Los primeros comandos, entonces, serán:

# zpool upgrade -a
# beadm create -a osol2008.11

(el primer comando actualiza a la última versión los pool's ZFS, y el segundo, genera un nuevo boot environment que contendrá la llamada al famoso UUID, llamada osol2008.11).

Luego, no olvidemos instalar un paquetito, que de seguro por omisión no está instalado, que es el correspondiente a rcap (veamos que en la zona del ejemplo, estamos usando resource capping, y por eso necesitamos de este paquete):

# pkg install SUNWrcap

Entonces, ejecutaremos:

# zfs create rpool/zones
# zfs set mountpoint=/zones rpool/zones
# zfs list
NAME USED AVAIL REFER MOUNTPOINT
rpool 14.0G 16.3G 65.5K /rpool
rpool/ROOT 8.74G 16.3G 18K /rpool/ROOT
rpool/ROOT/opensolaris-6 8.74G 16.3G 7.17G legacy
rpool/ROOT/opensolaris-6/opt 1.57G 16.3G 1.57G /opt
rpool/export 5.25G 16.3G 19K /export
rpool/export/home 5.25G 16.3G 5.25G /export/home
rpool/zones 18K 16.3G 18K /zones

Con estos bonitos comandos lo que hice fue generar un dataset denominado "rpool/zones", que monté en /zones. Nada más que eso.
Luego, configuraré mi zonita como lo hacía antes de este tema:

# zonecfg -z osol1
osol1: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:osol1> create
zonecfg:osol1> set zonepath=/zones/osol1
zonecfg:osol1> set autoboot=false
zonecfg:osol1> add capped-memory
zonecfg:osol1:capped-memory> set physical=128m
zonecfg:osol1:capped-memory> set swap=256m
zonecfg:osol1:capped-memory> end
zonecfg:osol1> add net
zonecfg:osol1:net> set address=192.9.200.105/24
zonecfg:osol1:net> set physical=iprb0
zonecfg:osol1:net> end
zonecfg:osol1> commit
zonecfg:osol1> exit
root@invid:~# zoneadm -z osol1 install
A ZFS file system has been created for this zone.
Authority: Using http://pkg.opensolaris.org:80/.
Image: Preparing at /zones/osol1/root ... done.
Cache: Using /var/pkg/download.
Installing: (output follows)
...

Ahora bien, luego de haber creado las nuevas zonas, en algún momento querrás actualizar el sistema operativo mediante un "pkg refresh --full" y "pkg image-update".
Cuando quise hacer esto, me encontré con que no pude, debido a que me aparecieron los mensajes:

pkg: unable to create BE None
pkg: image-update cannot be done on live image

Entonces, destruí las zonas generadas mediante el comando "zonecfg -z osol1 delete -F", y "zonecfg -z osol2 delete -F". Sí, tenía dos zonas funcionando.
Luego de esto, borré los nuevos datasets que generé en los pasos anteriores:

# umount -f /zones/osol1
# umount -f /zones/osol2
# rm -rf /zones/osol1
# rm -rf /zones/osol2
# zfs umount -f /zones
# zfs destroy -r rpool/zones

Ahora sí, a actualizar el sistema operativo, como de costumbre:

# pkg image-update

Y ahora todo funciona! Ya tengo el S.O. actualizado, como lo esperaba.
Ah! olvidaba algo! Puede que en el primer intento luego de haber tenido un par de errores de booteo de la zona aparezca un error del estilo:

zone 'osol1': Error: error mounting zone root dataset.
zone 'osol1':
zoneadm: zone 'osol1': call to zoneadmd failed

...y eso es porque antes de este intento de booteo, el sistema ya había montado un filesystem en particular, que es el siguiente:

rpool/zones/osol1/ROOT/zbe
98518633 237113 98281520 1% /zones/osol1/root

En este caso, sencillamente lo desmontamos, y luego reintentamos el booteo, y listo!

Como ven, soluciones sencillas.
Saludos cordiales,

HeCSa.