Raspberry PI 3: Arrancar desde USB

Raspberry Pi Logo

Uno de los principales problemas que tiene la Raspberry Pi (especialmente para los que la usamos de manera intensiva) es la facilidad que tiene para corromper las tarjetas SD.

Gracias a este tutorial vamos a resolver este problema y a dar un poco más de vida a nuestro querido mini-pc, reproductor multimedia, consola retro, etc…

Un poco de historia

Cuando se presentó la Raspberry Pi 3, se anunció entre otras novedades que se iba a trabajar en nuevos modos de arranque. El primero que se ha presentado (y en que basamos este tutorial) es el USB mass storage boot mode, el arranque desde USB, vamos.

Gracias a una pequeña ROM de la que dispone el chipset BCM2837 de la Raspberry Pi 3, se ha podido implementar un arranque múltiple en tan solo 32kB que prácticamente abre la puerta al arranque desde cualquier dispositivo conectado a la Raspberry actual o a futuras versiones (según su diseñador, soporta: SD boot, eMMC boot, SPI boot, NAND flash, FAT filesystem, GUID and MBR partitions, USB device, USB host, Ethernet device, and mass storage device).

Cosas que vamos a necesitar

  • Una Raspberry Pi 3 y todos sus cables para conectarla a una TV.
  • Una tarjeta SD de al menos 8GB de capacidad, formateada en FAT32. Nosotros vamos a utilizar una Micro SD Samsung de 16 Gigas UHC 1.
  • Una memoria USB de al menos 8GB de capacidad, formateado ya que se borrarán los datos más adelante. Nosotros utilizaremos un SANDISK Cruzer Micro de 32 Gb.
  • La imagen de Raspbian que se puede descargar de aquí.
  • Win32DiskImager si estás en Windows, o dd si trabajas en Linux/Mac.
  • El proceso requiere conocimientos de la línea de comando de Linux, aunque copiando y pegando las instrucciones de este tutorial conseguiremos un arranque 100% funcional.

Consideraciones previas

  • Lee todos los pasos atentamente.
  • No te dejes ninguna línea sin escribir, exactamente en el mismo orden que el que las escribimos.
  • No nos hacemos responsables de los daños que podáis causar a la Raspberry, la SD o el USB si no seguís de manera exacta. Realmente no es posible hacer un daño mucho que no necesite más que un formateo, pero lo avisamos igual.
  • Cualquier duda que tengáis la podéis escribir en los comentarios del Post, intentaremos solventarla lo antes posible.
  • IMPORTANTE: Este tutorial sólo funciona para la Raspberry Pi 3. En breve añadiremos otro para los modelos anteriores, aunque adelantamos que requieren de una tarjeta SD para el pre-arranque.
  • IMPORTANTE: Estos modos de arranque son experimentales y están en beta-testing aún. Si dudas o no sabes de lo que estamos hablando lo mejor es que esperes a que se publique el nuevo firmware, que en teoría debería de incluirlos de manera oficial y estable.
  • Por lo que hemos podido leer, no funcionan todas las memorias USB. Por favor, comentad si os ha funcionado y el modelo con el que lo habéis probado.

Programar el modo de arranque USB

Instalar Raspbian en la SD

Desde un PC/MAC, instala la imagen de Raspbian en la SD (mediante Win32DiskImager o dd según el Sistema Operativo).

Inserta la SD que acabas de preparar en la Raspberry y arráncala. Cuando haya pasado todo el proceso de arranque, si estás en un entorno gráfico abre una consola para escribir las siguientes instrucciones.

Preparar el arranque

Prepararemos el directorio /boot con con los ficheros del arranque experimental. Para ello, seleccionaremos la rama “next” del paquete rpi-update.

Como paso previo, si la imagen que hemos descargado es la Raspbian Lite, necesitaremos antes instalar los paquetes de rpi-update:

$ sudo apt-get update; sudo apt-get install rpi-update

Con esta instrucción seleccionamos la rama “next” para rpi-update:

$ sudo BRANCH=next rpi-update
Activar el modo de arranque USB

Activaremos el USB boot mode con este código, que lo que hace es añadir el parámetro program_usb_boot_mode=1 al final de fichero /boot/config.txt, que modifica el flag de la memoria OTP para indicar que se habilita el USB boot mode:

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

Reinicia entonces la Raspberry Pi con:

$ sudo reboot

Una vez reiniciada, comprueba que el flag de la memoria OTP ha sido modificadao correctamente con la siguiente instrucción:

$ vcgencmd otp_dump | grep 17:

Esto debería responder el siguiente valor (nos aseguramos que de este valor o es que algo hemos hecho mal):

17:3020000a

