domingo, 31 de agosto de 2008

Instalar FreeBSD en máquinas lentas o con poco espacio

Un escenario que surge con frecuencia en un datacenter es el siguiente:

  1. Tenemos una máquina lenta o antigua, donde deseamos instalar la última versión de FreeBSD.
  2. No es viable construir el world o el kernel directamente en esa máquina, ya que nos llevaría muchos días.
  3. Se dispone de otra máquina más potente (con FreeBSD instalado, claro).

El objetivo consiste en aprovechar los recursos de la máquina potente para construir el world y el kernel cómodamente, e instalarlo en la otra máquina. Fijaos que las plataformas pueden ser totalmente distintas, de hecho nuestro caso lo ilustraremos con una vieja spar64 (una Ultra Sparc del año 2000 más o menos) y una recién i386.

Supongamos que la situación es la siguiente: la vieja y lenta máquina es una sparc64, de nombre riemann, y la nueva y potente es una i386 de nombre gauss.


Actualización de los fuentes en gauss
Lo primero de todo es disponer en gauss de un juego completo de fuentes bajo /usr/src, totalmente actualizado a la release que hay que construir. En nuestro caso, vamos a suponer que se trata de FreeBSD 7.0, la última release estable en el momento de escribir estas líneas. En el handbook se explica con todo detalle el proceso de actualización de las fuentes.

Ficheros /etc/make.conf.riemann y /etc/src.conf.riemann
Configuramos /etc/make.conf y /etc/src.conf (de riemann) de acuerdo a la situación de riemann, y los copiamos a gauss, con los nombres /etc/make.conf.sparc64 y /etc/src.conf.sparc64, respectivamente.

Construcción del world en gauss
Ponemos el comando entero en varias líneas, para que sea más cómodo de leer:

# env -i \
TARGET=sparc64 \
__MAKE_CONF=/etc/make.conf.sparc64 \
SRCCONF=/etc/src.conf.sparc64 \
make buildworld

Este comando debe ser lanzado en gauss, bajo la carpeta /usr/src. El significado de las variables es:
  • TARGET. Es la plataforma para la que construimos el world. En nuestro caso es sparc64 (sí, es perfectamente posible construir el world para una plataforma distinta a la que ejecutamos).
  • __MAKE_CONF. Es el archivo make.conf que se usa para construir el world. Obviamente, el elegido es el de la vieja sparc64, no el de nuestra i386, que puede una configuración totalmente incompatible con la sparc64.
  • SRCCONF. Es el archivo src.conf utilizado para construir el world. Como antes, las opciones de construcción del world de la sparc64 no tienen porqué coincidir con las de la i386.
Construcción del kernel en gauss
El archivo de configuración del kernel de riemann lo copiamos también a gauss, a la ruta:
/usr/src/sys/sparc64/conf/kernel.sparc64, y de nuevo bajo /usr/src, construimos el kernel para la sparc64 desde gauss, de modo análogo a como se hizo para el world:

# env -i \
__MAKE_CONF=/etc/make.conf.sparc64 \
TARGET=sparc64 \
make buildkernel KERNCONF=kernel.sparc64

Compartir por NFS el sistema de ficheros completo de riemann
Para que podamos instalar en riemann el world y el kernel construidos en gauss, necesitamos exportar por nfs el arbol completo de directorios de riemann. La manera más sencilla de hacerlo es situar en el archivo /etc/exports únicamente la línea:

/ -alldirs -maproot=root gauss

(asegurarse de que gauss sea un nombre reconocido por riemman, añadiendo la entrada en /etc/hosts en caso de que el DNS de riemann no sepa cómo traducir a una dirección IP el nombre gauss)

Pasamos riemann a modo single
Para realizar este paso con mayor comodidad, lo mejor es tener un acceso por consola a riemann, tal y como explica el handbook, o bien tener acceso directo a la máquina bajo un teclado y un terminal (cosa nada fácil si el espacio del datacenter es limitado o bien no hay posibilidad siquiera de acceder físicamente a la máquina). Tanto si tenemos un acceso por consola como directo por un terminal, ejecutamos, como root:

# shutdown now

Una vez en modo single, activamos el NFS de nuevo, porque en el paso a single se paran todos los servicios de red:

# /etc/rc.d/rpcbind start
# /etc/rc.d/mountd start
# /etc/rc.d/nfsd start
# /etc/rc.d/statd start
# /etc/rc.d/lockd start

(mirar en el handbook cómo activar un servidor NFS en FreeBSD, en caso de no tenerlo ya configurado)

Montaje de la carpeta raíz de riemann en gauss
Para montar el directorio raíz de riemann en el /mnt gauss, simplemente ejecutamos, desde gauss:

# mount_nfs riemann:/ /mnt

Instalación del world y del kernel
Por último, desde gauss, instalamos el world y el kernel, tomando como carpeta base /mnt, es decir:

