Raspberry Pi & USB Boot Mode

Como arrancar una Raspberry Pi desde un disco USB

Roberto Lodeiro

En esta primera entrada, explicaré algo que me ha sido muy util a la hora de tener una Raspberry Pi como servidor en casa.

Todos sabemos que la Raspberry Pi, por defecto, utiliza una tarjeta MicroSD como disco para el sistema, lo cual supone muchas limitaciones, tanto a nivel de rendimiento como de durabilidad.

Desde hace relativamente poco, en la documentación oficial se explica como activar el arranque desde un dispositivo usb.


1. Documentación oficial

  • Actualizar nuestra Raspberry Pi

    $ sudo apt-get update && sudo apt-get upgrade
    
  • Habilitar USB boot mode

    $ echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
    

    Esto añadirá program_usb_boot_mode=1 al final de /boot/config.txt. En cuanto reiniciemos la Raspberry Pi, quedará activado USB Boot Mode de forma permanente, podremos arrancar desde un disco USB sin necesidad de la tarjeta MicroSD, pero si esta está presente, se arrancará desde ella. Si utilizamos esta MicroSD en otra Raspberry Pi, en esta también se activará USB Boot Mode.

  • Para comprobar que se ha realizado correctamente

    $ vcgencmd otp_dump | grep 17:
    17:3020000a
    

    Verificamos que la salida sea 0x3020000a. De no ser así, repetiremos el proceso. Si sigue sin funcionar, significa que la Raspberry Pi tiene un problema de hardware. A mi me ha funcionado sin problema tanto en una Pi 3B como en una 3B+.

Solo tenemos que descargar la imagen de raspbian (recomiendo Lite para server) y quemarla en nuestro disco USB de la misma forma que lo haríamos en la MicroSD. Personalmente siempre utilizo la herramienta OpenSource Etcher para esto.

Todo pinta muy bonito, pero, siempre hay un pero.

Problema, solo un HDD

Si queremos utilizar, además del disco USB principal para el sistema, otro u otros discos USB para por ejemplo guardar archivos, nuestra Raspberry Pi ya no arrancará. He intentado especificar en la configuración del boot con cual de los discos se a de arrancar,pero no funciona, así que me temo que esto es algo que no se ha tenido en cuenta al implementar esta característica.

Antes de nada, mencionar que la Raspberry Pi solo alimenta de forma correcta un disco USB. Para utilizar mas discos, tenemos que conectar un hub con alimentación externa propia, y ahí ya podemos conectar el resto de discos.

2. Para poder conectar mas de un disco usb

2.1 Instalación nueva

Partimos teniendo instalado raspbian, tanto en la MicroSD como en el disco USB. Básicamente lo que haremos, será arrancar como siempre con la MicroSD, pero indicando en la configuración de arranque que se utilice la partición root del disco USB en lugar de utilizar la de la MicroSD. En este caso, si necesitaremos la tarjeta MicroSD para arrancar.

Es importante, que tanto la MicroSD como el disco USB, tengan la misma version de Raspbian. Si anteriormente hemos hecho un sudo apt upgrade en nuestra MicroSD, antes de continuar, arrancaremos solo con el disco USB para actualizar el sistema también en el. Yo lo he hecho sin actualizar ninguna de las dos instalaciones, actualizando el sistema posteriormente.

Una vez arrancada la Raspberry Pi con la MicroSD y el disco USB conectado:

  • Entramos en la terminal y listamos los discos con lsblk Esto nos devolverá el listado de discos/particiones que tenemos en el sistema. Ha de figurar montada la MicroSD, normalmente /boot en mmcblk0p1 y la partición root / en mmcblk0p2. Anotamos el nombre de la partición del disco USB donde se encuentra el root, normalmente algo como sda2.

  • Montamos la partición root del disco USB

    $ sudo mkdir /mnt/rootUSB
    $ sudo mount /dev/sda2 /mnt/rootUSB
    
  • Para conocer su PARTUUID

    $ sudo blkid -p /dev/sda2
    

    No confundir UUID con PARTUUID. Encontraremos PARTUUID como PART_ENTRY_UUID="XXXXXXXX-02". Guardamos el código PARTUUID correspondiente a la partición root de nuestro disco USB.

  • Hacemos un backup de la configuración de inicio de la sd y la editamos

    $ sudo cp /boot/cmdline.txt /boot/cmdline.sdBoot.bak
    $ sudo nano /boot/cmdline.txt
    

    Veremos algo como root=PARTUUID=XXXXXXXX-02, correspondiente al /de la sd, lo sustituimos por el PARTUUID correpondiente a la partición root del USB que copiamos antes.

  • Editamos fstab en el disco USB para indicar el /boot de la sd

    $ sudo nano /mnt/rootUSB/etc/fstab
    

    Comentamos la linea correspondiente al /boot del usb, y añadimos PARTUUID=XXXXXXXX-01 /boot vfat defaults 0 2 para la sd, quedando algo como lo siguiente:

    proc                       /proc           proc    defaults          0       0
    PARTUUID=XXXXXXXX-02       /               ext4    defaults,noatime  0       1
    PARTUUID=XXXXXXXX-01       /boot           vfat    defaults          0       2
    #/dev/mmcblk0p1            /boot           vfat    defaults          0       2
    

    El root, puede aparecer identificado como /dev/mmcblk0p2 o similar. Para evitar problemas, recomiendo cambiarlo por su PARTUUID como muestro arriba.

Al reiniciar, si ejecutamos lsblk veremos como ya está montando, tanto el root / del disco USB como /boot de la MicroSD, con lo cual, ya estamos arrancando con la MicroSD, pero utilizando el root del disco USB, y podemos tener todos los discos que necesitemos conectados, y nuestra Raspberry Pi continuará arrancado sin problemas!

Esta instalación, ha sido suponiendo que estamos haciendo una instalación de raspbian nueva, desde 0 en ambos discos. Si se quiere copiar la partición root de la MicroSD al nuevo disco USB, conservando posibles cambios, es muy sencillo.

2.2 Copiando la partición root de la SD al disco USB

  • Instalamos rsync si no lo estuviera

    $ sudo apt install rsync
    
  • Montamos el disco USB (sustituir sdX por la de vuestro disco USB)

    $ sudo mount /dev/sdX /mnt
    
  • Copiamos / de nuestra MicroSD al disco USB

    $ sudo rsync -axv / /mnt/
    

    Una vez copiada la partición root en el disco USB, procedemos igual que en la parte 2.1


Espero que sea útil, ¡gracias por leerme!