Instalar Arch Linux y Kali Linux en Raspberry Pi (arranque dual con BerryBoot)

Hace poco comentábamos en una breve entrada que Kali Linux, el nuevo BackTrack, incluye soporte ARMEL, es decir, puede instarlarse en Raspberry Pi (Diego Cardanha nos pedía además un mini-tutorial...)

Si habéis leído algunas entradas anteriores sobre RPi en el blog, sabréis que estaba jugando principalmente con la distro Arch Linux, por lo que vamos a mantenerla y aprovechar para instalar dos sistemas operativos en una misma tarjeta SD: Arch Linux y Kali Linux.

Para ello vamos a utilizar BerryBoot, un administrador de multi-arranque que nos facilitará el proceso.

Instalando BerryBoot

La instalación es sumamente sencilla: simplemente descarga el instalador y descomprime el zip en una tarjeta SD con formato FAT.

Al encender la RPi aparecerá la siguiente ventana de bienvenida para calibrar la pantalla, seleccionar el tipo de conexión y la configuración regional:
A continuación seleccionaremos como disco la tarjeta SD para formatearla:
Después de aproximandamente un minuto, nos aparecerá otra pantalla para seleccionar el SO a instalar:
Pulsaremos cancelar puesto que ninguno de los dos sistemas operativos que queremos instalar se encuentran disponible, así que tendremos que añadirlos manualmente. Para ello tendremos que adquirir cada una de las imágenes correspondientes y convertirlas a formato SquashFS, un sistema de archivos comprimido de sólo lectura para Linux, que BerryBoot combina con aufs (AnotherUnionFS) para disponer de un entorno de lectura-escritura. De esta manera se obtienen las ventajas de la alta velocidad de compresión de SquashFS con la posibilidad de alterar la distribución mientras se ejecuta desde la tarjeta SD (liveCD).

Primero necesitaremos un entorno Linux (en mi caso Debian) para realizar todas las operaciones e instalar los siguientes paquetes si no se disponen de ellos previamente:
apt-get install squashfs-tools  kpartx 

Preparando la imagen de Arch Linux

Empezaremos descargando y descomprimiendo la imagen de Arch Linux
prueba@islatortuga:~$ unzip archlinux-hf-2013-02-11.zip
Archive:  archlinux-hf-2013-02-11.zip
  inflating: archlinux-hf-2013-02-11.img  

prueba@islatortuga:~$ file archlinux-hf-2013-02-11.img
  archlinux-hf-2013-02-11.img: x86 boot sector; partition 1: ID=0xc, active, starthead 64, startsector 2048, 184320 sectors; partition 2: ID=0x83, starthead 0, startsector 186368, 3481600 sectors, code offset 0xb8

Ahora utilizaremos kpartx, una utilidad para montar las particiones de un archivo imagen de disco. Con la opción -a diremos que las particiones en el archivo se vuelvan accesibles a través del device mapper, en la ruta /dev/mapper/loop0pX (donde X es el número de la partición). La opción -v es verbose ;):
root@islatortuga:/home/prueba# kpartx -av archlinux-hf-2013-02-11.img 
add map loop0p1 (254:0): 0 184320 linear /dev/loop0 2048
add map loop0p2 (254:1): 0 3481600 linear /dev/loop0 186368

Después montamos la partición 2 en /mnt:
root@islatortuga:/home/prueba# mount /dev/mapper/loop0p2 /mnt

Con el siguiente comando simplemente comentaremos la línea del fichero fstab:
root@islatortuga:/home/prueba# sed -i 's/^\/dev\/mmcblk/#\0/g' /mnt/etc/fstab

Si convirtiéramos ya la imagen nos encontraríamos con un desagradable mensaje durante el arranque: 
Error: having a symlink for /lib and/or /sbin inside your image is not allowed!
This conflicts with the shared AUFS folders
...
switch root: can't execute '/sbin/init': no such file or directory
...

Esto es debido a que con las últimas actualizaciones en Arch Linux todos los archivos del directorio /lib han sido movidos a /usr/lib y ahora /lib es un enlace simbólico a usr/lib:
root@islatortuga:/home/prueba# ls -las /mnt/lib
0 lrwxrwxrwx 1 root root 7 Dec 30 22:01 /mnt/lib -> usr/lib

Al no permitirse estos enlaces simbólicos, el directorio /lib y las librerías compartidas de glibc (ficheros .so) no son accesibles y (entre otros problemas) no se pueden ejecutar binarios como "init", en System V el primer proceso en ejecución tras la carga del kernel y el que a su vez genera todos los demás procesos, y por lo tanto no hay arranque...

