Member of The Internet Defense League Últimos cambios
Últimos Cambios
Blog personal: El hilo del laberinto Geocaching

Actualización de Solaris 10 con "Live Upgrade" (ZFS "root"/"boot")

Última Actualización: 13 de noviembre de 2008 - Jueves

Una de las innovaciones más esperadas de Solaris 10 Update 6 es la capacidad para arrancar directamente desde ZFS, pudiendo prescindir totalmente de UFS y beneficiarnos por completo de todas las extraordinarias funcionalidades de ZFS.

Así que, tras probar durante un tiempo prudencial Solaris 10 Update 6 con una instalación "Live Upgrade" tradicional para comprobar que funciona correctamente, llega el momento de migrar 100% a ZFS.

El primer paso que voy a hacer es actualizar mi "pool" ZFS a la última versión. Para ello empleamos los comandos "zpool upgrade" y el nuevo "zfs upgrade". Este último comando es problemático, porque requiere desmontar temporalmente los "datasets" a actualizar, lo que no siempre es posible. En mi caso, la mayor parte de los "datasets" se actualizaron sin problemas, pero seis de ellos no se dejaban desmontar. Aprovechando un reinicio programado del sistema, arranqué en modo "single user" y volví a hacer un "zfs upgrade" para completar la actualización. Para arrancar en modo "single user", hay que arrancar el sistema y, en el menú GRUB, añadir el parámetro "-mmilestone=none".

Una vez actualizado el "pool" ZFS, mi siguiente paso ha sido probar un poco las nuevas funcionalidades, como la compresión GZIP o la exportación de "datasets" por CIFS. Todo parece funcionar a la perfección, así que continuemos.

Para variar, existen algunas limitaciones a la hora de usar ZFS "boot"/"root". Algunas son puñeteras, como el no poder utilizar discos completos, sino particiones (siempre se puede tener un disco con una única partición, ocupando el disco entero). La capacidad para actualizar instalaciones Solaris con "zonas" es limitada, también. Tampoco se soporta compresión GZIP en el "dataset" de arranque. Hay que revisar todas las limitaciones de forma concienzuda, para comprobar que podemos continuar.

El primer problema serio con el que nos encontramos es que la actualización "Live Upgrade" a ZFS no soporta el parámetro "-m". Utilizamos este parámetro en actualizaciones anteriores para dividir el sistema de ficheros en diferentes particiones. Lamentablemente con ZFS no se permite, y si no ponemos dicha opción entonces solo se copian los datos de la partición raíz, no del resto de particiones del sistema.

Mi primer enfoque consiste en recrear la estructura de particiones antigua dentro del "dataset" ZFS, pero se trata de una configuración no soportada que requiere que, en actualizaciones futuras, realicemos snapshots y clones manualmente. La "madre del cordero" parece estar en los ficheros "/etc/lu/ICF.*". Son ficheros de texto fácilmente modificables (¡haced copia de seguridad!). Haciendo pruebas, resulta simple crear "datasets" adicionales con las particiones antiguas y, con poco trabajo, se pueden hacer "live upgrades" posteriores.

La gran ventaja de utilizar "datasets" distintos es que podemos realizar backups de forma separada, o configurar opciones ZFS de forma diferente (por ejemplo, GRUB no puede arrancar -aún- desde un "dataset" comprimido con GZIP, pero quiero comprimir con GZIP StarOffice8, porque no lo uso). Pero lo cierto es que el motivo original para separar las particiones fue que el espacio UFS que había dedicado a "Live Upgrade" se me quedaba corto y, simplemente, no existía otra opción. Ese ya no es el caso en ZFS, así que evitar el "troceado" es una opción a valorar.

Por circunstancias personales que pronto serán evidentes, he preferido recurrir a la opción soportada (todo el sistema en un único "dataset"), para facilitar la vida al que me siga en el futuro como administrador de estas máquinas.

El primer paso, por tanto, es fusionar todas las particiones de sistema del "live upgrade" actual. El problema, claro, es que no tengo sitio para ello (son unos 10 gigabytes), ya que éste fue el motivo original para trocearlo.

