En este apunte describo cómo instalar Gentoo Linux en una Raspberry Pi 2. Necesito poder “Compilar el programa Tvheadend para ARMv7 y copiarlo a un MOIPro” y se supone que es más rápido hacerlo desde una RPi2 que emular el chip ARM en un x86, así que he optado por usar Gentoo como un equipo de desarrollo para ARM. Independientemente del caso de uso, si sigues estos pasos tendrás un Gentoo Linux en una RPi2.

RPi2Gentoo

Los requisitos son los siguientes:

  • Una Micro-SD (he usado una de 16GB clase 10)
  • PC o VM con Gentoo LInux (con acceso a la Micro-SD)
  • Una fuente de alimentación de 2A
  • Una RPi2 + teclado USB

Formatear la Micro-SD

Formatea la Micro-SD, usa el método que quieras, en mi caso uso un MacOSX y el programa SDFormatter. (opción Quick Format)

  • Insertar la tarjeta que se montará como “NO NAME”.
  • Averiguar device (resultó ser /dev/disk3): df -h
  • Ejecutar SDFormatter

Captura de pantalla 2015-05-17 a las 9.05.15

  • Desmontar el volumen: sudo diskutil unmount /dev/disk3s1

Preparar los File Systems

Para preparar los File Systems de la Micro-SD usaré un PC (o Máquina Virtual) donde ya tenga instalado Linux y que además pueda acceder a la Micro-SD.

Para mi lo más sencillo ha sido usar una VM con Gentoo Linux (x86_64) corriendo en Parallels para MacOX. Tras arrancarla, conecto la Micro-SD a la máquina virtual, que la reconoce como /dev/sdb.

MicroSD_Parallels1
MicroSD_Parallels2

Desde esta máquina virtual y usando fdisk creo tres particiones en la Micro-SD:

  • Partición 1: Tipo “c” (W95 FAT32 (LBA)), 50MB. Será la partición desde la cual haremos boot.
  • Partición 2: Tipo “82” (Linux SWAP), 256MB. Partición para el área de SWAP
  • Partición 3: Tipo “83” (Linux), resto del espacio del disco para root

  • Creo los filesystems y los monto

Preparar la partición “/boot”

Como has visto antes, la partición de boot es de tipo VFAT (el formato nativo de MSDOS y Windows), y se utiliza para hacer boot del Linux que vamos a instalar en la Raspberry. Lo que haremos es aprovechar un proyecto que tienen los de Raspberry disponible en GitHub para facilitar todo este proceso de boot.

  • Necesitamos copiar a la partición VFAT el directorio boot del proyecto firmware de Raspberry Pi (Fuente Github). Podrías hacer un clone completo del proyecto (ojo! es enorme) o mejor… usa svn para bajarte solo el directorio “boot” (GIT no permite bajarse directorios de un proyecto, pero tenemos la suerte de que GitHub soporta subversion).

  • Copio el contenido del directorio boot al filesystem de arranque /mnt/sd_boot/:

  • Creo un fichero /mnt/sd_boot/cmdline.txt

AVISO: A continuación vamos a compilar nuestro propio Kernel y sobreescribiremos el que acabamos de copiar.

Compilar el Kernel ARM

El siguiente paso es crear mi propio Kernel compilando para ARM para la RPi2. Lo voy a hacer desde mi Máquina Virtual con Linux x86_64, a esto se le llama “cross-compilar” y por lo tanto voy a instalar el paquete crossdev !!!.

  • Instalo GIT y CROSSDEV:

  • Creo un “output overlay” local (más información aquí)

Los Overlays contienen ebuilds adicionales que no son parte del árbol principal de portage. El overlay que necesito crear es local a este Gentoo donde voy a hacer el “crossdev”

  • Creo el “toolchain” para poder compilar y generar código para ARM.

A continuación necesito conseguir el fichero .config del Kernel. Este paso es importante, hacerlo manualmente puede llevarte a error. Lo mejor es aprovechar el trabajo que ya han hecho los de Raspberry o descargarte una copia de mi fichero .config.

  • Opción 1: Descarga esta versión del fichero .config.

  • Opción 2: Aprovechar el trabajo que ha hecho el equipo de Raspberry. Accedo a un RASPBIAN instalado en una RPi2, por ejemplo Raspbian 2015-05-05, extraigo el Kernel y lo copio al Linux que voy a usar para compilar el Kernel.

  • Descargo los fuentes de Linux

  • Prepara el kernel (make oldconfig)

  • Opcionalmente puedes modificarlo (make menuconfig)

  • Compila el kernel (make)

  • Copio la imagen del kernel ( linux/arch/arm/boot/Image) a la Micro-SD ( /mnt/sd_boot/kernel7.img).

Instalar Stage3

  • Descargo el último Stage3 (consultar aquí cual es el último)

  • Copio los fuentes de linux

  • Edito la línea CFLAGS en el fichero make.conf

  • Edito el fstab

  • Cambio la contraseña a root. Hay que crear la contraseña y modificar el fichero /mnt/sd_root/etc/shadow.

  • En el fichero /mnt/sd_root/etc/initttab comentar la línea s0:12345:respawn:/sbin/agetty -L 9600 ttyS0 vt100.