Como workaround borraremos el enlace y duplicaremos los directorios, luego más adelante veremos como actualizar el sistema (systemd) y corregirlo:
root@islatortuga:/home/prueba# rm /mnt/lib && cp -r /mnt/usr/lib/ /mnt/lib

Ahora finalmente para convertir la imagen en formato squashfs ejecutaremos el siguiente comando (omitiendo el directorio /lib/modules y seleccionando compresión lzo):
root@islatortuga:/home/prueba# mksquashfs /mnt archlinux-hf-2013-02-11_berryboot.img  -comp lzo -e lib/modules
Parallel mksquashfs: Using 1 processor
Creating 4.0 filesystem on archlinux-hf-2013-02-11_berryboot.img, block size 131072.
[===========================================================|] 25865/25865 100%
Exportable Squashfs 4.0 filesystem, lzo compressed, data block size 131072
    compressed data, compressed metadata, compressed fragments, compressed xattrs
    duplicates are removed
Filesystem size 172472.18 Kbytes (168.43 Mbytes)
    50.48% of uncompressed filesystem size (341693.74 Kbytes)
Inode table size 391330 bytes (382.16 Kbytes)
    34.95% of uncompressed inode table size (1119672 bytes)
Directory table size 389368 bytes (380.24 Kbytes)
    54.23% of uncompressed directory table size (718049 bytes)
Xattr table size 43 bytes (0.04 Kbytes)
    53.75% of uncompressed xattr table size (80 bytes)
Number of duplicate files found 2926
Number of inodes 32818
Number of files 26548
Number of fragments 1281
Number of symbolic links  2883
Number of device nodes 3
Number of fifo nodes 1
Number of socket nodes 0
Number of directories 3383
Number of ids (unique uids + gids) 6
Number of uids 2
    root (0)
    unknown (87)
Number of gids 6
    root (0)
    unknown (11)
    tty (5)
    unknown (81)
    staff (50)
    unknown (87)

Y ya tenemos la imagen que debemos guardar en un pendrive USB:
root@islatortuga:/home/prueba# du -h archlinux-hf-2013-02-11_berryboot.img 
169M    archlinux-hf-2013-02-11_berryboot.img
root@islatortuga:/home/prueba# file archlinux-hf-2013-02-11_berryboot.img 
archlinux-hf-2013-02-11_berryboot.img: Squashfs filesystem, little endian, version 4.0, 176611513 bytes, 32818 inodes, blocksize: 131072 bytes, created: Wed Mar 20 11:51:48 2013

Finalmente desmontamos el directorio y liberamos la imagen:
root@islatortuga:/home/prueba# umount /mnt
root@islatortuga:/home/prueba# kpartx -d archlinux-hf-2013-02-11.img 
loop deleted : /dev/loop0

Preparando la imagen de Kali Linux

No comentaré cada paso porque la preparación de la imagen de nuestra distro de pentesting favorita es igual que la anterior, exceptuando que no es necesario realizar ninguna modificación para el directorio /lib.
root@islatortuga:/home/prueba# gzip -d kali-linux-1.0-armel-raspberrypi.img.gz
root@islatortuga:/home/prueba# du -h kali-linux-1.0-armel-raspberrypi.img
4.7G    kali-linux-1.0-armel-raspberrypi.img
root@islatortuga:/home/prueba# file kali-linux-1.0-armel-raspberrypi.img
kali-linux-1.0-armel-raspberrypi.img: x86 boot sector; partition 1: ID=0xc, starthead 0, startsector 1, 125000 sectors; partition 2: ID=0x83, starthead 2, startsector 125001, 9640624 sectors, code offset 0xb8
root@islatortuga:/home/prueba# kpartx -av kali-linux-1.0-armel-raspberrypi.img
add map loop0p1 (254:0): 0 125000 linear /dev/loop0 1
add map loop0p2 (254:1): 0 9640624 linear /dev/loop0 125001
root@islatortuga:/home/prueba# mount /dev/mapper/loop0p2 /mnt
root@islatortuga:/home/prueba# sed -i 's/^\/dev\/mmcblk/#\0/g' /mnt/etc/fstab
root@islatortuga:/home/prueba#  mksquashfs /mnt kali-linux-1.0-armel-raspberrypi_berryboot.img  -comp lzo -noappend
Parallel mksquashfs: Using 1 processor
Creating 4.0 filesystem on kali-linux-1.0-armel-raspberrypi_berryboot.img, block size 131072.
[=========================================================|] 173291/173291 100%
Exportable Squashfs 4.0 filesystem, lzo compressed, data block size 131072
    compressed data, compressed metadata, compressed fragments, compressed xattrs
    duplicates are removed