Mi primer intento fue crear un volumen ZFS y realizar el fusionado ahí, pero "Live Upgrade" no admite la creación de BEs en volúmenes ZFS.

La segunda opción es aprovechar el espacio de SWAP de la máquina (nada menos que 32 gigas) de forma temporal para realizar la creación del nuevo "Live Upgrade". Una vez fusionado, realizamos una migración "Live Upgrade" de UFS a ZFS (en esta ocasión en una configuración sí soportada) y volvemos a liberar el espacio de SWAP.

Veamos:

[root@tesalia /]# swap -s
total: 2149596k bytes allocated + 296436k reserved = 2446032k used, 33077420k available
[root@tesalia /]# swap -l
swapfile             dev  swaplo blocks   free
/dev/dsk/c1d0s1     55,193      8 67108600 67094328
[root@tesalia /]# swap -d /dev/dsk/c1d0s1
/dev/dsk/c1d0s1 was dump device --
invoking dumpadm(1M) -d swap to select new dump device
dumpadm: no swap devices could be configured as the dump device
[root@tesalia /]# dumpadm -d /dev/zvol/dsk/datos/dump
      Dump content: kernel pages
       Dump device: /dev/zvol/dsk/datos/dump (dedicated)
Savecore directory: /var/crash/tesalia
  Savecore enabled: yes
[root@tesalia /]# lucreate -n Solaris10u6_3 \
                        -m /:/dev/dsk/c1d0s1:ufs \
                        -m /usr/openwin:merged:ufs \
                        -m /usr/dt:merged:ufs \
                        -m /var/sadm:merged:ufs \
                        -m /usr/jdk:merged:ufs \
                        -m /opt/sfw:merged:ufs \
                        -m /opt/staroffice8:merged:ufs \
                        -m /usr/sfw:merged:ufs
Discovering physical storage devices
Discovering logical storage devices
Cross referencing storage devices with boot environment configurations
Determining types of file systems supported
Validating file system requests
Preparing logical storage devices
Preparing physical storage devices
Configuring physical storage devices
Configuring logical storage devices
Checking GRUB menu...
System has findroot enabled GRUB
Analyzing system configuration.
Comparing source boot environment <Solaris10u6> file systems with the file
system(s) you specified for the new boot environment. Determining which
file systems should be in the new boot environment.
Updating boot environment description database on all BEs.
Searching /dev for possible boot environment filesystem devices

Template entry /:/dev/dsk/c1d0s1:ufs skipped.

luconfig: ERROR: Template filesystem definition failed for /, all devices are not applicable..
ERROR: Configuration of boot environment failed.

Tras investigar el asunto por Internet, el problema son los "flags" de la partición en cuestión. Debemos desactivarla como "swap" y ponerle los modos "wm" en vez de "wu". Empleamos para ello el comando "format". Como para adivinarlo...

Tras ello, sigamos:

[root@tesalia /]# lucreate -n Solaris10u6_3 \
                        -m /:/dev/dsk/c1d0s1:ufs \
                        -m /usr/openwin:merged:ufs \
                        -m /usr/dt:merged:ufs \
                        -m /var/sadm:merged:ufs \
                        -m /usr/jdk:merged:ufs \
                        -m /opt/sfw:merged:ufs \
                        -m /opt/staroffice8:merged:ufs \
                        -m /usr/sfw:merged:ufs
