Lo hice y lo entendí

El blog de Vicente Navarro
05 sep

Iniciar una instalación de Debian por red

El conjunto de piezas de PC más pequeño que sirva para hacer algo es: CPU, placa base con procesador de vídeo integrado (opcionalmente con una CPU integrada también, como en el caso de las VIA EPIA) y fuente de alimentación.

Con esta configuración necesitaríamos arrancar de la red para poder hacer algo y estaríamos hablando de un sistema diskless.

Si queremos que el sistema sea autónomo, además de las piezas anteriores, necesita un sistema de almacenamiento propio (disco duro, memoria USB, unidad óptica, disquetera) del que arrancar, que normalmente será un disco duro. Supongamos que tenemos un sistema mínimo sólo con un disco duro, queremos instalarle Debian y no tenermos una unidad óptica externa ni nada que podamos usar para hacer la instalación estándar. En ese caso, necesitaremos arrancar la instalación por red.

Es un proceso bastante sencillo, aunque necesitaremos una cierta infraestructura en otro sistema ya instalado del que el sistema a instalar obtendrá todo lo necesario. La máquina a instalar ha de soportar arrancar desde la red por PXE, una combinación de DHCP y TFTP que permite asignar una dirección IP al sistema cliente y a continuación pasarle los ficheros necesarios para que lo haga.

En mi caso, como el router ADSL que uso ya es servidor de DHCP, es deseable evitar posibles interferencias al montar un nuevo servidor DHCP a pesar de que, según la Wikipedia, esto en teoría se podría evitar:

The PXE Client/Server Protocol was designed so it can be used in the same network as an existing DHCP environment without interference

Por ello, y como el PC destinado a servidor de arranque tiene dos interfaces de red, uno normalmente sin usar (eth0) y otro conectado al router (eth1), yo prefiero independizar ambas redes, de tal forma que si conectamos con un cable cruzado la toma de red del sistema a instalar con el interfaz sin usar, estamos listos para comenzar la configuración del sistema.

Como la red del router es la 192.168.1.0/255.255.255.0, vamos a usar una distinta, la 10.0.0.0/255.255.255.0 para la red entre el servidor de instalación y el sistema a instalar. Así que configuramos el interfaz en el fichero /etc/network/interfaces:

auto eth0
iface eth0 inet static
    address 10.0.0.1
    netmask 255.255.255.0
    gateway 10.0.0.1

y lo levantamos con “ifup eth0“.

A continuación, instalamos el servidor de DHCP y el de TFTP (nos preguntará si queremos que funcione bajo el inetd o independiente, en nuestro caso, es mucho mejor lo primero):

# apt-get install dhcp3-server
# apt-get install tftp-hpa

El siguiente paso es editar el fichero /etc/dhcp3/dhcpd.conf y poner una configuración similar a la siguiente (estas son todas las líneas sin comentar en mi caso):

ddns-update-style none;

default-lease-time 3600;
max-lease-time 86400;

allow booting;
allow bootp;

subnet 192.168.1.0 netmask 255.255.255.0 {
}

subnet 10.0.0.0 netmask 255.255.255.0 {
   range 10.0.0.2 10.0.0.254;
   option broadcast-address 10.0.0.255;
   option routers 10.0.0.1;
   option domain-name-servers 80.58.61.250;
   option domain-name-servers 80.58.61.254;
}

group {
  next-server 10.0.0.1;
  host peggy {
    hardware ethernet  00:41:64:ED:29:D3;
    filename "pxelinux.0";
  }
}

En ella, le decimos que ignore las peticiones de la red 192.168.1.0/24 y que atienda las de la red 10.0.0.0/24 concediendo IPs en el rango 10.0.0.2-10.0.0.254. También especificamos la IP del servidor de instalación (10.0.0.1) y dentro del grupo de opciones específicas de la máquina a instalar (peggy), la dirección MAC del sistema (00:41:64:ED:29:D3). Si no la sabemos, hay que tener en cuenta que la MAC suele aparecer en la pantalla mientras hace intentos de arranque (que en este punto deberían ser infructuosos).

El fichero pxelinux.0 que le especificamos es el gestor de arranque PXELINUX (como LILO o GRUB), del mismo autor que el SYSLINUX, con el que ya trabajamos en Arrancar Knoppix desde una memoria USB usando SYSLINUX.

Reiniciamos el servidor para que use la nueva configuración.

# /etc/init.d/dhcp3-server restart
Stopping DHCP server: dhcpd3.
Starting DHCP server: dhcpd3.