# env -i TARGET=sparc64 make DESTDIR=/mnt installkernel KERNCONF=kernel.sparc64
# env -i TARGET=sparc64 make DESTDIR=/mnt installworld

No debemos olvidar que, en su caso, puede ser necesario lanzar mergemaster -p y mergemaster -iU en riemann, el primero antes del buildworld y el segundo después.

Reiniciar riemann
Si todo ha ido bien, rebotamos riemann y tendremos nuestra nueva release perfectamente instalada.


viernes, 29 de agosto de 2008

Copias de respaldo cifradas con GELI

Con frecuencia surge la necesidad de realizar una copia de seguridad de datos sensibles de nuestro ordenador, que no puede ser directamente almacenada en un DVD, ya que pondría en riesgo la confidencialidad de tales datos. Por ejemplo, certificados de usuario en claro, fotos comprometidas (je je) o simplemente expedientes confidenciales de nuestra compañía. ¿Cómo podemos almacenar una copia de seguridad en un lugar seguro, de modo que sea sencillo de recuperar y garantice a su vez la confidencialidad en caso de extravío o robo del soporte? Veamos una solución sencilla mediante la magnífica herramienta GELI que ofrece FreeBSD, de la cual se puede encontrar más información en el handbook, (es necesario dar soporte al núcleo mediante el device crypto):

Las posibilidades de GELI son amplísimas; aquí nos reduciremos a la gestión de DVDs cifrados.

La idea es crear un archivo con una imagen UFS, convenientemente cifrada, y luego quemar esa imagen directamente al DVD.

La imagen que vamos a crear se llamará backupCifrado.img, de tamaño 4480 M, que es la capacidad de un DVD normal. Nos ayudaremos del comando dd, rellenando la imagen de datos aleatorios procedentes de /dev/random:

# dd if=/dev/random of=backupCifrado.img bs=1m count=4480
4480+0 records in
4480+0 records out
4697620480 bytes transferred in 482.075108 secs (9753215 bytes/sec)

A continuación, mediante mdconfig, le asociamos a esta imagen un dispositivo que pueda ser montado:

# mdconfig -a -t vnode -S 2048 -f backupCifrado.img
md0

Es de especial importancia el argumento -S 2048, que indica el tamaño, en bytes, de cada sector de la imagen. Fijaos que no se elige 2048 aleatoriamente, sino que coincide con el de los soportes ópticos como el DVD o el CD. La respuesta del comando será un escueto md0, dependiendo del número de dispositivos de este tipo que hayamos montado.

A continuación, iniciamos GELI sobre el /dev/md0 recién creado, donde se nos preguntará la contraseña de cifrado:

# geli init -s 2048 /dev/md0
Enter new passphrase:
Reenter new passphrase:
# geli attach /dev/md0
Enter passphrase:

El sistema creará un nuevo dispositivo /dev/md0.eli, y la infraestructura de GELI quedará lista para cifrar cualquier dato grabado o leído en el dispositivo /dev/md0.eli (el cifrado por defecto es AES, aunque Blowfish puede ser más potente, ver geli (8) ).
Procedemos a formatear md0.eli con un UFS convencional, pero con la flag -m 0, para aprovechar al máximo el espacio destinado al backup (sí, ya sé que esto tiene consecuencias en el rendimiento, pero para respaldos de sólo lectura es perfectamente válido).


# newfs -m 0 /dev/md0.eli
..........
super-block backups (for fsck -b #) at:

160, 22688, 45216, 67744
..............

Bien, ahora montamos nuestro sistema de ficheros sobre /mnt, por ejemplo:

# mount /dev/md0.eli /mnt

Ya podemos colocar en /mnt la copia de seguridad o los archivos confidenciales que deseemos, y cuando acabemos desmontamos /mnt y paramos GELI:

# umount /mnt
# geli detach /dev/md0

Por ultimo, grabamos a un DVD la imagen backupCifrado.img (que es, es última instancia, donde reside nuestro respaldo). Pero ojo, lo grabamos como una imagen directamente, no como archivo de un sistema de ficheros cd9660:

# growisofs -dvd-compat -Z /dev/cd0=
backupCifrado.img

Si no tenemos configurada la grabadora, tiramos del handbook; viene perfectamente explicado (en inglés, claro, aunque hay traducción al español).

Ahora llega la hora de la verdad, la prueba de fuego: intentaremos montar nuestro DVD cifrado:

# geli attach -r /dev/cd0
Enter new passphrase:

Introducimos la contraseña correcta, y voilá, se crea el dispositivo /dev/cd0.eli, que podemos montar en /cdrom:

# mount -o ro /dev/cd0.eli /cdrom

No se nos debe olvidar desmontar todo cuando terminemos de examinar nuestro DVD cifrado:

# umount /cdrom
# geli detach /dev/cd0.eli
# eject

¡ A disfrutar !

Datos personales

Madrid, Madrid, Spain