wiki:InitrdCliente

Version 4 (modified by adelcastillo, 15 years ago) (diff)

--

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 modificarlo lo menos posible, 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. 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:

  • Arranques polimórficos. El cliente buscará que hacer en el servidor, que puede ofrecerle un script distinto cada vez.
  • Ejecutables compilados estáticamente. Estáticamente para que no haya que mantener todos los programas compilados con las misma libreria, menos manteniento.
  • 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.

¿Cómo se ha creado el initrd.gz?

Descargar

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?:

mkdir /tmp/initrd
cd /tmp/initrd
wget http://archive.ubuntu.com/ubuntu/dists/jaunty/main/installer-i386/current/images/netboot/ubuntu-installer/i386/initrd.gz
wget http://archive.ubuntu.com/ubuntu/dists/jaunty/main/installer-i386/current/images/netboot/ubuntu-installer/i386/linux

El núcleo linux no hace falta modificarlo, se usa tal cual.

Descomprimirlo

Una vez obtenido vamos a descomprimirlo para modificarlo para suplir nuestras necesidades.

mkdir -p /tmp/initrd/newroot
cd /tmp/initrd/newroot
gzip -dc ../initrd.gz | cpio -id

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.

Modificar el arranque

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:

  • S01dhclient
    # It gets an IP from the DHCP server.
    mkdir -p /var/state/dhcp
    /sbin/dhclient
    
  • S02montarnfs
    # Montamos por NFS para ejecutar el script de inicio que tendrá en nombre de nuestra ip
    
    DHCP_SERVER=`grep -h dhcp-server-identifier /var/lib/dhcp3/dhclient.* | sed 's/[^0-9]*\(.*\);/\1/' | head -1`
    IP=`grep -h fixed-address /var/lib/dhcp3/dhclient.* | sed 's/[^0-9]*\(.*\);/\1/' | head -1`
    mount -t nfs -onolock $DHCP_SERVER:/var/netboot/ /mnt
    /mnt/$IP.sh
    
  • S99restart
    # Reiniciamos
    
    reboot
    

Recomprimir initrd.gz

cd /tmp/initrd/newroot/
find ./ | cpio -H newc -o > /tmp/initrd-netboot
gzip -9 /tmp/initrd-netboot

Eso genera un /tmp/initrd-netboot.gz que podremos sustituir al initrd.gz original por él.

Compilaciones estáticas de los principales programas

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.

chntpw

make chntpw.static

ctorrent

LDFLAGS=-static ./configure
make

s/fdisk

El paquete es el util-linux.

LDFLAGS=-static ./configure --with-fsprobe={blkid,volume_id}
make

kexec-tools

LDFLAGS=-static ./configure
make

ntfsclone

LDFLAGS=-static ./configure
make

parted

Para compilar se necesita gcc-4.2, la version 4.3 da errores.

LDFLAGS='-static' ./configure --disable-Werror
make

partimage

Descargado directamente desde: http://sourceforge.net/projects/partimage/files/stable/partimage-0.6.4-static.tar.bz2/download

tftp

LDFLAGS='-static' ./configure --without-tcpwrappers
make