Introducción
Emdebian es una distribución Debian especialmente diseñada para dispositivos empotrados. Su principal característica radica en el poco espacio que ocupa la distribución.
Emdebian ofrece una Toolchain, un conjunto de herramientas de compilación cruzadas para crear paquetes para nuestra plataforma y repositorios con paquetes que ofrecen soporte a arquitecturas arm, ia64, m68k, mips, mipsel, powerpc y sparc. La instalación puede realizarse desde una máquina Debian con una arquitectura distinta a la arquitectura destino sin ningún tipo de problema utilizando debootstrap o, como se hará en ésta receta, utilizando multistrap, que permite crear un sistema nuevo utilizando varios repositorios y echando mano de apt y dpkg para solucionar posibles conflictos.
Qué necesitamos
Pues como he dicho anteriormente, utilizaremos multistrap, así que nos lo instalamos en nuestra máquina (ya sabeís, apt-get o aptitude bla, bla, bla…).
Además, supondremos que seguimos las recetas anteriores sobre cómo compilar Linux para mini2440 y sobre cómo configurar u-boot para arrancar el sistema desde una micro-sd.
Deberemos tener una tarjeta microSD con dos particiones, una para el núcleo y otra que dejaremos para el sistema (como se explicó en la receta sobre la compilación de Linux). Tendremos el árbol de directorios resultante de la compilación de Linux, pues lo necesitaremos para instalar los módulos del núcleo.
Creación de la imagen
Como se comentó anteriormente, utilizaremos multistrap para crear la imagen de emdebian. Para ejecutar multistrap antes deberemos crear un archivo de configuración en el que especificaremos los repositorios desde los que descargaremos los paquetes, la arquitectura destino y el directorio que se utilizará como destino para la instalación, entre otras cosas. El archivo que he utilizado yo es el siguiente:
-
[General]
-
arch=armel
-
directory=multistrap
-
-
#cleanup=true
-
# same as –no-auth option if set to true
-
# keyring packages listed in each debootstrap will
-
# still be installed.
-
noauth=false
-
# extract all downloaded archives (default is true)
-
unpack=true
-
# aptsources is a list of sections to be used for downloading packages
-
# and lists and placed in the /etc/apt/sources.list.d/multistrap.sources.list
-
# of the target. Order is not important
-
aptsources=Emdebian
-
# the order of sections is not important.
-
# the debootstrap option determines which repository
-
# is used to calculate the list of Priority: required packages.
-
debootstrap=Debian Emdebian
-
-
[Emdebian]
-
packages=ifupdown udev procps netbase vim-tiny module-init-tools wget openssh-server screen apmd
-
source=http://www.emdebian.org/grip/
-
keyring=emdebian-archive-keyring
-
suite=squeeze main
-
-
[Debian]
-
packages=
-
source=http://ftp.uk.debian.org/debian
-
keyring=debian-archive-keyring
-
suite=squeeze main
La clave arch especifica la arquitectura destino de la distribución, en éste caso armel y la clave directory especifica el directorio destino en el que se desplegará la instalación. En nuestro caso, lo hará dentro del directorio multistrap, subdirectorio del directorio en el que se encuentra nuestro archivo de configuración.
Es importante que la clave cleanup esté comentada (o puesta a false). Ésto hará que la caché de apt no se limpie tras la instalación, pues necesitaremos los paquetes para reinstalarlos en el último paso desde la plataforma destino. El resto de opciones del archivo se pueden ver en la página sobre emdebian, así que no las comentaré aquí.
Guardamos el fichero con el nombre multistrap.conf (por darle algún nombre). Después, podemos instalar:
-
javieralso@rigoberto:~/emdebian$ ls
-
multistrap multistrap.conf
-
javieralso@rigoberto:~/emdebian$ sudo multistrap –no-auth -f multistrap.conf
Podemos ver que el directorio multistrap en el que quedará instalado emdebian y el archivo de configuración están bajo el mismo directorio. Tras invocar a multistrap podremos ver como se descargan los paquetes y se desempaquetan dentro del directorio multistrap.
Ahora tendremos un sistema muy básico que todavía no es funcional del todo. Tendremos que reinstalar todos los paquetes en el sistema destino, para lo cual deberemos poder logearnos. Como la distribución que tenemos es muy básica, no podremos hacerlo, puesto que /etc/passwd aún no existe, así que nos lo creamos nosotros:
-
javieralso@rigoberto:~/emdebian$ cd multistrap
-
javieralso@rigoberto:~/multistrap$ sudo su
-
rigoberto:/home/javieralso/emdebian/multistrap# echo "root:Npge08pfz4wuk:0:0:root:/root:/bin/bash" > etc/passwd
-
rigoberto:/home/javieralso/emdebian/multistrap# echo "root:Npge08pfz4wuk:0:" > etc/group
-
rigoberto:/home/javieralso/emdebian/multistrap#
Como podemos ver, también hemos creado el archivo /etc/group. Recordad tener cuidado con no sobreescribir los archivos de VUESTRA máquina, no la vayais a liar….
Lo que hemos hecho ha sido asignar la contraseña password al usuario root utilizando el formato de contraseña salt/password, aunque para finalizar, aún debemos hacer mas cosas:
-
rigoberto:/home/javieralso/emdebian/mutistrap# echo "proc /proc proc none 0 0" >>etc/fstab
-
rigoberto:/home/javieralso/emdebian/multistrap# echo "mini2440" >etc/hostname
-
rigoberto:/home/javieralso/emdebian/multistrap# mknod dev/console c 5 1
-
rigoberto:/home/javieralso/emdebian/multistrap# mknod dev/ttySAC0 c 204 64
Después de ésto, empaquetamos el directorio.
-
rigoberto:/home/javieralso/emdebian/multistrap# tar jcf ../emdebian-grip-071910-armel-debootstrap-squeeze.tar.bz2 .
-
rigoberto:/home/javieralso/emdebian/multistrap#
Ahora, suponiendo que hemos montado la partición 2 de la tarjeta microSD (donde se supone que vamos a instalar el sistema) en el directorio /media/rootfs, podemos cargar ahí el sistema recién creado:
-
rigoberto:/home/javieralso/emdebian/multistrap# cd ..
-
rigoberto:/home/javieralso/emdebian# unp emdebian-grip-071910-armel-debootstrap-squeeze.tar.bz2 /media/rootfs/
-
rigoberto:/home/javieralso/emdebian#
Instalamos los módulos del núcleo que compilamos en su momento, para eso, nos vamos al directorio mini2440 que creamos en su día y ejecutamos lo siguiente:
-
javieralso@rigoberto:~/kernel/mini2440# sudo make INSTALL_MOD_PATH=/media/rootfs/ O=../kernel-bin/ modules_install
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
-
Lots and lots of INSTALL messages
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
Desmontamos la tarjeta, la insertamos en nuestra MINI2440 y arrancamos (conectando el puerto serie de la tarjeta a nuestro PC y arrancando minicom).
Cuando el sistema termine de arrancar, veremos que se para porque no encuentra el archivo /etc/inittab:
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
-
mmcblk0: mmc0:b368 MSD 1.85 GiB
-
mmcblk0: p1 p2
-
s3c2410-rtc s3c2410-rtc: setting system clock to 2010-07-20 23:14:47 UTC (1279667687)
-
usb 1-1: new full speed USB device using s3c2410-ohci and address 2
-
usb 1-1: configuration #1 chosen from 1 choice
-
kjournald starting. Commit interval 5 seconds
-
EXT3-fs warning: maximal mount count reached, running e2fsck is recommended
-
EXT3 FS on mmcblk0p2, internal journal
-
EXT3-fs: recovery complete.
-
EXT3-fs: mounted filesystem with writeback data mode.
-
VFS: Mounted root (ext3 filesystem) on device 179:2.
-
Freeing init memory: 136K
-
INIT: version 2.88 booting
-
INIT: No inittab file found
-
Enter runlevel:
Introducimos ‘s’ (single user) y cuando nos pida contraseña introducimos: “password“. De ésta forma tendremos una Shell con permisos de root muy básica, pero con la que podremos terminar de instalar el sistema.
A continuación remontamos el sistema de archivos como sistema de lectura/escritura:
-
root@(none):~# mount -n / -o remount,rw
y después montamos el sistema de archivos /proc:
-
root@(none):~# mount -n /proc
Ahora debemos reinstalar todos los paquetes. Aunque los paquetes ya “están” en el disco, debemos “reinstalarlos” para que se genere la base de datos del sistema:
-
root@(none):~# cd /var/cache/apt/archives
-
root@(none):/var/cache/apt/archives# dpkg –force-all -i libc6* libstdc++* libncurses5* dpkg_*
-
………………………………………………………………………………
-
………………………………………………………………………………
-
lots and lots of installation messages
-
………………………………………………………………………………
-
………………………………………………………………………………
-
root@(none):/var/cache/apt/archives# dpkg –force-all -i apt*.deb
-
………………………………………………………………………………
-
………………………………………………………………………………
-
lots and lots of installation messages
-
………………………………………………………………………………
-
………………………………………………………………………………
Una vez que tenemos instalado apt, reinstalamos todos los paquetes configurando la lista selections de dpkg:
-
root@(none):/var/cache/apt/archives# ls *.deb | sed ‘s/\([^_]*\)_.*/\1 install/’ | dpkg –set-selections
-
root@(none):/var/cache/apt/archives# apt-get dselect-upgrade
-
………………………………………………………………………………
-
………………………………………………………………………………
-
lots and lots of installation messages
-
………………………………………………………………………………
-
………………………………………………………………………………
Aquí es muy probable que se produzcan errores durante la reinstalación. cuando ésto suceda se vuelve a ejecutar apt-get dselect-upgrade hasta que se termine. Para algunos paquetes es posible incluso que tengas que tocar algo a mano, como por ejemplo para que el paquete base-files pueda instalarse correctamente, que en mi caso me fue necesario eliminar el directorio /var/mail a mano.
En éste punto ya casi hemos terminado. Ahora solo falta activar la consola a través de puerto serie:
-
root@(none):/var/cache/apt/archives# cd /
-
root@(none):/# echo ttySAC0 >>etc/securetty
-
root@(none):/# printf "T0:123:respawn:/sbin/getty 115200 ttySAC0\n" >>etc/inittab
¡Y ya está! Reinicia el sistema y ya tendrás una Debian flamante corriendo en tu MINI2440. ¡¡A disfrutarla!!
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
-
…………………………………………………………………………………..
-
Mounting local filesystems…done.
-
Activating swapfile swap…done.
-
Cleaning up temporary files….
-
Configuring network interfaces…done.
-
Cleaning up temporary files….
-
Setting kernel variables …done.
-
Running scripts in rcS.d/ took 20 seconds.
-
INIT: Entering runlevel: 2
-
Using makefile-style concurrent boot in runlevel 2.
-
apmd[1110]: apmd 3.2.1 interfacing with apm driver 1.13 and APM BIOS 1.2
-
Starting Advanced Power Management daemon….
-
Running scripts in rc2.d/ took 2 seconds.
-
Debian GNU/Linux squeeze/sid MINI2440 ttySAC0
-
MINI2440 login: root
-
Password:
-
Last login: Wed Jul 21 01:14:00 CEST 2010 on ttySAC0
-
Linux MINI2440 2.6.32-rc8 #1 Mon Dec 7 16:07:52 CET 2009 armv4tl
-
The programs included with the Debian GNU/Linux system are free software;
-
the exact distribution terms for each program are described in the
-
individual files in /usr/share/doc/*/copyright.
-
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
-
permitted by applicable law.
-
root@MINI2440:~#
Y después…
Lo próximo es la creación de una imagen opie utilizando openembedded.
Referencias
- Página oficial de Emdebian
- Manual de instalación utilizando debootstrap
- Configuración de Multistrap
- Lista de correo de debian-embedded
- DebianWiki
NOTA: Entrada extraída de otra antigua entrada publicada por mi en CrySoL.