NOTA: Modificar la memoria OTP (One Time Programmable memory) para habilitar estos nuevos modos de arranque no es reversible; pero no sufras, podrás seguir arrancando con normalidad por SD si utilizas la Raspberry Pi para más de una cosa, incluso si decides no seguir arrancando por USB (un USB con Raspbian, una SD con Retropie, otra SD con OSMC, etc…). Únicamente estamos activando un flag que le dice al firmware que puede usar esos modos de arranque, no que obligatoriamente vamos a arrancar con USB.

Ahora ya podemos modificar de nuevo el fichero config.txt para poder utilizar la SD en otra Raspberry sin que se intente marcar el flag de la memoria OTP al iniciar. Tendremos por tanto que eliminar o comentar (añadiendo al principio el carácter #) la línea de configuración con el parámetro program_usb_boot_mode=1 prestando especial atención en no dejar ningún espacio ni carácter extraño al eliminarla. Se puede hacer extrayendo la SD y editándola desde Windows, Mac, etc. o en la propia Raspberry con el comando (requiere conocimientos):

$ sudo nano /boot/config.txt

Preparar el USB

Lo siguiente que vamos a hacer es preparar nuestra memoria USB para arrancar desde ella. Para ello, formatearemos, particionaremos e copiaremos los ficheros necesarios desde la SD.

Comprueba que no tienes ninguna otra memoria USB conectada a na Raspberry Pi y conecta la que desees preparar. Recuerda que los procesos que lanzaremos más adelante borrarán los datos de la memoria USB, así que haz copia de todo lo que tengas dentro si es que no quieres perderlo.

Damos por supuesto que la SD está disponible en /dev/mmcblk0 y la memoria USB estará en /dev/sda.

Procederemos a crear dos particiones: una de 100 MB en FAT32 y otra que contendrá el espacio del resto del disco en formato ext4 de Linux. Seguiremos las siguientes instrucciones tal como vayan apareciendo en pantalla (este ejemplo es para una memoria de 32GB):

$ sudo parted /dev/sda

(parted) mktable msdos
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
(parted) mkpart primary fat32 0% 100M
(parted) mkpart primary ext4 100M 100%
(parted) print
Model: SanDisk Ultra (scsi)
Disk /dev/sda: 30.8GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  99.6MB  98.6MB  primary  fat32        lba
 2      99.6MB  30.8GB  30.7GB  primary  ext4         lba

Lo siguiente será crear los sistemas y ficheros de arranque (boot) y raiz (root):

sudo mkfs.vfat -n BOOT -F 32 /dev/sda1
sudo mkfs.ext4 /dev/sda2

Continuaremos montando el sistema de ficheros objetivo (target) y copiaremos en él el sistema actual (Raspbian):

sudo mkdir /mnt/target
sudo mount /dev/sda2 /mnt/target/
sudo mkdir /mnt/target/boot
sudo mount /dev/sda1 /mnt/target/boot/
sudo apt-get update; sudo apt-get install rsync
sudo rsync -ax --progress / /boot /mnt/target

Regeneramos las claves del Host SSH:

cd /mnt/target
sudo mount --bind /dev dev
sudo mount --bind /sys sys
sudo mount --bind /proc proc
sudo chroot /mnt/target
rm /etc/ssh/ssh_host*
dpkg-reconfigure openssh-server
exit
sudo umount dev
sudo umount sys
sudo umount proc

Editamos el fichero /boot/cmdline.txt para que utilice la memoria USB como el sistema de archivos raíz en lugar de la tarjeta SD.

sudo sed -i "s,root=/dev/mmcblk0p2,root=/dev/sda2," /mnt/target/boot/cmdline.txt

Haremos lo mismo con fstab:

sudo sed -i "s,/dev/mmcblk0p,/dev/sda," /mnt/target/etc/fstab

Por último, desmontamos el sistema de ficheros objetivo y apagamos la Raspberry Pi.

cd ~
sudo umount /mnt/target/boot
sudo umount /mnt/target
sudo poweroff 

Con la Raspberry Pi apagada, desconectamos la fuente de alimentación, sacamos la tarjeta SD y volvemos a reconectar la fuente de alimentación… si todo ha ido bien, tendremos un arranque desde la memoria USB completamente funcional. Enhorabuena!

Esperamos que os haya gustado el tutorial.

17 pensamientos sobre “Raspberry PI 3: Arrancar desde USB

  1. Salvador

    Hola , gracias por el tutorial,estoy intentando seguirlo pero tengo algunas dudas.
    Se puede hacer con una imagen ya en uso?
    Se puede hacer con Noobs y una última cosa, cuando empieza el comando con cd / ~ , eso no tengo que ponerlo en el termihal no?
    Gracias de antemano y un saludo

    1. eNeRGy2k

      Buenas,
      Tengo pendiente re-editar el post para aclarar algunas cosas, pero con el trabajo y demás me es imposible mantener decentemente actualizada la web.
      Respondo a tus dudas:
      – La parte de la transferencia de la imagen te la puedes ahorrar. Es más, si únicamente haces los pasos hasta antes de “Preparar el USB” y luego montas una imagen en un USB y lo arrancas con la SD quitada te debería ir sin problema alguno (yo lo tengo así 🙂 ).
      – He intentado de mil maneras arrancar noobs desde usb… y no se puede. En la reedición aclaré esto 😉
      – El comando cd ~ te lleva a tu Home (la carpeta de inicio de tu usuario). Realmente no es necesario en el tuto y más cuando vamos a desmontar y apagar la máquina, pero no estaba de más porque estábamos situados en la ruta de la memoria que íbamos a desmontar.
      Espero que el tuto te haya sido útil y que con mis comentarios lo haya aclarado todo.
      Saludos.

      1. Salvador

        Muchísimas gracias por tu ayuda,lo voy a intentar como dices montando la imagen en el pendrive,a ver si soy capaz.
        Un saludo y gracias otra vez

          1. Salvador

            No he sido capaz,seguramente estoy haciendo algo mal,seguí todos los pasos hasta el apartado PREPARAR USB y comprobé el valor de la memoria y efectivamente era 17:3020000a.
            Los pasos los hice con una sd 16Gb con raspbian instalado desde Noobs
            y la imagen que monte en el usb era raspbian jess con pixel,que creo que es la misma que contiene noobs.
            Perdona mi ignorancia pues soy nuevo,pero he hecho ya varios proyectos con raspberry pi y arduino y me encanta este mundo.

            Muchas gracias por tu interés,seguiré intentándolo hasta que lo consiga,por pesao.

            Saludos

          2. eNeRGy2k

            Hola de nuevo,
            Prueba lo siguiente:
            * Instala en una SD la imagen de Raspbian Jessie con Pixel mediante Win32DiskImager (pones la SD en el lector, conectas al PC, eliges la imagen y Write – ojo con no equivocarse de unidad 😉 ).
            * Arranca con esa SD y haz los pasos hasta antes de “Preparar el USB”. Si el flag está bien y todo funciona, apaga y retira la SD.
            * Instala en un USB la imagen de Raspbian Jessie con Pixel mediante Win32DiskImager (pones el USB en el PC, eliges la imagen y Write – ojo de nuevo con no equivocarse de unidad 😉 ).
            * Pon el USB en la Pi y sin SD arranca. Todo debería ir bien.
            Ya me cuentas 🙂

    1. Salvador

      Nada, incluso he probado dos USB y no he podido iniciar.
      Tengo una duda,cuando añadimos el parámetro program_usb_boot_mode=1 al final de fichero /boot/config.txt para habilitar el USB boot con:

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

      Luego reiniciamos y comprobamos el flag¿es necesario modificar el fichero de nuevo eliminando o comentando con # ?

      De todas formas no te preocupes,no quiero hacerte perder más el tiempo,esperaré a la revisión pendiente porque,seguro que hay algo que hago mal.
      Te agradezco mucho tu interés y ayuda.

      Saludos

      1. eNeRGy2k

        Hola de nuevo,
        Intentaré tener la revisión para lo antes posible, posiblemente para el sábado, pero en resumen es hacer lo que te he comentado.
        Esa línea de la configuración únicamente sirve para ‘avisar’ al sistema de que debe marcar el Flag de la memoria, la quitamos por seguridad, para no marcar el Flag en otra Pi si reutilizamos la SD.
        No me hacéis perder el tiempo, para eso estamos. Más os agradezco yo que nuestros tutoriales y guías os sirvan 😉
        Sigue intentándolo, que seguro que te sale pronto.
        Un saludo

      2. eNeRGy2k

        Buenos días, una cosilla… Has probado a esperar un rato a que arranque? Es que no es instantáneo como con la SD, tarda como 20 segundos y también leí que es un poco pejiguero con la marca del USB.

        1. Salvador

          Si,la verdad es que suponía que no iba a ser instantáneo y espera algo más.
          También intenté ayer continuar con el proceso preparando el USB y con el comando: sudo parted /dev/sda ,para crear las particiones,me daba un error que no recuerdo,pero tomaré nota.
          Una última cosa ,en raspberry.org dice lo siguiente:

          En lugar de descargar de nuevo la imagen Raspbian, la copiamos de la tarjeta SD en el Pi. El dispositivo fuente (tarjeta sd) será / dev / mmcblk0 y el dispositivo de destino (disco USB) debería ser / dev / sda asumiendo que no hay ningún otro dispositivo USB conectado.

          Seguro que lo has visto pero ,que te parece?Crees que es mejor montarla en el USB?
          Saludos,seguiré intentandolo

          1. eNeRGy2k

            Buenas,
            Es posible que el error que te diera es que no estaba en /dev/sda sino en sdb o en otra ubicación, tendrías que ver en qué punto monta el USB y cambiar el comando.
            El tutorial que hicimos se basaba en un Paper del creador del arranque (creo que ahora cuelga de la propia página de raspberry.org) y especificaba eso, pero por ahorrar el tener que copiar la imagen de nuevo contra un USB. En un principio debería de funcionar bien con una memoria USB recién instalada.
            Si quieres ahorrar en tiempo, y así salimos de dudas, prueba lo siguiente:
            * Debes de tener un lector de microSD a USB.
            * Pon la microSD en el lector al USB de la Pi.
            * Arranca. Si es ok, el sistema de ficheros que se crea a partir de la imagen cuando la creamos contra el USB puede que no sea compatible con el arranque usb y entonces tendríamos que verlo. Yo tengo la Jessie Lite así funcionando desde hace tiempo.

            Ya me dices, a ver si hay suerte 😉

  2. carlos velazquez lopez

    amigo que tal ami me funciono tu tutorial con un pendrive usb, ahora mi duda es si se podra con un dico duro exteno de 250 gb ya que de ahi no puedo arrancarlo, y otra duda seria tambien si puedo cargar una imagen preconfigurada de 200 gb en ese disco y arrancar desde ahi?

    1. eNeRGy2k

      Buenas,
      Es posible que sí puedas arrancar desde un disco usb, siempre que se cumplan estos dos requisitos:
      * Que la raspberry tenga potencia suficiente para arrancar el disco usb con su alimentación propia. Esto se podría solventar con una fuente de alimentación de más amperios (3mA debería ser suficiente).
      * Que el disco arranque lo suficientemente rápido para que se pueda usar como disco de arranque. Normalmente lo es, pero nos hemos topado incluso con algún pendrive usb que no arranca porque da un “timeout”.
      Recuerda que el nombre de la unidad puede que varíe; también recomendamos no tenerlo particionado y menos con datos en la partición que no sea del arranque, para evitar problemas y “pérdidas inesperadas”.
      Con respecto a la imagen preconfigurada, te respondo a tí y a Salvador:
      * Hemos estado investigando cómo hacer una imagen mínima que sea “instalable” en un pendrive, al igual que se hace sobre una microSD. El principal problema es que uno de los pasos que se hacen en este tutorial (el del rsync) lo que hace es copiar todo el sistema de arranque que hemos preparado en los pasos anteriores al usb, con lo que tendríamos una copia exacta de la SD y su arranque en el USB.
      * A partir de ahí sí podríamos crear una imagen de ese USB y copiarla en otro USB, de modo que tendríamos un Raspbian clonado. OJO: No podríamos usar ese USB en otra Raspberry si no tenemos activado el Modo Arranque desde USB.
      * Si entiendo, lo que quieres es usar una imagen preconfigurada (Recalbox, OSMC, etc.) en modo USB. De primeras, la respuesta es NO, pero no es del todo cierto… Si montas la imagen en la SD, arrancas en el modo línea de texto o desde una consola (en cada uno se puede arrancar de manera distinta) y sigues todos los pasos es posible que lo consigas. Avísanos si lo consigues 😉
      Espero que te hayamos solventado tus dudas y que si te queda alguna nos la consultes.
      Saludos.

  3. Bea

    Hola, primero mi enhorabuena por el post. Ha sido el único bien explicado, lo guardo como si fuera la biblia de la raspberry para mi 🙂

    En principio utilicé este tutorial para Retropie, sin embargo desde el fillezilla intento acceder a la ruta del disco y no me aparece. Aparecen las carpetas de la sd y si intento meter juegos, van a la tarjeta y no al disco
    ¿ cómo podría modificar esto?
    Gracias

    1. eNeRGy2k

      Buenas,
      Disculpa porque hace mucho tiempo que no entraba y tengo el blog hecho unos zorros.
      En un principio, una vez traspasado todo al USB no es necesario tener una tarjeta SD insertada ya que el arranque lo debe detectar (esto es como en un PC, que primero intenta arrancar el CD, luego el Disco Duro, etc.). Entiendo que todavía está arrancando con la SD porque la tienes puesta y por eso Filezilla te muestra esas rutas.
      En caso de que arrancara por USB, igual el problema es del propio Retropie, que tiene puesto “a piñón” las rutas compartidas de la SD. En este caso te puede pasar que si quitas la SD no te salga nada o incluso de un error. Otra opción que tienes es crear symlinks, pero es un trabajo importante y la puedes liar 😉
      Yo te recomendaría que probaras Recalbox, ya que tiene idioma Castellano y, entre otras cosas, permite elegir desde dónde cargar las ROMS (SD o USB).
      Ya me cuentas!

Deja un comentario

A %d blogueros les gusta esto: