Initrd desde cero.

Hay initrds y hay initrds. Los hay desde initrd que solo son un bash y un modprobe compilados de forma estática hasta initrds que se parecen más a una mini distro que a un simple "cargador de módulos". Nosotros vamos a apuntar a este último, ya que le vamos a sacar más provecho y podemos jugar un poco con él.

Entendamos la complejidad de un initrd a la "mini distro":

- el initrd debe tener herramientas comunes, como los binutils, herramientas de diagnostico, logueo, un shell como la gente, fstools, ncurses, etc.
- los binarios no deben ser compilado como estático.
- debe poder detectar hardware por si mismo.
- debe administrar el /dev

En definitiva, tiene que ser una mini distro de linux, pero hecha por nosotros, salvo _por un tema de complejidad_ la libc, que vamos a usar la del sistema donde compilemos todo.

Herramientas:

- para binutils y demás: Busybox
- shell: Bash
- bash depende de: ncurses
- detección de hard: pciutils
- kernel: kernel 2.6

Paths para el tutorial

En mi caso, voy a usar un path común ~/Curso/initrd donde voy a incluir 3 carpetas: src, ROOT, TEST. En la primera, van a ir todos los fuentes que utilicemos, luego el punto de montaje de la imagen initrd que vamos a usar y por ultimo, una estructura armada para probar el initrd que veremos al final. Les recomiendo que en el shell que utilicen hagan lo siguiente:


shell> export ROOT_DIR=~/Curso/initrd
shell> export SRC_DIR=$ROOT_DIR/src
shell> export INITRD_DIR=$ROOT_DIR/ROOT
shell> export TEST_DIR=$ROOT_DIR/TEST


Crear una imagen initrd vácia

Para el initrd tenemos que crear una imagen vacia que la vamos a formatear con ext2 (pueden usar ext3 si es > 32mb pero no veo el sentido) y luego la vamos a montar en $INITRD_DIR. Esta imagen va a tener un tamaño de 32mb, que nos va a dejar espacio para copiarle todo lo que necesitemos y para cuando este corriendo en memoria, tener espacio libre en la imagen para hacer pruebas.

Hay otros formatos para initrd, como cramfs, romfs, etc. Son todos read-only y se pueden generar al vuelo, no requieren de una imagen pre generada y formateada.

Atención!!!: usen el fs que utilicen, el mismo tiene que estar built-in en el kernel, sino, no van a poder montar el initrd!!!!


shell> cd $ROOT_DIR
shell> dd if=/dev/zero of=initrd.img bs=1024 count=$(echo $(( 32 * 1024 ))) # [1]
shell> ls -l
total 32816
-rw-r--r-- 1 ignacio ignacio 33554432 jul 23 13:35 initrd.img
drwxr-xr-x 2 ignacio ignacio 4096 jul 23 13:25 ROOT
drwxr-xr-x 3 ignacio ignacio 4096 jul 23 13:25 src
drwxr-xr-x 2 ignacio ignacio 4096 jul 23 13:37 TEST

shell> sudo mkfs.ext2 initrd.img # [2]
shell> sudo tune2fs -c-1 initrd.img # [3]
shell> mount -o loop initrd.img $INITRD_DIR # [4]
shell> sudo mkdir $INITRD_DIR/proc
shell> sudo mkdir $INITRD_DIR/sys
shell> sudo mkdir $INITRD_DIR/tmp
shell> sudo mkdir $INITRD_DIR/var
shell> sudo mkdir $INITRD_DIR/root
shell> sudo mkdir $INITRD_DIR/etc
shell> sudo mkdir $INITRD_DIR/dev
shell> sudo mkdir $INITRD_DIR/lib
shell> cd $INITRD_DIR/dev # [5]
shell> mknod console c 5 1
shell> mknod ram0 b 1 0
shell> mknod null c 1 3
shell> for i in 0 1 2 3 4
shell> do
shell> mknod tty$i c 4 $i
shell> done


[1] dd copia bloques de datos desde una entrada (in) a una salida (out), copia la cantidad de bloques en count (32*1024=32768 bloques) de un tamaño bs (1024 bytes). En este caso copia 32mb bloques del device zero, que solo entrega 0's, a initrd.img. man dd

[2] mkfs.* son los comandos para formatear una partición en *fs, en este caso ext2. El comando va a preguntar si estamos seguros de formatear una "no partición", le decimos que si o yes. man mkfs
[3] nos aseguramos que nunca haga un auto fsck del filesystem. man tune2fs
[4] como initrd.img no es un device, usamos el device loop para hacer de interfaz entre el archivo y el mount. Es decir, montamos un archivo en el filesystem. man mount
[5] creamos los devices mínimos default. man mknod

Ahora tenemos una imagen de initrd vacia montada en $INITRD_DIR.
ediciones Este post tiene Ediciones [ver ediciones]
Post relacionados
Crear un initrd desde cero (entrega 1)
Crear un initrd desde cero (entrega 3)
Integrando APC con PHP5 (debian etch y apache2)
Tuquito Linux en Classmate PC
Curso de Administración de Sistemas GNU/Linux



 Por lorca el Miércoles 23/07/2008 a las 16:30 hs.
#1    joya!

dream es nuevo admin

Agregar comentario
Si tu comentario es con fin de generar bardo se te votará negativamente y con eso perdes puntos y además tu comentario quedará oculto