Changes between Version 8 and Version 9 of InitrdCliente


Ignore:
Timestamp:
Jul 21, 2009, 2:54:06 AM (15 years ago)
Author:
adelcastillo
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • InitrdCliente

    v8 v9  
    11= Cliente Initrd =
    22
    3 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 lo que vamos a hacer es usar el initrd.gz de Ubuntu y modificarle simplemente el arranque. Además podemos borrarle todo lo que tenga que ver con la instalación de Ubuntu. Cualquier cosa que querramos agregarle al sistema lo haremos a través de NFS. Ejemplos de cosas que se podrían agregar a través NFS sería:
     3El 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 descargandoselo 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. Por ahora es /opt/opengnsys/init/$IP.sh donde $IP es, obviamente, la ip que tenga asignada en estos momentos el ordenador.
     4
     5Ademá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 querramos agregarle al sistema lo haremos a través de NFS. Ejemplos de cosas que se podrían agregar a través NFS sería:
    46 * Arranques polimórficos. El cliente buscará que hacer en el servidor, que puede ofrecerle un script distinto cada vez.
    57 * Ejecutables compilados estáticamente. Estáticamente para que no haya que mantener todos los programas compilados con las misma libreria, menos manteniento. Es importante modificar el PATH en el script de arranque para agregar las rutas nuevas de los ejecutables nuevos.
    6  * Módulos para el kernel. Podriamos 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.
     8 * 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.
    79
    810= ¿Qué debe tener el script de arranque? =
     
    1315 * Si queremos usar el ratón hay que añadir necesariamente el módulo psmouse.ko.
    1416
    15 = ¿Cómo se ha creado el initrd.gz? =
     17= ¿Qué hace el initrd-generator? =
    1618
    17 == Descargar ==
    18 Nos descargamos un initrd.gz base y el núcleo linux de la distribición. En la primera versión usamos la versión del instalador de red de Ubuntu/Jaunty:
    19 {{{
    20 mkdir /tmp/initrd
    21 cd /tmp/initrd
    22 wget http://archive.ubuntu.com/ubuntu/dists/jaunty/main/installer-i386/current/images/netboot/ubuntu-installer/i386/initrd.gz
    23 wget http://archive.ubuntu.com/ubuntu/dists/jaunty/main/installer-i386/current/images/netboot/ubuntu-installer/i386/linux
    24 }}}
    25 
    26 El núcleo linux no hace falta modificarlo, se usa tal cual.
    27 
    28 == Descomprimirlo ==
    29 
    30 Una vez obtenido vamos a descomprimirlo para modificarlo para suplir nuestras necesidades.
    31 {{{
    32 mkdir -p /tmp/initrd/newroot
    33 cd /tmp/initrd/newroot
    34 gzip -dc ../initrd.gz | cpio -id
    35 }}}
    36 Esto te crea en /tmp/initrd/newroot el sistema de ficheros que tendrías al arrancar con el núcleo y el initrd. Cualquier modificación que le hagamos al sistema de ficheros se verá afectado cuando se vuelva a comprimir.
     19Lo primero que hace es ir al directorio de archivos temporales y lo descarga y descomprime.
    3720
    3821== BusyBox ==
    39 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 tiene un 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 agregaramos nuestros scripts directamente en ese directorio, como viene en el apartado "Modificar el arranque" conseguiriamos 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. Una mejor manera es borrar todo sobre la instalación de Ubuntu scripts, librerias, configuración, etc. para que quede mucho más claro y ocupe menos espacio. Si se quiere crear un initrd de prueba, rápido y sucio puedes pasar directamente a "Modificar el arranque".
    40 
    41 == Borrando restos de Ubuntu/Debian (Sin acabar) ==
    42 
    43 Modificamos el inittab por este otro:
    44 
    45 Borramos los siguientes ficheros de la instalación de Ubuntu:
    46 {{{
    47 find -name *debian* -exec rm -rf {} \;
    48 cd bin/
    49 file * | grep shell | awk -F ":" '{print $1}' | xargs rm
    50 rm anna archdetect choose-mirror log
    51 rm -rf apt-install choose-mirror deb* env2debconf ethdetect fetch-url
    52 rm -rf lib/main-menu.d
    53 }}}
     22Este 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 tiene un 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 agregaramos nuestros scripts directamente en ese directorio, como viene en el apartado "Modificar el arranque" conseguiriamos 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.
    5423
    5524== Modificar el arranque ==
    5625
    57 En el directorio /tmp/initrd/newroot/etc/rcS.d/ podemos crear los scripts que queremos que se ejecuten al inicio. Se crean ficheros dentro que empicen por SxxNombreDescriptivo siendo xx dos números con el orden de ejecución. Yo he creado los siguientes tres archivos:
     26En el directorio /etc/rcS.d/ creamos los archivos SxxNombreDescriptivo siendo xx números de prioridad. Se crean los siguientes tres archivos:
    5827
    59  * S01dhclient
    60 {{{
    61 # It gets an IP from the DHCP server.
    62 mkdir -p /var/state/dhcp
    63 /sbin/dhclient
    64 }}}
    65 
    66  * S02montarnfs
    67 {{{
    68 # Montamos por NFS para ejecutar el script de inicio que tendrá en nombre de nuestra ip
    69 
    70 DHCP_SERVER=`grep -h dhcp-server-identifier /var/lib/dhcp3/dhclient.* | sed 's/[^0-9]*\(.*\);/\1/' | head -1`
    71 IP=`grep -h fixed-address /var/lib/dhcp3/dhclient.* | sed 's/[^0-9]*\(.*\);/\1/' | head -1`
    72 mount -t nfs -onolock $DHCP_SERVER:/var/netboot/ /mnt
    73 /mnt/$IP.sh
    74 }}}
    75 
    76  * S99restart
    77 {{{
    78 # Reiniciamos
    79 
    80 reboot
    81 }}}
     28 * S01dhclient (pide dhcp)
     29 * S02montarnfs (monta y ejecuta el archivo /opt/opengnsys/init/$IP.sh)
     30 * S99restart (reinicia por si en caso de error que nunca salga la instalación de Ubuntu)
    8231
    8332== Recomprimir initrd.gz ==
    84 {{{
    85 cd /tmp/initrd/newroot/
    86 find ./ | cpio -H newc -o > /tmp/initrd-netboot
    87 gzip -9 /tmp/initrd-netboot
    88 }}}
    8933
    90 Eso genera un /tmp/initrd-netboot.gz que podremos sustituir al initrd.gz original por él.
     34Una vez modificado el arranque lo comprime y lo mueve al directorio actual. Hace lo mismo con el núcleo.
     35
     36== Futuro ==
     37
     38En el futuro deberá parsear opciones para:
     39* Descargar el núcleo opcionalmente.
     40* Permitir descargar distintas versiones.
     41* Permitir descargar Debian también.
     42* Permitir hacer sólo algunos pasos y otros no. (Para crear initrd.gz personalizados).
     43* Borrar restos de la instalaciónd de Ubuntu. (very very very low priority).
     44
    9145
    9246= Compilaciones estáticas de los principales programas =