Filesystem size 1769950.50 Kbytes (1728.47 Mbytes)
    45.82% of uncompressed filesystem size (3863118.06 Kbytes)
Inode table size 2658319 bytes (2596.01 Kbytes)
    35.52% of uncompressed inode table size (7483443 bytes)
Directory table size 2254716 bytes (2201.87 Kbytes)
    48.19% of uncompressed directory table size (4678974 bytes)
Number of duplicate files found 9490
Number of inodes 202989
Number of files 154198
Number of fragments 9813
Number of symbolic links  34690
Number of device nodes 37
Number of fifo nodes 1
Number of socket nodes 0
Number of directories 14063
Number of ids (unique uids + gids) 26
Number of uids 10
    root (0)
    usbmux (104)
    man (6)
    iodine (111)
    miredo (105)
    avahi (108)
    nobody (65534)
    messagebus (102)
    www-data (33)
    libuuid (100)
Number of gids 24
    root (0)
    fuse (104)
    tty (5)
    kmem (15)
    disk (6)
    adm (4)
    ntp (111)
    shadow (42)
    haldaemon (119)
    pulse-access (118)
    bluetooth (108)
    nogroup (65534)
    utmp (43)
    utempter (109)
    crontab (102)
    avahi (115)
    mysql (103)
    messagebus (106)
    netdev (110)
    staff (50)
    www-data (33)
    colord (107)
    libuuid (101)
    mail (8)
root@islatortuga:/home/prueba# umount /mnt
root@islatortuga:/home/prueba# kpartx -d kali-linux-1.0-armel-raspberrypi.img 
loop deleted : /dev/loop0
root@islatortuga:/home/prueba# du -h kali-linux-1.0-armel-raspberrypi_berryboot.img 
1.7G    kali-linux-1.0-armel-raspberrypi_berryboot.img
root@islatortuga:/home/prueba# file kali-linux-1.0-armel-raspberrypi_berryboot.img
kali-linux-1.0-armel-raspberrypi_berryboot.img: Squashfs filesystem, little endian, version 4.0, 1812429316 bytes, 202989 inodes, blocksize: 131072 bytes, created: Wed Mar 20 09:11:26 2013

Añadiendo los dos sistemas operativos en Berryboot

Una vez que ya tenemos las dos imagenes preparadas (archlinux-hf-2013-02-11_berryboot.img y kali-linux-1.0-armel-raspberrypi_berryboot.img) las copiaremos a un pendrive USB, lo conectaremos a la RPi y en el menú de inició situaremos el cursor y dejaremos pulsado el botón hasta que se despliege la opción "Copy OS from USB stick" (disculpar por la calidad de las imágenes, hice las fotos borracho un sábado de madrugada):


A continuación seleccionaremos cada uno de los archivos:


Y haremos favorito el que deseemos. El resultado final es el siguiente:


Posteriormente tendremos que hacer algunas tareas post-instalación básicas, como el redimensionamiento de las particiones para aprovechar el espacio disponible de la tarjeta SD, actualización del software de sistema, creación de usuarios no root, sincronización de la hora, etc. pero eso ya lo dejo en vuestras manos y/o será descrito en futuros artículos ;)

5 comentarios :

  1. Que grande!!! muchas gracias compañero!!! pedazo de curro.

    ResponderEliminar
  2. gracias a ti Diego...
    ahora a ver redimensionar particiones y actualizar los sistemas ;)

    ResponderEliminar
  3. ante todo gracias por el tutorial pero podrías hacerlo de forma genérica estoy intentando crear una sd de debian y de xbian para trastear y tenerlo con la tv. Pero al crear la img de debian me da un error creo que se debe al archivo fstba y a las rutas de las particiones deben ser /sdb0 y sdb1 puede ser?

    ResponderEliminar
  4. -noappend
    soy el de antes con este comando si me deja generar la imagen pero al grabarla no funciona y tampoco carga loop2 de xbian

    ResponderEliminar
  5. anónimo, indícanos la url de las imágenes que utilizas y los pasos que sigues para intentar reproducir el problema. Saludos!

    ResponderEliminar