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

Separar el "/var" de un "Boot Enviroment" en ZFS "root"/"boot"

Última Actualización: 15 de enero de 2009 - Jueves

En un artículo anterior movimos nuestras máquinas a ZFS "root"/"boot". Una de las consecuencias es que todas las particiones del sistema operativo primitivo bajo UFS residen ahora bajo un único "dataset" ZFS. Esto incluye el directorio "/var".

Sería interesante separar dicho directorio en su propio "dataset" ZFS, de forma que se le pueda fijar una cuota máxima de disco, por ejemplo. O comprimirlo al vuelo con GZIP (mi "/var" mide unos 6 gigabytes). O, por motivos de seguridad, no permitir ejecutables SUID o DEVICES en el mismo.

Durante una instalación desde cero de Solaris 10 Update 6, el instalador permite separar "/var", pero si estamos haciendo un "Live Upgrade" no podemos hacerlo. A menos que lo hagamos a mano.

Hay un par de hilos al respecto en las listas de correo de OpenSolaris. En concreto, una respuesta interesante de la propia Lori Art, que fue la persona de SUN a cargo de desarrollar la tecnología ZFS "root"/"boot". En dicho mensaje se explica cómo separar "/var" en su propio "dataset". Lo hace con el "Boot Environment" corriendo, lo que no solo me parece peligroso, sino que nos deja sin opciones si tenemos problemas y queremos dar marcha atrás.

Yo voy a crear un nuevo "Boot Enviroment", para no correr ningún riesgo. Si tenemos problemas, basta con activar el BE antiguo durante el arranque del equipo.

Lo primero que hacemos es crear un BE nuevo:

[root@tesalia z]# lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
Solaris10u6ZFS             yes      yes    yes       no     -
Solaris10u6ZFS_BACKUP      yes      no     no        yes    -

[root@tesalia z]# lucurr
Solaris10u6ZFS

[root@tesalia z]# lucreate -n Solaris10u6
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.
The device </dev/dsk/c5t0d0s0> is not a root device for any boot environment; cannot get BE ID.
Creating configuration for boot environment <Solaris10u6>.
Source boot environment is <Solaris10u6ZFS>.
Creating boot environment <Solaris10u6>.
Cloning file systems from boot environment <Solaris10u6ZFS> to create boot environment <Solaris10u6>.
Creating snapshot for <datos/ROOT/Solaris10u6ZFS> on <datos/ROOT/Solaris10u6ZFS@Solaris10u6>.
Creating clone for <datos/ROOT/Solaris10u6ZFS@Solaris10u6> on <datos/ROOT/Solaris10u6>.
Setting canmount=noauto for </> in zone <global> on <datos/ROOT/Solaris10u6>.
Saving existing file </boot/grub/menu.lst> in top level dataset for BE <Solaris10u6> as <mount-point>//boot/grub/menu.lst.prev.
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 <Solaris10u6> in GRUB menu
Population of boot environment <Solaris10u6> successful.
Creation of boot environment <Solaris10u6> successful.

[root@tesalia z]# lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
Solaris10u6ZFS             yes      yes    yes       no     -
Solaris10u6ZFS_BACKUP      yes      no     no        yes    -
Solaris10u6                yes      no     no        yes    -

Crear el nuevo BE nos lleva menos de un minuto. ¡¡Bien por ZFS!! (y sus "snapshots" y clones :-)).

Ahora montamos los "datasets" del BE recién creado, creamos el "dataset" nuevo y movemos los datos. A diferencia del mensaje indicado, nosotros utilizaremos el "/var" del nuevo BE, no del BE activo en este momento. Me parece menos arriesgado.