Discovering physical storage devices
Discovering logical storage devices
Cross referencing storage devices with boot environment configurations
Determining types of file systems supported
Validating file system requests
Preparing logical storage devices
Preparing physical storage devices
Configuring physical storage devices
Configuring logical storage devices
Checking GRUB menu...
System has findroot enabled GRUB
Analyzing system configuration.
Comparing source boot environment <Solaris10u6> file systems with the file
system(s) you specified for the new boot environment. Determining which
file systems should be in the new boot environment.
Updating boot environment description database on all BEs.
Searching /dev for possible boot environment filesystem devices
Updating system configuration files.
The device </dev/dsk/c1d0s1> is not a root device for any boot environment; cannot get BE ID.
Creating configuration for boot environment <Solaris10u6_3>.
Source boot environment is <Solaris10u6>.
Creating boot environment <Solaris10u6_3>.
Creating file systems on boot environment <Solaris10u6_3>.
Creating <ufs> file system for </> in zone <global> on </dev/dsk/c1d0s1>.
Mounting file systems for boot environment <Solaris10u6_3>.
Calculating required sizes of file systems              for boot environment <Solaris10u6_3>.
Populating file systems on boot environment <Solaris10u6_3>.
Checking selection integrity.
Integrity check OK.
Populating contents of mount point </>.
Copying.
Creating shared file system mount points.
Creating compare databases for boot environment <Solaris10u6_3>.
Creating compare database for file system </var/sadm>.
Creating compare database for file system </usr/sfw>.
Creating compare database for file system </usr/openwin>.
Creating compare database for file system </usr/jdk>.
Creating compare database for file system </usr/dt>.
Creating compare database for file system </opt/staroffice8>.
Creating compare database for file system </opt/sfw>.
Creating compare database for file system </>.
Updating compare databases on boot environment <Solaris10u6_3>.
Making boot environment <Solaris10u6_3> bootable.
Updating bootenv.rc on ABE <Solaris10u6_3>.
Setting root slice to </dev/dsk/c1d0s1>.
File </boot/grub/menu.lst> propagation successful
Copied GRUB menu from PBE to ABE
No entry for BE <Solaris10u6_3> in GRUB menu
Population of boot environment <Solaris10u6_3> successful.
Creation of boot environment <Solaris10u6_3> successful.
[root@tesalia /]# lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
Solaris10u6                yes      yes    yes       no     -
Solaris10u6_3              yes      no     no        yes    -

Obsérvese el uso de "merged" para fusionar las diferentes particiones. Esta operación de copia necesita, en mi entorno, 78 minutos.

Ahora que tenemos un BE unificado, lo convertimos a ZFS:

[root@tesalia /]# lucreate -s Solaris10u6_3 -n Solaris10u6ZFS -p datos
Checking GRUB menu...
System has findroot enabled GRUB
Analyzing system configuration.
Comparing source boot environment <Solaris10u6_3> file systems with the
file system(s) you specified for the new boot environment. Determining
which file systems should be in the new boot environment.
Updating boot environment description database on all BEs.
Updating system configuration files.
The device </dev/dsk/c5t0d0s4> is not a root device for any boot environment; cannot get BE ID.
Creating configuration for boot environment <Solaris10u6ZFS>.
Source boot environment is <Solaris10u6_3>.
Creating boot environment <Solaris10u6ZFS>.
Creating file systems on boot environment <Solaris10u6ZFS>.
Creating <zfs> file system for </> in zone <global> on <datos/ROOT/Solaris10u6ZFS>.
Populating file systems on boot environment <Solaris10u6ZFS>.
Checking selection integrity.
Integrity check OK.
Populating contents of mount point </>.
Copying.
Creating shared file system mount points.
Creating compare databases for boot environment <Solaris10u6ZFS>.
Creating compare database for file system </>.
Updating compare databases on boot environment <Solaris10u6ZFS>.
Updating compare databases on boot environment <Solaris10u6_3>.
Making boot environment <Solaris10u6ZFS> bootable.
Updating bootenv.rc on ABE <Solaris10u6ZFS>.
Saving existing file </boot/grub/menu.lst> in top level dataset for BE <Solaris10u6ZFS> as <mount-point>//boot/grub/menu.lst.prev.
File </boot/grub/menu.lst> propagation successful
Copied GRUB menu from PBE to ABE
No entry for BE <Solaris10u6ZFS> in GRUB menu
Population of boot environment <Solaris10u6ZFS> successful.
Creation of boot environment <Solaris10u6ZFS> successful.

Este proceso me lleva otros 74 minutos. Como curiosidad, los 10 gigabytes sobre UFS ocupan unos 7.8 gigabytes bajo ZFS, ya que la compresión reduce el tamaño un 33%, aproximadamente. Estoy hablando de la compresión lzjb, ya que GRUB no es capaz de arrancar de un "dataset" comprimido con GZIP (aún...).

Ahora que hemos creado ya el "Live Upgrade" sobre ZFS, podemos borrar el BE intermedio unificado, activar el nuevo y reiniciar el equipo:

