Sistemas Operativos‎ > ‎GNU/Linux‎ > ‎

Boot PXE


Introducción


A veces cuando llega el momento de instalar un sistema GNU/Linux en un ordenador, no siempre podemos disponer de todas las formas de booteo ...
ya sea por que nos falta la unidad óptica o por que no podemos hacer un buen booteo por usb, o simplemente no siempre podemos disponer de un usb y hacer una instalación exitosa desde el .. para esos casos, tenemos la opción del boot PXE.

Ahora, ¿qué es el boot PXE? PXE proviene de "Preboot eXecution Enviroment" o "Ambiente de ejecución prebooteo, esta es una característica en BIOs no muy viejas que permiten bootear descargando un Kernel + RAMDisk de la red vía TFTP , contactando al servidor DHCP que implemente este protocolo (también llamado bootp)

Instalando un servidor PXE

Antes de proceder, revisamos nuestros requisitos, que serían una tarjeta de red y BIOS que soporten PXE.
El resto lo cubrimos en las siguientes secciones : un servidor DHCP con soporte de bootp habilitado y un servidor TFTP para descargar el Kernel y el RAMDisk, donde van a estar los módulos y archivos de instalación

desde ya, todos los comandos son ejecutados como superusuario (el usuario "root"), para ello podés iniciar como tal escribiendo "su" en la consola y escribiendo la contraseña del mismo [Escribir artículo sobre privilegios y enlazar]

Servidor DHCP/DNS

Dependiendo de cómo tengamos configurada la red, quizá necesitaremos deshabilitar el servidor DHCP que viene incorporado en nuestra router, yo voy a ejemplificar como sería con mi router :




(en mi caso toca destildar el servidor y guardar cambios) 

Usando dhcpd

Usando el gestor de paquetes de nuestra distribución, Instalamos dhcpd (ver Instalacion de Software bajo Linux), salvo que ya venga de serie, como es el caso de Slackware 
Luego, pasamos a editar con el editor preferido /etc/dhcpd.conf ejecutando el mismo como el superusuario (o root) [Escribir artículo sobre privilegios y enlazar]
yo tomé como base el archivo de ejemplo que viene en Slackware


# dhcpd.conf
#
# Configuration file for ISC dhcpd
#
# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;
ddns-update-style none;
 
# Allow bootp requests
allow bootp;
 
# Point to the TFTP server:
next-server 192.168.0.1;
 
# Default lease is 1 week (604800 sec.)
default-lease-time 604800;
# Max lease is 4 weeks (2419200 sec.)
max-lease-time 2419200;
 
subnet 192.168.0.0 netmask 255.255.255.0 {
   option domain-name "my.lan";
   option broadcast-address 192.168.0.255;
   option subnet-mask 255.255.255.0;
   option domain-name-servers 192.168.0.1;
   option routers 192.168.0.10;
   range dynamic-bootp 192.168.0.50 192.168.0.100;
   use-host-decl-names on;
   if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
     filename "/slackware-13.0/pxelinux.0";
   }
}

Como verán, las linea
s destacadas son las que requieren nuestra especial atención.
esto debería ir out-of-the box (sin tocar mucho) pero prestando atención a lo que está resaltado, especialmente a routers, que es donde declaramos gateways, y domain-name-servers que es donde declaramos el servidor dns (cosa que está integrada en los mismos routers, así que podemos poner su dirección aquí), y next-server, que es la ip del servidor tftp ...

hecho esto, tenemos el servidor dhcp configurado, pero todavía no vamos a iniciar/reiniciar el servicio, ya que nos quedan otros detalles para pulir .... 


Usando dnsmasq

Con dnsmasq la historia es más simple : lo instalamos y simplemente ejecutamos el comando siguiendo este protocolo : dnsmasq dhcp-boot={pxeboot file}, {hostname of tftp server}, {ip address of tftpserver}

dnsmasq dhcp-boot=/slackware-13.0/pxelinux.0,Symphony,192.168.0.100

tenemos que fijarnos que Symphony resuelva a una IP, caso que no, podemos modificar nuestro /etc/hosts [agregar un how-to para esto]

Nota : si usás este método y querés usar dnsmasq como servidor tftp, prestá atención a la sección de Servidor TFTP ya que hay que agregar dos cositas al comando !

Servidor TFTP

En esta sección nos encargaremos de tener el servidor TFTP armado y de tener la estructura de directorios necesaria, nótese que si usaste el método de dhcpd, al finalizar este capítulo tendrás que reiniciar el servicio! (en algunas distros es /etc/rc.d/rc.dhcpd restart o /etc/init.d/dhcpd restart | te toca fijarte)

