Vamos a crear un sistema GNU/Linux ARM Ubuntu precise para poder ejecutar binarios de armhf o poder osarlo como kit de desarrollo para esta plataforma.
Para comenzar necesitamos crear un sistema de ficheros inicial (root filesystem) y compilar un Kernelcon las herramientas de crosscompiler para arm, lo cual es muy sencillo en un sistema Debian/Ubuntu.
¿Qué haremos?
0.- prerequisitos
sudo apt-get install debootstrap qemu-user-static qemu-system git gcc-arm-linux-gnueabihf
1.- creamos el rootfs
# creamos el fichero de disco duro
fallocate -l 2GiB ubuntu-armhf.ext3
mkfs.ext3 ubuntu-armhf.ext3
# montamos el disco duro
mkdir mnt
sudo mount -o loop ubuntu-armhf.ext3 mnt
# creamos un initial rootfs usando debootstrap
HOSTNAME=ubuntu-armhf sudo debootstrap --variant=minbase --foreign --arch armhf precise ./mnt
# copiamos el fichero binario linkado estáticamente de QEMU dentro del rootfs
sudo cp /usr/bin/qemu-arm-static mnt/usr/bin/
# hacemos chroot dentro del rootfs e iniciamos un shell usando qemu-arm-static
LANG=C sudo chroot mnt /usr/bin/qemu-arm-static -cpu cortex-a9 /bin/sh
# ejecutamos debootstrap second stage desde el chroot:
/debootstrap/debootstrap --second-stage
# creamos el fichero sources.list para apt:
echo "deb http://ports.ubuntu.com precise main restricted universe
deb-src http://ports.ubuntu.com precise main restricted universe" > /etc/apt/sources.list
echo "deb http://ddebs.ubuntu.com precise main restricted universe multiverse" > /etc/apt/sources.list.d/ddebs.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
# instalamos algunos paquetes fundamentales
apt-get update
apt-get install sudo apt-utils dialog less wget nano net-tools isc-dhcp-client
# creamos un fichero de configuracion para la consola serie
cp /etc/init/tty1.conf /etc/init/ttyAMA0.conf
sed -i "s/tty1/ttyAMA0/" /etc/init/ttyAMA0.conf
# añadimos un usuario
adduser mi_usuario
# añadimos el usuario al grupo sudo
usermod -aG sudo mi_usuario
# salimos del entorno chroot
exit
# desmontamos el rootfs
sudo umount mnt
rmdir mnt
2.- cross compilacion del Kernel
# nos descargamos las fuentes del Kernel
git clone -depth=1 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
mkdir linux-build
cd linux
# creamos un .config basado en la configuración por defecto
make ARCH=arm O=../linux-build vexpress_defconfig
# compiamos el Kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=../linux-build -j`getconf _NPROCESSORS_ONLN` zImage
cd ..
3.- arracamos la imagen usando QEMU
qemu-system-arm \
-M vexpress-a9 -m 1024 \
-serial stdio -no-reboot \
-kernel linux-build/arch/arm/boot/zImage \
-drive file=ubuntu-armhf.ext3,if=sd,cache=writeback \
--append "rw console=ttyAMA0,38400n8 console=tty root=/dev/mmcblk0"