[root@tesalia /]# ludelete Solaris10u6_3
System has findroot enabled GRUB
Checking if last BE on any disk...
/dev/md/dsk/d0
Skipping parse of <1> in </usr/sbin/metastat> output
BE <Solaris10u6_3> is not the last BE on any disk.
No entry for BE <Solaris10u6_3> in GRUB menu
Determining the devices to be marked free.
Updating boot environment configuration database.
Updating compare databases on boot environment <Solaris10u6ZFS>.
Updating boot environment description database on all BEs.
Updating all boot environment configuration databases.
Boot environment <Solaris10u6_3> deleted.
[root@tesalia /]# luactivate Solaris10u6ZFS
System has findroot enabled GRUB
Generating boot-sign, partition and slice information for PBE <Solaris10u6>
A Live Upgrade Sync operation will be performed on startup of boot environment <Solaris10u6ZFS>.
Generating boot-sign for ABE <Solaris10u6ZFS>
NOTE: File </etc/bootsign> not found in top level dataset for BE <Solaris10u6ZFS>
Generating partition and slice information for ABE <Solaris10u6ZFS>
Boot menu exists.
Generating multiboot menu entries for PBE.
Generating multiboot menu entries for ABE.
Disabling splashimage
Re-enabling splashimage
No more bootadm entries. Deletion of bootadm entries is complete.
GRUB menu default setting is unaffected
Done eliding bootadm entries.

**********************************************************************

The target boot environment has been activated. It will be used when you
reboot. NOTE: You MUST NOT USE the reboot, halt, or uadmin commands. You
MUST USE either the init or the shutdown command when you reboot. If you
do not use either init or shutdown, the system will not boot using the
target BE.

**********************************************************************

In case of a failure while booting to the target BE, the following process
needs to be followed to fallback to the currently working boot environment:

1. Boot from Solaris failsafe or boot in single user mode from the Solaris
Install CD or Network.

2. Mount the Parent boot environment root slice to some directory (like
/mnt). You can use the following command to mount:

     mount -Fufs /dev/dsk/c1d0s0 /mnt

3. Run  utility with out any arguments from the Parent boot
environment root slice, as shown below:

     /mnt/sbin/luactivate

4. luactivate, activates the previous working boot environment and
indicates the result.

5. Exit Single User mode and reboot the machine.

**********************************************************************

Modifying boot archive service
Propagating findroot GRUB for menu conversion.
File </etc/lu/installgrub.findroot> propagation successful
File </etc/lu/stage1.findroot> propagation successful
File </etc/lu/stage2.findroot> propagation successful
File </etc/lu/GRUB_capability> propagation successful
Deleting stale GRUB loader from all BEs.
File </etc/lu/installgrub.latest> deletion successful
File </etc/lu/stage1.latest> deletion successful
File </etc/lu/stage2.latest> deletion successful
Activation of boot environment <Solaris10u6ZFS> successful.
[root@tesalia /]# lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
Solaris10u6                yes      yes    no        no     -
Solaris10u6ZFS             yes      no     yes       no     -

Es importante no reiniciar la máquina durante este proceso, porque no hemos eliminado el "swap" del fichero "/etc/vfstab", y nos encontraremos inconsistencias como intentar eliminar un BE que no tiene existencia física en disco. Ahora que ya hemos eliminado el BE intermedio, sí podemos reiniciar.

Una vez reiniciado, sin ningún problema, tenemos:

[root@tesalia /]# lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
Solaris10u6                yes      no     no        yes    -
Solaris10u6ZFS             yes      yes    yes       no     -
[root@tesalia /]# zfs list
NAME                                                    USED  AVAIL  REFER  MOUNTPOINT
datos                                                   142G  13.0G   215M  /datos
datos/ROOT                                             7.84G  13.0G    18K  /datos/ROOT
datos/ROOT/Solaris10u6ZFS                              7.84G  13.0G  7.84G  /
[...]

Lo primero que voy a hacer es un BE de backup, por si alguna actualización futura me causa problemas. Veamos cuánto tiempo tarda ahora, usando snapshots y clones ZFS (antes era unos 70-80 minutos):

