[[PageOutline]] = 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. # # 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.