wiki:EACBootAgentPXE

Version 9 (modified by trac, 2 years ago) (diff)

--

Introducción a nfsroot+ramdisk -tecnología usada por EACBootAgent-


Queremos tener un sistema operativo unificado para todos los equipos que no se modifique desde los clientes, por lo que no tendrá permiso de escritura. Sin embargo para que el sistema operativo arranque es necesario que tenga permiso de escritura en determinados directorios.

Cuando arrancamos un equipo por PXE/TFTP suele elegir entre tres tipos dispositivos para el sistema de ficheros raíz.

  • NFSRoot: Sistema de archivos raíz en red.
  • Ramdisk: Sistema de archivos raíz en memoria, cargado desde la red.
  • Local: Sistema de archivos local, disco duro.

Nosotros vamos a utilizar un sistema de fichero raíz nfs con permisos de sólo lectura y sobre él vamos a montar dispositivos ramdisk que permitan escribir sobre ellos.

Además para tener disponibles las librerías, las imágenes y la información de los hosts, sobre un dispositivo ramdisk (montado en /var/EAC) vamos a montar por nfs varios directorios del servidor.

Tiempo de inicialización de un cliente

Shell texto: Unos 20 segundos desde que contacta con el servidor pxe. (no incluye tiempo POST de la máquina) Shell gráfico(X): Unos 30 segundos desde que contacta con el servidor pxe. (no incluye tiempo POST de la máquina).

Como construir un cliente nfsroot+ramdisk que utilice el / (raiz) de nuestro servidor


Como construir el cliente independiente nfsroot+ramdisk


A partir de un Sistema Linux ubuntu instalado en cualquir máquina fisica o virtual

El SO de referencia está en un equipo remoto

El SO de referenica está ejecutandose en mi equipo

A partir de los repositorios oficiales de ubuntu - requiere conexión a internet

Requiere que el Sistema operativo que ejecute debootstap tenga el mismo kernel que tendrá el cliente. Si no es el caso le instalamos en nuestra maquina el kernel deseado y arrancamos de nuevo con él.

ubuntu server

debootstrap --arch=i386 \
--include=linux-image-server,grub \
--components=main,universe,multiverse jaunty \
 /var/EAC/nfsroot/testing

ubuntu desktop

debootstrap --arch=i386 \
--include=linux-image,grub \
--components=main,universe,multiverse jaunty \
 /var/EAC/nfsroot/testing

Como configurar el cliente para EAC


fstab

La raíz del sistema de ficheros es un dispositivo nfs que montamos con permiso de sólo lectura. El sistema operativo necesita poder escribir en determinados directorios para funcionar.

Montamos una serie de dipositivos ramdisk en los directorios que necesitemos escribir. Lo que escribamos en ellos se situará en la memoria, perdiéndose al apagar el sistema.

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/nfs        /               nfs     defaults        1       1       
none            /root           tmpfs   defaults        0       0
none            /mnt            tmpfs   defaults        0       0
none            /tmp            tmpfs   defaults        0       0
none            /dev/shm        tmpfs   defaults        0       0
none            /var/run        tmpfs   defaults        0       0
none            /var/lock       tmpfs   defaults        0       0
none            /var/tmp        tmpfs   defaults        0       0
none            /var/log        tmpfs   defaults        0       0
none            /var/state      tmpfs   defaults        0       0
none            /var/lib/nfs    tmpfs   defaults        0       0
none            /var/lib/xkb    tmpfs   defaults        0       0
none            /var/EAC        tmpfs   defaults        0       0

rc.local

rc.local antiguo

Copiamos el rc.local que trae la distribución de EAC.

Explicamos un par de cosas:

  • /etc/mtab -> como no tenemos permiso de lectura en /etc lo situamos en /var/tmp y hacemos enlace simbólico.
  • Montamos los directorios de las librerías, las imágenes y la información de los hosts por nfs (antes hemos creado los puntos de monjate)
  • Cargamos las librerías para tener disponible sus funciones: source ...
#!/bin/bash
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

###exit 0
### personalizando el entorno etc

export PATH=$PATH:/sbin/:/bin/:/opt/drbl/sbin/:/usr/local/sbin/:/usr/local/bin/:/usr/sbin/:/usr/bin/:/var/EAC/admin/procedimientos

ntpdate hora.alumnos.uma.es

touch /var/tmp/mtab
if [ `find /etc/ -type l -name mtab | grep mtab` ]
then
        echo "personalizando mtab"
else
        rm /etc/mtab
        ln -s /var/tmp/mtab /etc/mtab
fi
cp /proc/mounts /var/tmp/mtab


touch /var/tmp/export
echo "##### export ####" > /var/tmp/exports
if [ `find /etc/ -type l -name exports | grep exports` ]
then
        echo "personalizando fichero exports"
else
        rm /etc/exports
        ln -s /var/tmp/export /etc/exports
fi
#iniciando el lighttpd ###############
mkdir -p /var/log/lighttpd
chmod -R 777 /var/log/
/etc/init.d/lighttpd start

echo "personalizando la estructura EAC"
mkdir -p /var/EAC/admin 1>/dev/null 2>&1
mkdir -p /var/EAC/hdimages 1>/dev/null 2>&1
mkdir -p /var/EAC/hosts 1>/dev/null 2>&1
################################## CLIENTE PXE #######################
if `cat /proc/cmdline | grep nfs > /dev/null`
then
        IPservidor=$(cat /proc/cmdline | awk ' BEGIN { FS="nfsroot=" } ; {print $2}' | awk -F: '{print $1}')
        echo "iniciando EAC Boot Agent pxe-nfs" 
        mount -t nfs ${IPservidor}:/var/EAC/hdimages /var/EAC/hdimages
        mount -t nfs ${IPservidor}:/var/EAC/admin /var/EAC/admin
        mount -t nfs ${IPservidor}:/var/EAC/hosts /var/EAC/hosts
else
        echo "iniciando EAC Boot Agent desde USB/CDROM/DVD"
        dhclient -1 || ifconfig eth0 192.168.1.1 netmask 255.255.255.0
fi

echo "cargando las librerias especificas de EAC"        
        source /var/EAC/admin/librerias/Settings.lib
        source /var/EAC/admin/librerias/ATA.lib
        source /var/EAC/admin/librerias/FileSystem.lib
        source /var/EAC/admin/librerias/Deploy.lib
        source /var/EAC/admin/librerias/Boot.lib
        source /var/EAC/admin/librerias/PostConf.lib
        #
InfoHardware

touch /var/tmp/hostname
if  [ `find /etc/ -type l -name hostname` ]
then
        echo "personalizando fichero hostname"
else
        rm /etc/hostname
        ln -s /var/tmp/hostname /etc/hostname
fi

NameCompany > /var/tmp/namecompany


echo "buscando el equipo en el servidor EAC"
source /var/EAC/admin/librerias/Settings.lib

 #cat /etc/hostname | wc -l

#while `hostname`
#do
        /var/EAC/admin/procedimientos/EACclient IsHostRegistry
#done

echo "`hostname`" >> /var/tmp/hostname


#hostname adi${IPcuatro}-xp

touch /var/tmp/hosts
if  [ `find /etc/ -type l -name hosts | grep hosts` ]
then
        echo "personalizando hosts"
else
        rm /etc/hosts
        ln -s /var/tmp/hosts /etc/hosts
fi
echo "127.0.0.1 localhost" > /var/tmp/hosts
echo "127.0.0.1 `hostname`" >> /var/tmp/hosts
echo "`echo $IP` `hostname`" >> /var/tmp/hosts

touch /var/EAC/hosts/${IP}-InfoHardware && chmod 777 /var/EAC/hosts/${IP}-InfoHardware
touch /var/EAC/hosts/${IP}-Log && chmod 777 /var/EAC/hosts/${IP}-Log
touch /var/EAC/hosts/${IP}-InfoCache && chmod 777 /var/EAC/hosts/${IP}-InfoCache

SetDefaultBoot 11 $IP

# Activamos modo Wake On Lan 
ethtool -s eth0 wol g

#cat /proc/cmdline | grep nfs > /dev/null && 
/var/EAC/admin/procedimientos/EACclient RunStartPage

startpage=$(find /var/tmp/ -name *.sh) && echo $startpage && $startpage && rm $startpage

rc.local branch uma -actual -

En la última versión del EAC, el rc.local ya sabe si el equipo está dado de alto o no entre otras cosas. Es decir los parametros del kernel cuando arranca lleva toda la informacion del equipo y su aula que se encuentra almacenada en la base de datos.

source:branches/eac-hidra-uma/EAC/admin/config/etc/rc.local.client

etc/network/interfaces

Al iniciarse el equipo obtenemos una ip del dhcp, luego por pxe monto el sistema de ficheros nfs. Al arrancar el sistema operativo con la configuración normal va a volver a pedir la ip al dhcp, desconectandonos de la red y del servicio nfs, De forma que nos deja sin sistema de ficheros raíz. Para que funcione bien hemos de modificar el archivo de configuración de las tarjetas de red del cliente, quedando de la siguiente forma:

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
iface eth0 inet manual

Nota: En el script de creación de cliente BuildEACOSBase se borra el fichero etc/udev/rules.d/70-persistent-net.rules. Hemos probado a dejarlo un no ha dado problema. Este fichero se encarga de que los nombres de las tarjetas de red sean persistentes al reiniciar el sistema

Nota; En la ultima versión, el BootServer?() configura el fichero de arranque del equipo de modo que la asignacion de red sea estática (aligerando el proceso de arranque). Es decir solo hay una consulta dhcp durante el proceso POST del hardware, y es para el cliente tft de la rom de la tarjeta de red, pueda contactar con el servidor pxe.