Lihuen
RSSRSS AtomAtom

Diferencia entre revisiones de «Configurar clientes livianos con placas de red ISA en LTSP 5»

(Como funciona esto)
(Configurando initamfs-tools)
Línea 58: Línea 58:
  
 
*Archivo: /etc/initramfs-tools/initramfs.conf
 
*Archivo: /etc/initramfs-tools/initramfs.conf
<nowiki>
+
<source lang="bash">
 
#
 
#
 
# initramfs.conf
 
# initramfs.conf
Línea 112: Línea 112:
  
 
NFSROOT=auto
 
NFSROOT=auto
</nowiki>
+
</source>
  
 
*Debemos crear el script /etc/initramfs-tools/scripts/nfs-top/placas.sh con el contenido de abajo y ponerle permisos de ejecución:
 
*Debemos crear el script /etc/initramfs-tools/scripts/nfs-top/placas.sh con el contenido de abajo y ponerle permisos de ejecución:
Línea 166: Línea 166:
 
fi
 
fi
 
</source>
 
</source>
 +
 
===Generando la imagen===
 
===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/
 
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/

Revisión de 20:27 7 sep 2008

Placas de Red ISA

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.

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
ne
3c509

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

  • Archivo: /etc/initramfs-tools/initramfs.conf
#
# initramfs.conf
# Configuration file for mkinitramfs(8). See initramfs.conf(5).
#
 
#
# MODULES: [ most | netboot | dep | list ]
#
# most - Add all framebuffer, acpi, filesystem, and harddrive drivers.
#
# dep - Try and guess which modules to load.
#
# netboot - Add the base modules, network modules, but skip block devices.
#
# list - Only include modules from the 'additional modules' list
#
 
MODULES=netboot
 
# BUSYBOX: [ y | n ]
#
# Use busybox if available.
#
 
BUSYBOX=y
 
#
# NFS Section of the config.
#
 
#
# BOOT: [ local | nfs ]
#
# local - Boot off of local media (harddrive, USB stick).
#
# nfs - Boot using an NFS drive as the root of the drive.
#
 
BOOT=nfs
 
#
# DEVICE: ...
#
# Specify the network interface, like eth0
#
 
DEVICE=eth0
 
#
# NFSROOT: [ auto | HOST:MOUNT ]
#
 
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:
#!/bin/sh
 
PREREQ=""
prereqs()
{
        echo "$PREREQ"
}
case $1 in
prereqs)
        prereqs
        exit 0
        ;;
esac
 
getParam(){
# Recibe el argumento buscado y la linea 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 modulo 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 modulos de la placa de red), NIC (determina que modulo 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 porque

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

Como funciona esto

  • Al arrancar el cliente liviano carga etherboot, gpxe o lo que corresponda, luego hace una petición dhcp.
  • 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.
  • 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.
  • pxelinux lee de la configuración que kernel e imagen initrd debe descargar y que argumentos debe pasarles al kernel.
  • pxelinux descarga el kernel y la imagen initrd
  • pxelinux ejecuta el kernel
  • el kernel de linux monta la imagen initrd y ejecuta init
  • init ejecuta los scripts de arranque (entre ellos placas.sh)
  • placas.sh lee la linea de comandos del kernel y carga el módulo que indicamos con el argumento NIC