Ahora tenemos que preparar los ficheros necesarios para arrancar la instalación. Para ello, vamos al directorio de imágenes de arranque del TFTP:

cd /var/lib/tftpboot/

y nos bajamos a este directorio todos los archivos necesarios (entre los que está, por ejemplo, el pxelinux.0):

wget -erobots=off -np -r -l 0 -nH --cut-dirs=8 -R 'index.html*'

http://http.us.debian.org/debian/dists/etch/main/installer-i386/current/images/netboot/

Sólo falta un detalle, y es que necesitamos que el sistema a instalar pueda acceder a Internet para poder descargarse los paquetes necesarios de Debian y de momento está en la red aislada 10.0.0.0/24. Para ello, hemos de configurar NAT en el servidor de instalación para que todo lo que sea enviado de salida por el interfaz eth1 sea disfrazado (MASQUERADE) como proveniente de eth0 al igual que hace el router con los paquetes de nuestra red (Linux NAT Howto: I just want masquerading! Help!)

echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

¡Y ya está todo listo! En este punto, al encender nuestro sistema debería de recibir una IP y luego la imagen de arranque pxelinux.0 y el pxelinux.cfg/default, tras lo cual comenzará el programa de instalación totalmente estándar de Debian. Por cierto, el fichero de configuración del PXELINUX, el pxelinux.cfg/default es totalmente comprensible y tiene una apariencia similar a la que pueden tener el lilo.conf, el grub/menu.lst o el syslinux.cfg:

DISPLAY debian-installer/i386/boot-screens/boot.txt

F1 debian-installer/i386/boot-screens/f1.txt
F2 debian-installer/i386/boot-screens/f2.txt
F3 debian-installer/i386/boot-screens/f3.txt
F4 debian-installer/i386/boot-screens/f4.txt
F5 debian-installer/i386/boot-screens/f5.txt
F6 debian-installer/i386/boot-screens/f6.txt
F7 debian-installer/i386/boot-screens/f7.txt
F8 debian-installer/i386/boot-screens/f8.txt
F9 debian-installer/i386/boot-screens/f9.txt
F0 debian-installer/i386/boot-screens/f10.txt

DEFAULT install

LABEL install
	kernel debian-installer/i386/linux
	append vga=normal initrd=debian-installer/i386/initrd.gz -- 
LABEL linux
	kernel debian-installer/i386/linux
	append vga=normal initrd=debian-installer/i386/initrd.gz -- 

LABEL expert
	kernel debian-installer/i386/linux
	append priority=low vga=normal initrd=debian-installer/i386/initrd.gz -- 

LABEL rescue
	kernel debian-installer/i386/linux
	append vga=normal initrd=debian-installer/i386/initrd.gz rescue/enable=true -- 

LABEL auto
	kernel debian-installer/i386/linux
	append auto=true priority=critical vga=normal initrd=debian-installer/i386/initrd.gz -- 

PROMPT 1
TIMEOUT 0

Referencia: Debian GNU/Linux Installation Guide: Preparing Files for TFTP Net Booting

Entradas relacionadas

3 Comentarios a “Iniciar una instalación de Debian por red”

  • Mefisto dice:

    Tengo una duda, y es que si tengo 20 maquinas (clientes) a los que le quiero instalar debian, ene l archivo de configuracion del DHCP tengo que especificar las 20 MAC addresses??? o hay alguna forma de automatizar este proceso?

  • @Mefisto Yo diría que sí que es necesario. He probado con algo así:

    group {
      next-server 10.0.0.1;
      filename "pxelinux.0";
    }

    sin especificar la MAC para ver si cualquier sistema arranca pero no es así. Y lo que se puede leer en el propio “man dhcpd.conf” parece corroborar mi idea:

    Imagine  that  you  have  a site with a lot of NCD X-Terminals.   These
    terminals come in a variety of models, and you want to specify the boot
    files for each model.   One way to do this would be to have host decla-
    rations for each server and group them by model:
    
    group {
      filename "Xncd19r";
      next-server ncd-booter;
    
      host ncd1 { hardware ethernet 0:c0:c3:49:2b:57; }
      host ncd4 { hardware ethernet 0:c0:c3:80:fc:32; }
      host ncd8 { hardware ethernet 0:c0:c3:22:46:81; }
    }
    
    group {
      filename "Xncd19c";
      next-server ncd-booter;
    
      host ncd2 { hardware ethernet 0:c0:c3:88:2d:81; }
      host ncd3 { hardware ethernet 0:c0:c3:00:14:11; }
    }

Trackbacks y pingbacks:

Tema LHYLE09, creado por Vicente Navarro