[root@tesalia /]# time lucreate -n Solaris10u6ZFS_BACKUP
Checking GRUB menu...
System has findroot enabled GRUB
Analyzing system configuration.
Comparing source boot environment <Solaris10u6ZFS> file systems with the
file system(s) you specified for the new boot environment. Determining
which file systems should be in the new boot environment.
Updating boot environment description database on all BEs.
Updating system configuration files.
Creating configuration for boot environment <Solaris10u6ZFS_BACKUP>.
Source boot environment is <Solaris10u6ZFS>.
Creating boot environment <Solaris10u6ZFS_BACKUP>.
Cloning file systems from boot environment <Solaris10u6ZFS> to create boot environment <Solaris10u6ZFS_BACKUP>.
Creating snapshot for &datos/ROOT/Solaris10u6ZFS> on <datos/ROOT/Solaris10u6ZFS@Solaris10u6ZFS_BACKUP>.
Creating clone for <datos/ROOT/Solaris10u6ZFS@Solaris10u6ZFS_BACKUP> on <datos/ROOT/Solaris10u6ZFS_BACKUP>.
Setting canmount=noauto for </> in zone <global> on <datos/ROOT/Solaris10u6ZFS_BACKUP>.
Saving existing file </boot/grub/menu.lst> in top level dataset for BE <Solaris10u6ZFS_BACKUP> as <mount-point>//boot/grub/menu.lst.prev.
File </boot/grub/menu.lst> propagation successful
Copied GRUB menu from PBE to ABE
No entry for BE <Solaris10u6ZFS_BACKUP> in GRUB menu
Population of boot environment <Solaris10u6ZFS_BACKUP> successful.
Creation of boot environment <Solaris10u6ZFS_BACKUP> successful.

real    0m40.161s
user    0m5.259s
sys     0m7.510s

Hemos pasado de 77 minutos a 40 segundos. No está mal. Además el clon de un BE no ocupa espacio hasta que sus ficheros empiezan a diverger.

El nuevo BE crea automáticamente un zvol ZFS de SWAP del tamaño del swap antiguo, y otro zvol ZFS de "dump" del tamaño de la memoria RAM que tengas.

El siguiente paso es eliminar el BE que arranca sobre UFS, y aprovechar los discos enteros para el pool ZFS. Pero esto será tras un par de días, para asegurarnos de que no vamos a necesitar volver a la versión UFS. Mientras tanto, actualizamos los scripts de backup y realizamos uno, comprobando que todo va donde debe...

Eliminación de UFS y SVM

Tras un par de días, para estar razonablemente seguros de que todo funciona, queremos hacer dos cosas: a) Eliminar el arranque por UFS, y b) Dedicar los discos duros enteros a ZFS.

