| 1 | = Crear un nuevo initrd.gz = |
| 2 | |
| 3 | Vamos a ver como un initrd.gz para que tenga todo lo que necesitamos. En este ejemplo vamos a usar el netboot de ubuntu jaunty. |
| 4 | |
| 5 | == Descargarlo == |
| 6 | Nos descargamos el nuevo initrd.gz y linux de una distribición. Cambiando en la url jaunty por otra versión obtendremos los initrd.gz y linux de otras versiones: |
| 7 | {{{ |
| 8 | mkdir /tmp/initrd |
| 9 | cd /tmp/initrd |
| 10 | wget http://archive.ubuntu.com/ubuntu/dists/jaunty/main/installer-i386/current/images/netboot/ubuntu-installer/i386/initrd.gz |
| 11 | wget http://archive.ubuntu.com/ubuntu/dists/jaunty/main/installer-i386/current/images/netboot/ubuntu-installer/i386/linux |
| 12 | }}} |
| 13 | == Descomprimirlo == |
| 14 | Una vez obtenido vamos a descomprimirlo para modificarlo para suplir nuestras necesidades. |
| 15 | {{{ |
| 16 | mkdir -p /tmp/initrd/newroot |
| 17 | cd /tmp/initrd/newroot |
| 18 | gzip -dc ../initrd.gz | cpio -id |
| 19 | }}} |
| 20 | Esto te crea en /tmp/initrd/newroot el sistema de ficheros que tendrías al arrancar. |
| 21 | |
| 22 | == Modificar el arranque == |
| 23 | |
| 24 | En el directorio /tmp/initrd/newroot/etc/rcS.d/ podemos crear los scripts que queremos que se ejecuten al inicio. Yo he creados los siguientes: |
| 25 | |
| 26 | * S01dhclient |
| 27 | {{{ |
| 28 | # It gets an IP from the DHCP server. |
| 29 | mkdir -p /var/state/dhcp |
| 30 | /sbin/dhclient |
| 31 | }}} |
| 32 | |
| 33 | * S02install |
| 34 | {{{ |
| 35 | # Hacemos un ejemplo de montar NFS y luego una shell para poder interactuar |
| 36 | |
| 37 | DHCP_SERVER=`grep -h dhcp-server-identifier /var/lib/dhcp3/dhclient.* | sed 's/[^0-9]*\(.*\);/\1/' | head -1` |
| 38 | mount -t nfs -onolock $DHCP_SERVER:/var/netboot/ /mnt |
| 39 | sh |
| 40 | }}} |
| 41 | |
| 42 | * S99restart |
| 43 | {{{ |
| 44 | # Reiniciamos |
| 45 | |
| 46 | reboot |
| 47 | }}} |
| 48 | |
| 49 | == Añadir ejecutables == |
| 50 | |
| 51 | Para añadir ejecutables podemos agregarlos a /tmp/initrd/newroot/sbin/ y ya estarán disponibles desde la linea de comandos. Los ejecutables deberían estar compilados estáticamente. En el repositorio de subversion están los que más se usan ya compilados. |
| 52 | |
| 53 | == Añadir más driver al initrd.gz == |
| 54 | |
| 55 | Hay que saber que kernel está usando el initrd.gz y sustituirlo por en este ejemplo: |
| 56 | {{{ |
| 57 | mkdir /tmp/kernel |
| 58 | cd /tmp/kernel |
| 59 | sudo apt-get -d --reinstall install linux-image-2.6.28-11-generic |
| 60 | dpkg -x /var/cache/apt/archives/linux-image-2.6.28-11-generic_2.6.28-11.42_i386.deb . |
| 61 | cd lib/modules/2.6.28-11-generic/kernel/ |
| 62 | }}} |
| 63 | |
| 64 | En ese directorio encontraremos todos los driver que queramos y los pondremos en /tmp/initrd/newroot/lib/modules/2.6.28-11-generic/ |
| 65 | |
| 66 | == Recomprimir initrd.gz == |
| 67 | {{{ |
| 68 | cd /tmp/initrd/ |
| 69 | find newroot | cpio -H newc -o > /tmp/initrd-netboot |
| 70 | gzip -9 /tmp/initrd-netboot |
| 71 | }}} |
| 72 | |
| 73 | Eso genera un /tmp/initrd-netboot.gz que podremos sustituir al initrd.gz original por él. |
| 74 | |
| 75 | = Compilaciones estáticas de los principales programas = |
| 76 | |
| 77 | Lo haré el Lunes pero está subido al subversion. |