Lihuen
RSSRSS AtomAtom

Configurar clientes livianos con placas de red ISA en LTSP 5

IMPORTANTE: El cd de LTSP de Lihuen 3 está preparado para levantar placas de red ISA 3C509 y NE, antes de probar la configuración que describimos verifique si es necesario cambiar algo o funciona por defecto.

Placas de Red ISA

El problema es que el kernel linux no puede detectar automáticamente placas isa y cargar sus módulos, por lo que habría que hacerlo manualmente. Esta no es una opción posible si tenemos un cliente liviano.

LTSP 4 tenía soporte para cargar los módulos necesarios pasándole determinadas opciones al kernel.

LTSP 5 recomienda utilizar los kernels e imagenes initrd incluidos en la distribución, pero si queremos dar soporte a placas de red isa tendremos que crear nuestra propia imagen initrd.

En la documentación de versiones anteriores de LTSP podemos ver instrucciones para hacer funcionar estas placas de red, pero estas configuraciones no funcionan si no hay una imagen initrd con determinadas características del lado del cliente.

En las siguientes líneas detallamos como crear una imagen initrd y configurar al servidor para poder utilizar clientes con placas de red ISA.

En los clientes

Hay que descargar la imagen de etherboot que corresponda a nuestra placa (gpxe parece no soportar bien las placas ISA y las imagenes universales pueden no reconocer estas placas).

En el 90% de los casos las placas ISA funcionan con los drivers

  • 3c509
  • ne

Así que es conveniente empezar probando estos drivers.

Configurando el servidor

La forma sugerida para dar soporte a las placas de red isa era agregar algo como lo siguiente por cada cliente con placa de red isa en el archivo de configuración /etc/dhcp3/dhcpd.conf

option option-128 code 128 = string;
option option-129 code 129 = text;
group   {
    use-host-decl-names       on;
    option log-servers        192.168.0.1;
     host ws102 {
         hardware ethernet     cc:cc:cc:cc:cc:cc;
         option option-128       e4:45:74:68:00:00;
         option option-129       "NIC=ne IO=0x300";
         fixed-address         192.168.0.40;
         filename "/ltsp/vmlinuz";
     }
}
 

Ahora vamos a hacer algo distinto, vamos a utilizar pxelinux para enviar la imagen del kernel e imagen initrd al cliente (tal como lo hace la configuración por defecto) solo que vamos a hacer que los clientes con placas ISA reciban una configuración distinta. Así que agregamos la siguiente configuración en lugar de la que se usaba antes:

group   {
    use-host-decl-names       on;
    option log-servers        192.168.0.1;
     host ws102 {
         hardware ethernet     cc:cc:cc:cc:cc:cc;
         #Lo siguiente ya no será utilizado
         #option option-128       e4:45:74:68:00:00;
         #option option-129       "NIC=ne IO=0x300";
         fixed-address         192.168.0.40;
         filename "/ltsp/placas_isa/pxelinux.0"; #Esta va a ser la carpeta que contenga nuestra imagen initrd modificada
     }
}
 

En /var/lib/tftpboot/ltsp vamos a encontrar el archivo pxelinux.0 utilizado por defecto, ahora debemos crear la carpeta placas_isa tal como se la nombro en el archivo de configuración de dhcp más arriba y copiar los siguientes archivos dentro de ella:

pxelinux.0
pxelinux.cfg
vmlinuz-2.6.18-4-486

Note que la versión del kernel puede ser distinta, aunque recomendamos que sea para la arquitectura 486 y no 686 de modo que nuestro kernel funcione en la mayor variedad posible de hardware (si un cliente liviano se reinicia mientras está booteando es probable que estemos usando un kernel para una arquitectura más nueva que la soportada por el cliente).

Note también que en el siguiente paso crearemos una imagen initrd, esta imagen contiene módulos del kernel, por lo tanto hay que tener cuidado de generarla para la versión de kernel que copiemos en /var/lib/tftpboot/ltsp/placas_isa/.

Generando la nueva imagen initrd en el servidor

Para esto hay que:

  • Instalar initramfs-tools
  • Configurarlo
  • Generar una imagen para el kernel 2.6.18-4-486 (por ejemplo)
  • Copiarla al directorio donde pusimos la copia de pxelinux.0

Configurando initamfs-tools

Luego de instalar initramfs-tools, debemos que configurarlo de la siguiente manera:

  • Archivo: /etc/initramfs-tools/modules

(Estos son módulos del kernel que deben ser cargados, en general son suficientes para casi cualquier placa isa)

ne
3c509
  • Archivo: /etc/initramfs-tools/initramfs.conf

(Indicamos que hay que incluir los módulos para booteo por red y que nuestro / va a ser montado usando nfs)