Instalar Portage

  • Descargar y desempaquetar la última versión de portage

Boot

  • Desmontar los filesystems

Haz Boot con tu nueva Pi2 con Gentoo Linux. Insertar la Micro-SD en la Pi y encenderla. Ya está, deberías tener una RPi2 con Gentoo Linux lista para hacer boot…

Migrar a systemd y parametrizar

Una vez que el equipo rearranca tenemos que completar la instalación. Recomiendo migrar a systemd para acelerar el boot. Además hay que parametrizar muchas cosas todavía.

Systemd-204-Released-with-Two-Fixes

  • Pon en hora el equipo (MUY IMPORTANTE)

  • Sobreescribe /etc/portage/profile para añadir systemd

Hostname
Con systemd se deja de usar /etc/conf.d/hostname, así que voy a editar a mano directamente los dos ficheros que emplea systemd:

  • Ajustes recomendados al trabajar con Gentoo

  • Preparo el mtab, realizar un link simbólico especial

  • Activo systemd. Añado init=/usr/lib/systemd/systemd al fichero /boot/cmdline.txt para que en el próximo boot utilice systemd.

  • Reboot

Teclado y Locale

Parametrizo con systemd el teclado y los locales ejecutando los tres comandos siguientes:

El primer comando modifica /etc/vconsole.conf

El siguiente modifica /etc/X11/xorg.conf.d/00-keyboard.conf

El siguiente modifica /etc/locale.conf

El ultimo simplemente para comprobar

Preparo el fichero locale.gen

Compilo los “locales”

La red

Vamos a “contectar”, instalo, habilito y arranco DHCP. Los servicios en “systemd” se programan para futuros arranques con “systemctl enable” y se pueden arrancar o parar con “systemctl start/stop”.

Aquí tienes un ejemplo de cómo hacer una configuración de dirección IP fija (manual).

Si todo falla siempre puedes asignar una IP fija mientras solucionas el problema. Averigua cómo se llama el interfaz, un ejemplo:

Activo SSHD

Otro indispensable, habilito y arranco el daemon de SSH para poder conectar con esta VM vía ssh. Si en el futuro quieres poder hacer forward de X11 recuerda poner X11Forwarding yes en el fichero /etc/ssh/sshd_config

Vixie-cron

Instalo, habilito y arranco el cron

Fecha y hora

Para configurar fecha/hora debe utilizarse “timedatectl”. No te pierdas este apunte sobre cómo montar además el servicio NTP.

 

Actualizo portage

Lo primero es hacer un “perl-cleaner” y luego un update completo.

Usuario y rearranque

Desde una shell añado un usuario normal y por último rearranco el equipo. Mira un ejemplo:

Rearranco de nuevo…

Compilar Tvheadend 4.1 para MOI Pro

Ya lo comentaba al principio de este apunte, he construido un Linux (Gentoo) en una Raspberry Pi2 para tener una plataforma de desarrollo para ARM y conseguir ejecutables para esta plataforma. El caso de uso principal es poder compilar mi propia versión de Tvheadend para mi MOI Pro. En mayo de 2015 la versión disponible en GitHub fue HTS Tvheadend 4.1-49.

Captura de pantalla 2015-05-24 a las 13.54.29

Compilación

  • Preparar un directorio de trabajo en la “Gentoo Pi2”

Con un usuario normal (no hace falta ser root), descargo los fuentes de GitHub.

  • Actualizar Tvheadend a la última versión

Cambia a la versión master:

Solo si se trata de una re-compilación, porque ha pasado tiempo, quieres sincronizar a la última versión y recompilar:

  • Configurar antes de compilar

La configuración se realiza con el siguiente comando:

  • Compilación

Instalación en MOI Pro

  • Transferir el ejecutable

Transfiero el nuevo ejecutable al equipo MOI Pro, al directorio /usr/local/bin. Dado que he compilado con la opcion –enable-bundle, el ejecutable lleva embebidos todos los ficheros necesarios.

  • Hacer un backup de la versión original

Aunque voy a instalar una versión en paralelo a la existente, sin borrarla ni modificarla, siempre hago una Backup del Tvheadend que viene de “fábrica”.

  • Crear un nuevo fichero de servicio tv.service

Creo un nuevo fichero /etc/systemd/system/tv.service para poder activar el daemon desde /usr/local/bin y que no entre en conflicto con el existente (tvheadend.service).

  • Transfiero la configuración

Tenía ya una configuración del Tvheadend original en /\(null\)/.hts/tvheadend, así que la copio al directorio que utilizará el nuevo ejecutable /root/.hts/tvheadend.

  • Deshabilito el antiguo y habilito el nuevo

Desabilito el tvheadend que viene con el MOI Pro y habilito el nuevo.

  • Arranco el nuevo Tvheadend

Arranco el nuevo Tvheadend, detectará una configuración con formato antiguo (v16) y la convertirá a la versión v17 y luego v18.

tvheadend41

  • Ver el Logging

Puedes ver el log en otro terminal en paralelo con el comando journalctl -f.