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.


Datos personales

Madrid, Madrid, Spain