[[PageOutline(2-5,Índice)]] = Cliente Initrd = El cliente initrd.gz es sistema muy liviano que nos permitirá instalar sistemas con un arranque muy rápido. El initrd.gz es un archivo comprimido que tiene un sistema de ficheros completo. Modificar el initrd.gz puede ser bastante molesto, así que nuestro objetivo es no tener que modificarlo nunca más, pero que funcione en todos los ordenadores posibles sin que haya que actualizarlo continuamente. Para ello hemos creado un script que lo genera automáticamente descargándolo de internet. El script lo que hace es usar el initrd.gz de Ubuntu y modificarle simplemente el arranque. Este arranque evita que se ejecute la instalación y ejecuta un script determinado montado por NFS. Además el script va a ser mejorado, pudiendo elegir entre Ubuntu o Debian, permitir descargar el núcleo o no,etc. y se está intentando borrarle todo lo que tenga que ver con la instalación de Ubuntu. Cualquier cosa que queramos agregarle al sistema lo haremos a través de NFS. Ejemplos de cosas que se podrían agregar a través NFS sería: * Arranques polimórficos: El cliente buscará que hacer en el servidor, que puede ofrecerle un script distinto cada vez. * Paquetes udeb: Para ampliar las funcionalidades básicas. * Ejecutables compilados estáticamente: Para los programas que no tengan paquetes udeb, se puede agregar programas estáticamente. Se hace estáticamente para que no haya que mantener todos los programas compilados con las misma librería, menos manteniento. Es importante modificar el PATH en el script de arranque para agregar las rutas nuevas de los ejecutables nuevos. * Módulos para el kernel: Podríamos coger módulos de la propia Ubuntu para que haya incompatibilidad y poder hacer insmod a través de NFS, por ejemplo el del ratón que no viene por defecto. == Parámetros de arranque == Tanto en arranque por red (PXE) como local desde caché, el kernel del cliente recibirá una serie de parámetros normalizados para definir su funcionamiento básico. ||'''Parámetro''' || '''Modo''' || '''Descripción''' || ||{{{ip=dhcp}}} ||Arranque ''online'' con DHCP||Obtención de datos de red por servidor DHCP.|| ||{{{ip}}} no definido|| ~~ Arranque ''offline'' ~~ || ~~ Arranque sin conexión con repositorio local.~~|| || {{{status}}} no definido || Arranque online || Arranque en sistema centralizado cliente-servidor|| || {{{status=online}}} || Arranque online || Arranque en sistema centralizado cliente-servidor || || {{{status=offline}}} || Arranque offline || Arranque en un sistema aislado o sistema entre iguales. || ||{{{boot=admin}}}||Modo administrador ||Arranque con privilegios completos de administración, acceso de escritura al repositorio y cliente en modo interactivo (''shell'').|| ||{{{boot=user}}} ||Modo usuario ||Arranque sin privilegios con acceso de lectura al repositorio y sin ''shell'' (por defecto).|| ||{{{repo}}} no definido||Repositorio centralizado||La dirección IP del repositorio coincide con la del servidor DHCP (en modo ''online'').|| ||{{{repo=}}}''{{{IPRepositorio}}}''||Repositorio distribuido||Dirección IP del repositorio NFS de imágenes (en arranque ''online'').|| ||{{{repo=}}}''{{{Dispositivo}}}''||Sólo repositorio local||Dispositivo del repositorio de imágenes de la caché local (en arranque ''offline'').|| ||{{{ou=}}}''{{{Unidad}}}''||Unidad organizativa||Nombre de la unidad organizativa donde se encuentra el cliente (entre comillas).|| ||{{{group=}}}''{{{Grupo}}}''||Grupo de clientes||Nombre del grupo al que pertenece el cliente (entre comillas).|| ||{{{vga=}}}''{{{Entero}}}''||Modo gráfico||Resolución gráfica del cliente.|| ||{{{acpi=on}}} ||Soporte ACPI ||Soporte ACPI en el cliente para la gestión de energía y apagado.|| ||{{{engine}}} no definido ||Engine estable || Utiliza exclusivamente el Engine estable.|| ||{{{engine=testing}}} ||Engine beta || Utiliza las funciones definidas en las librerías testing.|| Modos gráficos comunes del cliente (parámetro {{{vga}}}): * {{{788}}} - resolución 800x600 con 24 bits de colores (mayor compatibilidad). * {{{789}}} - resolución 800x600 con 32 bits de colores. * {{{791}}} - resolución 1024x768 con 24 bits de colores. * {{{792}}} - resolución 1024x768 con 32 bits de colores. == ¿Qué debe hacer el script de arranque? == * Comprobar los parámetros de funcionamiento del kernel (fichero {{{/proc/cmdline}}}) y asignar variables. * Montar los componentes del sistema por NFS (modo '''online''' o localmente (modo '''offline'''). * Agregar al {{{PATH}}} del sistema los directorios con ejecutables. * Insertar, si fuese necesario, módulos extra al kernel del cliente, mediante {{{insmod}}}. * Si queremos usar el modo gráfico hay que arrancarlo con framebuffer y ejecutable el Browser. Más información en browser. == ¿Qué hace el initrd-generator? == Lo primero que hace es ir al directorio de archivos temporales y lo descarga y descomprime. === !BusyBox === Este tipo de instalación (debian en modo consola) se basan en usar la herramienta !BusyBox. Es un ejecutable que proveé la mayoria de las herramientas unix en un espacio reducido. Entonces si miramos por ejemplo el directorio /bin del initrd veremos que sólo son enlaces a la herramienta busybox. Un 'ls -l' se ejecutaría como un 'busybox ls -l' dentro de la instalación. Todo lo que no tenga el busybox es lo que deberemos agregar por NFS y compilación estática. Busybox es también EL init. Sabe usar el /etc/inittab pero no tiene soporte para arranque multinivel. El fichero /etc/inittab es el fichero que usa el primer proceso llamada "init" para saber que tiene que hacer. Para más informacción man inittab. El fichero que trae el initrd.gz de Ubuntu lo primero que hace es llamar a debian-installer-startup que llama, a su vez, a los scripts de /etc/rcS.d/. Si agregáramos nuestros scripts directamente en ese directorio, como viene en el apartado "Modificar el arranque" conseguiríamos ejecutar nuestro código antes que la instalación de Ubuntu, y sí al final ponemos un restart o un shutdown nadie sabría que es una instalación de Ubuntu. Se podría intentar eliminar todo rastro de la instalación pero trae problemas a la hora de arrancar (produce kernel panics), así que de momento sólo añade cosas. === Modificar el arranque === En el directorio /etc/rcS.d/ creamos los archivos !SxxNombreDescriptivo siendo xx números de prioridad. === Recomprimir initrd.gz === Una vez modificado el arranque lo comprime y lo mueve al directorio actual. Hace lo mismo con el núcleo. === Futuro === En el futuro deberá parsear opciones para: * Descargar el núcleo opcionalmente. * Permitir descargar distintas versiones. * Permitir descargar Debian también. * Permitir hacer sólo algunos pasos y otros no. (Para crear initrd.gz personalizados). * Borrar restos de la instalación de Ubuntu. (very very very low priority). == PXE == === Generando el initrd === Nos vamos al directorio donde vayamos a situar el initrd y ejecutamos el script [source:trunk/opengnsys-client/boot/initrd-generator] {{{ cd /opt/opengnsys/tftpboot cp .../initrd-generator . ./initrd-generator }}} Al finalizar tendremos el initrd.gz y el kernel (archivo llamado linux). === Fichero de configuración PXE: === Dentro de /opt/opengnsys/tftpboot/pxelinux.cfg creamos el archivo de configuración PXE, llamado default o 01-MAC_equipo (ej: 01-00-25-ed-78-a9-ff) . Tenemos un ejemplo en [source:trunk/opengnsys-server/PXE/pxelinux.cfg/default] == Recursos compartidos por NFS == Nos basamos en la propuesta de estructura de directorio descrita en [wiki:DirsComponentes Estructura de Directorios de los Componentes] En /opt/opengnsys/client situamos lo que encontramos en el subversión de [source:trunk/opengnsys-client/nfsexport]. Dentro de del directorio /opt/opengnsys/client/lib/engine/bin situamos el contenido del subversión de [source:trunk/opengnsys-client/engine]. Observamos que tenemos tres subdirectorios vacíos (cache, images y logs) serán puntos de montaje para la partición cache y dos recursos nfs con permiso de escritura. Queda por determinar donde estarán los script de arranque y las páginas de inicio del navegador. Inicialmente los script de arranque están situados en /opt/opengnsys/client/init. Ejemplo: [source:trunk/opengnsys-client/boot/ej_script_init.sh] === Archivo de configuración NFS === Tenemos un ejemplo de /etc/export en [source:trunk/opengnsys-server/NFS/exports]. == Paquetes udeb == Propuesta para sustituir algunas compilaciones estáticas. Lista de todos los paquetes disponibles [source:trunk/opengnsys-doc/udeb.list] y lista de los que se están usando ahora [source:trunk/opengnsys-server/clients/udeblist.conf]. Los paquetes están ahora mismo en [source:trunk/opengnsys-client/nfsexport/lib/udeb]. Para poder descargar los paquetes udeb con sus dependencias o agregamos una línea al /etc/apt/sources.list o creamos un fichero con la línea en /etc/apt/sources.list.d/ : {{{ deb http://es.archive.ubuntu.com/ubuntu/ jaunty main/debian-installer }}} Luego ejecutar: {{{ apt-get update mkdir -p /tmp/udeb/partial apt-get install -o dir::cache::archives=/tmp/udeb -d `cat install-udeb` }}} Y estarán todos los paquetes udeb en el directorio /tmp/udeb que se deberán copiar al /opt/opengnsys/client/lib/udeb/ en el proceso de instalación. === Actualización automática de paquetes udeb === Se ha creado el script {{{upgrade-clients-udeb.sh}}} que realiza automáticamente el proceso de descarga, selección y copiado de paquetes udeb, según las instrucciones anteriores. Dicho script utiliza un fichero de configuración donde se indican los paquetes a descargar y aquellos que no deben ser copiado a las librerías de los clientes. Cada línea del fichero [source:trunk/opengnsys-server/clients/udeblist.conf udeblist.conf] indica la operación a realizar con cada uno de los paquetes seleccionados, con el siguiente formato: {{{ install:nombrepaquete remove:nombrepaquete }}} == Compilación estática de los principales programas == (Puede que esté obsoleto y no sea exactamente así) La mayoría de las fuentes se han conseguido a través de "apt-get source paquete" en una Ubuntu Jaunty. Si no se dice nada se supondrá que se ha obtenido de esa manera. Para instalar las dependencias necesarias se puede hacer de esta manera "apt-get build-dep paquete". No olvidar ejecutar strip después de compilarlo ya que puede disminuir mucho el tamaño del ejecutable final. === kexec 2.0.1 === Descargar y descomprimir el código fuente de kexec-tools 2.0.1. Ejecutar en el servidor de OpenGNSys el siguiente código para instalar el ejecutable estático de {{{kexec}}}: {{{ #!sh cd kexec-tools-2.0.1 LDFLAGS=-static ./configure make mv build/kexec /opt/opengnsys/client/bin }}} == Cliente para Offline (cd/dvd - usb - partición rescate == Para poder disponer el cliente OpenGNSys para dispositivos extraibles o removibles, así como desde una partición en un ordenador, es muy simple. === 1 Crear un initrd común para estos tipos de arraque === Se deberá modificar el scripts de generación del initrd, para que cree dentro de su estrucutra el /opt/opengnsys con toda la información del trunk client/exportnfs con el engine. === 2.a Preparar el arranque offline desde partición rescate === Copiar el kernel e el initrd específico (el que incluye engine y demás utilidades del cliente) en la partición rescate. Instalar un gestor de arranque en el PC cliente, que haga una llamada a ese kernel y su initrd. === 2.b Preparar la iso para los cd/dvd === {{{ ISO=/tmp/ogClient.iso DIRSOURCE=/tmp/iso DIRISOLINUX=/usr/lib/syslinux mkdir -p $DIRSOURCE cp ${DIRSILONUX}\{isolinux.cfg, isolinux.bi} $DIRSOURCE cat > ${DIRISOLINUX}\isolinux.cfg <