Últimos Cambios |
||
Blog personal: El hilo del laberinto |
Ú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. Runutility 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...
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:
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.
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_archiveCon 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...
En esta ocasión, el "resilvering" tarda cuatro horas y media.
Más información sobre los OpenBadges
Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS