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.
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.
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).
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
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
Copiamos el rc.local que trae la distribución de EAC.
Explicamos un par de cosas:
#!/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
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
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.