MODULES=netboot
BUSYBOX=y
BOOT=nfs
DEVICE=eth0
NFSROOT=auto
  • Debemos crear el script /etc/initramfs-tools/scripts/nfs-top/placas.sh con el contenido de abajo y ponerle permisos de ejecución

(Este script va a ser el que cargue el módulo de la placa de red)

#!/bin/sh
 
PREREQ=""
prereqs()
{
        echo "$PREREQ"
}
case $1 in
prereqs)
        prereqs
        exit 0
        ;;
esac
 
getParam(){
# Recibe el argumento buscado y la línea donde buscarlo e imprime el valor del argumento
        for param in $2; do
                if [ "$(echo $param | cut -d= -f1)" == "$1" ]; then
                        echo $param | cut -d= -f2
                        break
                fi
        done
}
 
kernelArgs=$(cat /proc/cmdline)
 
NIC=$(getParam NIC "$kernelArgs")
if [ "$NIC" != "" ]; then
        nicArgs=""
 
        IO=$(getParam IO "$kernelArgs")
        IRQ=$(getParam IRQ "$kernelArgs")
        if [ "$IO" != "" ]; then
                nicArgs="$nicArgs io=$IO"
        fi
        if [ "$IRQ" != "" ]; then
                nicArgs="$nicArgs irq=$IRQ"
        fi
 
 
        echo -e "Cargando módulo para la placa indicada como argumento al kernel,\ncomando: modprobe $NIC$nicArgs"
        modprobe $NIC$nicArgs
fi
 
DEBUG=$(getParam DEBUG "$kernelArgs")
if [ "$DEBUG" == "yes" ]; then
        echo -e "Pausa por la opcion debug, esperando 20 segundos...\a"
        sleep 20
fi

Generando la imagen

Esto es muy simple, el siguiente comando va a generar una imagen initrd para el kernel versión 2.6.18-4-486 (debemos tenerlo instalado en el servidor aunque no lo estemos usando) en el directorio /var/lib/tftpboot/ltsp/placas_isa/

mkinitramfs 2.6.18-4-486 -o /var/lib/tftpboot/ltsp/placas_isa/initramfs-2.6.18-4-486-placasisa

El siguiente paso es configurar pxelinux para que use nuestra imagen initramfs y le pase los argumentos que querramos

Configurando pxelinux

Ahora podremos pasarle a nuestros clientes los argumentos DEBUG (detiene el booteo por unos segundos luego de intentar cargar los módulos de la placa de red), NIC (determina que módulo cargar), IO (Corresponde al argumento io al cargar el módulo) e IRQ (corresponde al argumento irq al cargar el módulo).

Para que nuestra copia de pxelinux utilice nuestra imagen initrd y pase los argumentos correspondientes al kernel debemos editar el archivo /var/lib/tftpboot/ltsp/placas_isa/pxelinux.cfg/default

Simplemente si teníamos

DEFAULT vmlinuz ro initrd=initrd.img root=/dev/nfs ip=dhcp

Pondremos el nombre de nuestra imagen initrd, de nuestro kernel y las opciones que precisemos. Por ejemplo para una placa de red que use el módulo ne

DEFAULT vmlinuz-2.6.18-4-486 ro initrd=initramfs-2.6.18-4-486-placasisa root=/dev/nfs ip=dhcp NIC=ne IO=0x300

Otro ejemplo para placas 3com

DEFAULT vmlinuz-2.6.18-4-486 ro initrd=initramfs-2.6.18-4-486-placasisa root=/dev/nfs ip=dhcp NIC=3c509

Si el sistema está fallando al cargar el módulo y queremos ver por qué

DEFAULT vmlinuz-2.6.18-4-486 ro initrd=initramfs-2.6.18-4-486-placasisa root=/dev/nfs ip=dhcp NIC=3c509 DEBUG=yes

¿Cómo funciona esto?

  1. Al arrancar el cliente liviano carga etherboot, gpxe o lo que corresponda, luego hace una petición dhcp.
  2. El servidor contesta pasando como información (además de la ip y la máscara que el cliente debe cargar) el path del archivo /ltsp/placas_isa/pxelinux.0.
  3. El cliente lo descarga con tftp y lo ejecuta como si fuera un kernel, pxelinux obtiene por tftp su configuración en el archivo /ltsp/placas_isa/pxelinux.cfg/default.
  4. pxelinux lee de la configuración que kernel e imagen initrd debe descargar y que argumentos debe pasarles al kernel.
  5. pxelinux descarga el kernel y la imagen initrd
  6. pxelinux ejecuta el kernel
  7. el kernel de linux monta la imagen initrd y ejecuta init
  8. init ejecuta los scripts de arranque (entre ellos placas.sh)
  9. placas.sh lee la línea de comandos del kernel y carga el módulo que indicamos con el argumento NIC