[root@tesalia z]# zfs set mountpoint=/mnt datos/ROOT/Solaris10u6
[root@tesalia z]# zfs mount datos/ROOT/Solaris10u6
[root@tesalia z]# cd /mnt
[root@tesalia mnt]# mv var var2
[root@tesalia mnt]# zfs create -o canmount=noauto datos/ROOT/Solaris10u6/var
[root@tesalia mnt]# zfs mount datos/ROOT/Solaris10u6/var
[root@tesalia mnt]# d | grep -i var
drwxr-xr-x  2 root   root        2 Jan 15 22:52 var
drwxr-xr-x 50 root   sys        50 Nov  3 20:09 var2
[root@tesalia mnt]# chgrp sys var
[root@tesalia mnt]# d | grep -i var
drwxr-xr-x  2 root   sys         2 Jan 15 22:52 var
drwxr-xr-x 50 root   sys        50 Nov  3 20:09 var2
[root@tesalia mnt]# zfs set compression=gzip-9 datos/ROOT/Solaris10u6/var
[root@tesalia mnt]# cd var2
[root@tesalia var2]# mv * ../var
[root@tesalia var2]# d
total 6
drwxr-xr-x  2 root sys    2 Jan 15 23:18 .
drwxr-xr-x 57 root root 119 Jan 15 22:53 ..
[root@tesalia var2]# cd ..
[root@tesalia mnt]# rmdir var2
[root@tesalia mnt]# cd
[root@tesalia /]# zfs umount datos/ROOT/Solaris10u6/var
[root@tesalia /]# zfs umount datos/ROOT/Solaris10u6
[root@tesalia /]# zfs get all datos/ROOT/Solaris10u6/var | head
NAME                        PROPERTY                 VALUE                    SOURCE
datos/ROOT/Solaris10u6/var  type                     filesystem               -
datos/ROOT/Solaris10u6/var  creation                 Thu Jan 15 23:39 2009    -
datos/ROOT/Solaris10u6/var  used                     5.13G                    -
datos/ROOT/Solaris10u6/var  available                56.1G                    -
datos/ROOT/Solaris10u6/var  referenced               5.13G                    -
datos/ROOT/Solaris10u6/var  compressratio            1.28x                    -
datos/ROOT/Solaris10u6/var  mounted                  yes                      -
datos/ROOT/Solaris10u6/var  quota                    none                     default
datos/ROOT/Solaris10u6/var  reservation              none                     default
[root@tesalia /]# luactivate Solaris10u6
System has findroot enabled GRUB
Generating boot-sign, partition and slice information for PBE <Solaris10u6ZFS>
A Live Upgrade Sync operation will be performed on startup of boot environment <Solaris10u6>.

Generating boot-sign for ABE <Solaris10u6>
Generating partition and slice information for ABE <Solaris10u6>
Copied boot menu from top level dataset.
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 -Fzfs /dev/dsk/c5t0d0s0 /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 <Solaris10u6> successful.
[root@tesalia /]# lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
Solaris10u6ZFS             yes      yes    no        no     -
Solaris10u6ZFS_BACKUP      yes      no     no        yes    -
Solaris10u6                yes      no     yes       no     -

Creamos un nuevo "dataset" para "/var" y le damos los permisos y los atributos apropiados. Luego movemos los datos necesarios al nuevo "dataset". Desmontamos los "datasets" y activamos el nuevo BE.

Ahora reiniciamos y arrancamos el BE nuevo:

[root@tesalia /]# lucurr
Solaris10u6
[root@tesalia /]# lustatus
Boot Environment           Is       Active Active    Can    Copy
Name                       Complete Now    On Reboot Delete Status
-------------------------- -------- ------ --------- ------ ----------
Solaris10u6ZFS             yes      no     no        yes    -
Solaris10u6ZFS_BACKUP      yes      no     no        yes    -
Solaris10u6                yes      yes    yes       no     -

Todo parece ir bien. Ya solo queda actualizar los scripts de backup para que tengan en cuenta la nueva situación.

El otro detalle a tener en cuenta es que cuando hagamos "snapshots" del BE, hay que recordar hacerlo en los dos "datasets".


Historia

  • 15/ene/09: Primera versión de esta página.



Python Zope ©2009 jcea@jcea.es

Más información sobre los OpenBadges

Donación BitCoin: 19niBN42ac2pqDQFx6GJZxry2JQSFvwAfS