Usando inetd/xinetd

Este método es bastante sencillo y como buena parte de los sistemas *NIX viene con este daemon, es el más práctico (para información de inetd ver Referencias)
Para indicarle a inetd que queremos lanzar un servidor tftp, editamos /etc/inetd.conf usando nuestro editor favorito como superusuario [Escribir artículo sobre privilegios y enlazar]
y buscamos una linea similar a esta : 

#tftp  dgram  udp  wait  root  /usr/sbin/in.tftpd  in.tftpd -v -s /tftpboot -r blksize

y le sacamos el caracter de comentario '#' para habilitarlo ...
nótese que el parámetro a -s es /tftpboot, el cual es la ruta al directorio donde van a servirse los archivos mediante tftp
para nuestro ejemplo, lo dejamos como está (asegurate que ese directorio exista ! - podés crear el mismo ejecutando 'makedir /tftpboot' como superusuario)
hecho esto, ya tenemos el servidor tftp configurado con inetd/xinetd

Usando dnsmasq


Este método es de lo más sencillo si usamos dnsmasq, ya que solo tenemos que agregar esto al comando que ejecutamos : "--enable-tftp --tftp-root=/tftpboot" (sin comillas)
quedando en mi caso :

dnsmasq --enable-tftp --tftp-root=/tftpboot dhcp-boot=/slackware-13.0/pxelinux.0,Symphony,192.168.0.100


y listo, servidor dhcp+dns+tftp todo en uno !

Estructura de directorios

Esta sección es muy específica de cada distribución, ya que cada de distribución a distribución cambia como se distribuye y usan su Imagen PXE/Kernel(s) y RAMDisk, y aún así, estos exigen su propia estructura de directorios, en esta sección se citan ejemplos de como armar dicha estructura  ...

Slackware

En el caso de Slackware los archivos necesarios están en el DVD de instalación, un script que nos arma rápidamente la estructura leyendo desde /media/SlackDVD y copiando a /tftpboot sería este :

export Slack=/media/SlackDVD
export TFTP=/tftpboot/slackware-13.0
 
mkdir -p $TFTP/pxelinux.cfg
cp /usr/lib/syslinux/pxelinux.0 $TFTP
cp $Slack/isolinux/f2.txt $TFTP
cp $Slack/isolinux/message.txt $TFTP
cp $Slack/isolinux/initrd.img $TFTP
cp $Slack/usb-and-pxe-installers/pxelinux.cfg_default $TFTP/pxelinux.cfg/default
cp -a $Slack/kernels $TFTP 

con esto finalizaríamos la configuración del server PXE en slackware, y dependiendo si usaste o no el método de inetd/xinetd, tendrías que reiniciarlo, de esta forma :

/etc/rc.d/rc.inetd restart


un detalle en la instalación es la detección de la red, hay que fijarse de la forma más tradicional : un ping
en este caso podemos hacer un ping a google.com y confirmar si disponemos de conexión, caso que no, ejecutar :

network # fijate si sabes el modulo de tu placa, o apretá enter para que se trate de detectar
dhcpcd eth0

y desde acá en adelante el terreno es familiar, podemos elegir un mirror de internet, una compartición samba/nfs, etc ...

CentOS NetInstall

En este caso procedemos montando la iso del netinstall en /media/mount para proceder a armar los directorios (podés elegir otra ruta y cambiar el script) :

#Parámetros básicos
export TFTP=/tftpboot
export CentOSNetInst=/media/mount
export SysLinuxDir=/usr/share/syslinux
 
#Copiamos los Archivos a la raiz ..
cp $SysLinuxDir/pxelinux.0 $TFTP
cp $SysLinuxDir/menu.c32 $TFTP
cp $SysLinuxDir/memdisk $TFTP
cp $SysLinuxDir/mboot.c32 $TFTP
cp $SysLinuxDir/chain.c32 $TFTP
 
# Copiamos kernel & ramdisk
# instala el paquete syslinux y curralo de ahi, o buscalo en el CD
mkdir $TFTP/pxelinux.cfg
cp $CentOSNetInst/isolinux/* $TFTP
mv $TFTP/isolinux.cfg $TFTP/pxelinux.cfg/default
 
#Recordar tener el el DHCPd con el bootp habilitado, tambien el Server TFTP !
 

y la instalación lanza sin problemas, también, como con slackware, si usamos inetd/xinetd, a reiniciarlo !

/etc/rc.d/rc.inetd restart

Referencias


ą
braulio wiki,
9 oct. 2010 14:56
Comments