Arranque desde red sin disco duro

Ahora no solo vamos a encender el ordenador, también le vamos a pasar el sistema operativo y su configuración. Un paso más a mi anterior receta.

Prerrequisitos

  • Un ordenador que soporte Wake on Lan o Boot on Lan.

Haber leido o tener a mano las recetas:

Introducción

El ordenador en cuestión se encenderá siguiendo los pasos dados en la receta Encendido remoto de un ordenador con Debian, mediante Wake On LAN . Entonces pedirá un servidor PXE. Para ello utilizaremos el servidor de dhcp 3 que soporta este tipo de servicio. Se necesita un servidor tftp, ya que es el único servidor soportado por PXE para la transmisión de ficheros. TFTP es un servidor ftp ligero. No tiene ningún tipo de autentificación así que cuidado con lo que ponéis en su directorio. Usaremos el servidor atftp. Necesitaremos un archivo llamado pxelinux.0 . Este archivo es el encargado de cargar el arranque, algo así como el GRUB en versión red. Existe una versión del GRUB que permite el arranque en red, aúnque parece ser que todavía no funciona correctamente.
pxelinux.0
es el que he usado yo. Seguramente existan versiones más nuevas, pero este me ha funcionado sin problemas. Necesitaremos también un núcleo para compilar y una imagen del sistema.

Configuración de dhcp

Necesitaremos el paquete debian dhcp3-server que será nuestro servidor PXE. Estas son las líneas que hay que añadir al dhcpd.conf

group {
 next-server 192.168.0.1;
 filename "/tftpboot/pxelinux.0";
 host maquina1 { hardware ethernet 00:06:29:30:6D:B4; fixed-address 192.168.0.12; }
}

Aquí estamos indicando de donde se obtiene el pxelinux.0 y que grupo de máquinas van a obtener el arranque. La línea de next-server es por si el servidor tftp está en una máquina diferente a la del servidor dhcp. Si no es así, se puede eliminar. Le asignamos una ip fija. No es necesario, pero nos puede venir bien a la hora de hacer los primeros seguimientos de la máquina.

Configuración del servidor tftp

Necesitaremos el paquete debian atftp .
Si lo usamos, deberemos tener en el archivo /etc/default/atftpd la siguiente configuración:

USE_INETD=false
OPTIONS="--daemon --port 69 --retry-timeout 5 --no-multicast --maxthread 100 
\ --verbose=6 --logfile /var/log/atftpd.log /tftpboot"

Esta es mi configuración. /tftpboot es el directorio donde debe iremos poniendo los ficheros que vamos a enviar.

Configurando el arranque

Desde ahora tomamos como directorio de trabajo /tftpboot. Copiamos aquí el archivo pxelinus.0. Creamos un directorio llamado pxelinux.cfg . Este contendrá los archivos de configuración para cada máquina. Yo usaré Default , genérico para todas las máquinas. Se puede llegar a personalizar para una máquina determinada o un grupo de maquinas. Este archivo contiene la configuración del arranque y una serie de parámetros que podemos indicarle al kernel.

label linux
        kernel bzImage
        append nfsaddrs=192.168.0.1 root=192.168.0.1:/tftpboot/192.168.0.12
  • label indica el sistema operativo que vamos a arrancar.
  • kernel indica como se llama el fichero que contiene el kernel.
  • append son una serie de parámetros que podemos pasar al kernel. En la configuración que os doy indicamos que el servidor nfs está en un servidor concreto y donde monta el directorio raíz. Otra opción podría ser cargar el directorio raíz en RAM, siempre y cuando nuestros ordenadores dispongan de los suficientes megas.

Configurando nuestro Linux

Vamos a configurar el sistema que vamos a cargar en los clientes. Primero compilaremos el kernel. Simplemente sugeriros que incluyáis todo lo que valláis a usar en el núcleo, para no cargarlo como módulos. Aquí surge una duda de como seguir. Si vamos a montar el directorio raíz en RAM o NFS deberemos incluir diferentes módulos.

  • NFS
  • requiere de los módulos File systems Kernel automonter support File systems -> Network Filesystems: NFS File System Suport y Root File System on NFS .

  • RAM
  • no requiere de módulos especiales.

Creando nuestro sistema de ficheros

Vamos a crear ahora nuestra imagen initrd. Esta es una imagen comprimida de nuestro sistema de ficheros que solo es necesaria si usamos RAM para montar nuestro sistema de ficheros. Si usamos NFS todos estos procesos quedarán reducidos a ejecutar la orden debootstrap sobre el directorio del NFS. Dicho directorio debe estar en el del servidor tftp (/tftpboot en nuestro caso)

  • Creamos un fichero del tamaño de nuestro file system dd if=/dev/zero of=/home/pepe/fsfile bs=1K count=130000 . Con esto he creado un archivo llamado fsfile con un tamaño de 130MB.
  • Lo formateamos. Aquí os sugiero que si vais a montar vuestro sistema de ficheros en RAM lo formateéis en ext2, el journalism no tiene sentido aquí. mke2fs -j -b 4096 /home/pepe/fsfile . Lo formateo a ext3
    (-j) con un inodo por cada 4 kb.
  • Montamos nuestro filesystem
    mount -o loop -t ext3 /home/pepe/fsfile
  • Lo "llenamos". Podemos montar un sistema "mínimo" de muchas maneras. La mas fácil es la orden debootstrap, aunque de mínima tenga poco (104Mb).
    debootstrap sarge /home/pepe/fsfile http://ftp.debian.org/debian . En el caso de querer algún paquete más podéis usar la orden chroot para cambiar el directorio raíz y luego usar el apt-get install
  • Cambiamos los archivos de configuración, los de arranque,etc.
  • Desmontamos el sistema de ficheros. umount /home/pepe/fsfile
  • Comprimimos nuestra imagen gzip -9 < fsfile > initrd.img
  • Lo ponemos en el directorio del servidor tftp.

Enlaces de interes