Los pasos a seguir son:

  1. Eliminamos el BE UFS con "ludelete".

  2. Eliminamos el mirroring y las particiones lógicas gestionadas con SVM (Solaris Volume Manager) con "metaclear". Vemos cómo vamos con "metastat".

  3. Eliminamos los metadatos SVM con "metadb".

  4. Es un proceso lento, pero es conveniente comprobar que el "pool" ZFS está en perfectas condiciones con "zpool scrub". Si ejecutamos el comando, cualquier error en un disco duro será corregido con el otro "mirror". Si rompemos el "mirror" sin comprobar nada, cualquier error necesitará recuperar el fichero en cuestión desde la copia de seguridad.

  5. Elegimos el disco duro más pequeño y lo retiramos del "mirror" ZFS con "zpool detach".

  6. Usamos "format" para asignar el disco duro entero a la partición 0. Usamos particiones, aunque empleemos el disco duro entero, porque en este momento GRUB no es capaz de arrancar de un disco sin particiones.

  7. A continuación, añadimos el disco duro al mirror ZFS, con "zpool attach". Esperamos a que termine el "mirroring", que lleva varias horas. Es un proceso muy lento.

    En mi caso mi "pool" tiene unos 110 gigabytes, y necesita casi cinco horas para replicarse. Durante el proceso el rendimiento de la máquina es penoso. Es un problema conocido por Sun; están en ello...

    Podemos ir viendo cómo progresa el "mirroring" con "zpool status". Algunas personas informan de un bug cuando se invoca este comando como "root", que reinicia el "resilvering" desde el principio. Yo no lo he podido reproducir, pero dicho queda. Si es el caso, tendrás que ejecutar este comando bajo otro usuario.

  8. Una vez que se completa a la replicación, reiniciamos el sistema para comprobar que todo funciona correctamente, porque, en nuestro caso, hemos estado toqueteando el disco primario del ordenador.

    En mi caso tengo problemas porque he cambiado la numeración de las particiones, así que GRUB es incapaz de localizar su "menu.lst", y salta a su "prompt".

    Tras investigar bastante el asunto, tengo que ejecutar los siguientes comandos en el "prompt" de GRUB:

    findroot (BE_Solaris10u6ZFS,0,e)
    kernel$ /platform/i86pc/multiboot -B $ZFS-BOOTFS
    module$ /platform/i86pc/boot_archive
    

    Con esto conseguimos arrancar el sistema operativo. Una vez en marcha, hay que grabar el GRUB con los datos correctos de dónde debe buscar su "menu.lst". Bajo UFS el path normal es "/boot/grub/menu.lst", pero cuando trabajamos con arranque ZFS, el path es "/NOMBRE_POOL/boot/grub/menu.lst". Grabamos el GRUB actualizado haciendo:

    [root@tesalia /]# /boot/solaris/bin/update_grub
    Creating GRUB menu in /
    bootadm: biosdev command failed for disk: /dev/dsk/c5t1d0s4.
    bootadm: is_bootdisk(): cannot determine BIOS disk ID 'hd?' for disk: /dev/dsk/c5t1d0s4
    bootadm: biosdev command failed for disk: /dev/dsk/c5t0d0s0.
    bootadm: is_bootdisk(): cannot determine BIOS disk ID 'hd?' for disk: /dev/dsk/c5t0d0s0
    bootadm: get_grubroot(): cannot get (hd?,?,?) for menu. menu not on bootdisk: /dev/rdsk/c5t1d0s4
    Installing grub on /dev/rdsk/c5t1d0s4
    stage1 written to partition 0 sector 0 (abs 32130)
    stage2 written to partition 0, 265 sectors starting at 50 (abs 32180)
    Creating GRUB menu in /
    bootadm: biosdev command failed for disk: /dev/dsk/c5t1d0s4.
    bootadm: is_bootdisk(): cannot determine BIOS disk ID 'hd?' for disk: /dev/dsk/c5t1d0s4
    bootadm: biosdev command failed for disk: /dev/dsk/c5t0d0s0.
    bootadm: is_bootdisk(): cannot determine BIOS disk ID 'hd?' for disk: /dev/dsk/c5t0d0s0
    bootadm: get_grubroot(): cannot get (hd?,?,?) for menu. menu not on bootdisk: /dev/rdsk/c5t0d0s0
    Installing grub on /dev/rdsk/c5t0d0s0
    stage1 written to partition 0 sector 0 (abs 8064)
    stage2 written to partition 0, 265 sectors starting at 50 (abs 8114)
    

    Ahora revisamos el fichero "/NOMBRE POOL/boot/grub/menu.lst" para refinarlo un poco, y volvemos a reiniciar.

    Con suerte, ahora todo funcionará como debe...

  9. Una vez que todo funciona, hacemos lo mismo con el segundo disco: rompemos el "mirror", cambiamos el formato de las particiones, volvemos a añadir el disco a "pool" y esperamos a que termine el "resilvering".

    En esta ocasión, el "resilvering" tarda cuatro horas y media.

  10. Como he vuelto a tocar la tabla de particiones, vuelvo a hacer un "/boot/solaris/bin/update_grub". A continuación hay que volver a revisar el fichero "/NOMBRE POOL/boot/grub/menu.lst".

  11. Por último, reiniciamos de nuevo, para estar seguros de que todo funciona.


Historia

  • 12/nov/08: Eliminación de arranque UFS y gestión SVM.

  • 10/nov/08: Primera versión de esta página.



Python Zope ©2008 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS