Tutoriales, noticias y soluciones informáticas

Arrancar una Raspberry desde un disco duro externo o un «pen drive».

Las Raspberrys son dispositivos modestos en cuanto a prestaciones, pero son muy versátiles, ya que se les puede dar muchísimos usos diferentes. Por ejemplo, la web desde la que estás leyendo este artículo está alojada en una raspberry (tu ordenador se ha puesto en contacto con mi raspberry y ésta te ha enviado la información para que puedas leer este artículo).

Sí, sí... mucha Raspberry y mucho "internet de las cosas", pero la mía ya se fusiló dos tarjetas de memoria. Acabó destrozándolas y dando problemas. 

Tienes razón, usuario Anónimo. Una Raspberry es como un ordenador completo en miniatura y el equivalente en una Raspberry al disco duro que tienen nuestros ordenadores es una simple tarjeta de memoria microSD. Esto puede suponer ventajas e inconvenientes. Por un lado usar una tarjeta SD le permite tener a la raspberry un tamaño mínimo para poder funcionar con normalidad, y además el precio de una de estas tarjetas suele ser muy bajo y por tanto asequible.

Sin embargo con tarjetas MicroSD no podemos alcanzar los tamaños de almacenamiento que tenemos en un disco duro normal ni las velocidades que podemos alcanzar con un disco duro SSD. Además la experiencia me ha demostrado que si a una tarjeta SD le metes mucha caña (le pides a tu dispositivo que le haga muchas lecturas y escrituras) al final acaban fallando de alguna forma (o bien dando errores o directamente dejando de funcionar). Es factible que si usas una Raspberry en esas circunstancias (haciendo muchas lecturas y escrituras) en cualquier momento la tarjeta te deje tirado, ya que las Micro SD no están en absoluto preparadas para una carga de trabajo intensa, sobre todo las de bajo precio. Seguramente eso es lo que te ha pasado a ti.

Pero dependiendo del uso que le demos a la Raspberry todos estos problemas pueden tener una solución sencilla, que no es otra que hacer que la Raspberry pueda arrancar desde un disco duro normal y corriente conectado a uno de sus puertos USB, y en este artículo vamos a explicar cómo conseguirlo.

1) Elección del tipo de disco.

Antes de empezar deberemos saber qué tipo de disco vamos a usar para poder arrancar nuestra Raspberry. ¿Usaremos un disco tradicional, un pen drive o un SSD?

¿Pero qué dices? ¿Un SSD conectado a un puerto USB? Si se trata de una Raspberry Pi 3B+ o inferior y le conectas un USB 2.0 vas a desaprovechar la velocidad del SSD por completo. Un SSD es un dispositivo que permite hacer transferencias de datos enormemente rápido y un puerto USB 2.0 es un cuello de botella enorme para un SSD. Es una locura. 

Ten en cuenta que estoy planteando las dos opciones desde mi experiencia. Arrancar desde un disco duro tradicional es una buena opción y hará que tu Raspberry incluso vaya un poco más rápido comparado a cuando arrancaba desde la tarjeta Micro SD. Sin embargo un día se me dio por intentar arrancar una raspberry desde un disco SSD que puse en una sencilla caja para discos de 2,5 pulgadas… y el aumento de velocidad que conseguí fue muy destacable. Y de hecho si quieres puedes comprobarlo haciendo algo tan sencillo como recargar esta página web. ¿No te parece que carga anormalmente rápido como para estar alojada en una mísera Raspberry Pi 3b+? Pues es porque el sistema operativo, sus programas y el contenido de esta web arranca desde la unidad SSD que tengo conectada en la raspberry que hospeda mi blog (además de una buena optimización del servidor y la propia web, por supuesto).

Pues tiene razón. ¿Entonces debería optar por un SSD como medio de arranque?

No siempre. Sólo deberías optar por un SSD si lo que buscas es velocidad. Este humilde blog ocupa muy poco, al igual que el resto de cosas que tengo albergadas en mi Raspberry. Si lo que buscas es capacidad y no te importa la velocidad, entonces deberías optar por un disco duro tradicional. Un pen drive también te podría dar una buena velocidad y un poco más de seguridad que arrancar desde la Micro SD de la raspberry, aunque no le doy encontrado «la gracia». Veo mucho más útil arrancar desde alguno de los otros dos medios.

Venga, vale. Vete al grano anda, que te dispersas. 

Vale, venga. Vamos allá.

2) Primer método. Programar la raspberry para que arranque desde una unidad USB.

Antes de explicaros nada voy a tener un arranque de sinceridad con vosotros. Este método la mayoría de las veces no funciona.

¿Pero qué...? Pues sí que eres sincero, la verdad. 

Para que entiendas por qué he escrito eso, primero te diré lo que vamos a hacer en este punto. Vamos a hacer una pequeña y simple programación en la circuitería de la raspberry (que nadie se asuste. Sólo es una línea de terminal) que le dirá a la raspberry que el dispositivo que debe arrancar es una unidad de USB, y si no la encuentra entonces debe arrancar la tarjeta micro SD. O sea, que si no funciona no pasaría absolutamente nada y no habrías estropeado nada en tu dispositivo.

Así que vamos a acceder al terminal de nuestra Raspberry y teclear los siguientes comandos.

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

¿Qué es lo que hace este código? Pues la primera línea simplemente se mete dentro del archivo «config.txt» que está en la partición «boot» y escribe una línea a mayores que pone «echo program_usb_boot_mode=1». La segunda línea reinicia la raspberry. Al reiniciar, el dispositivo se encontrará con la orden de que en los siguientes arranques la raspberry debe intentar iniciar primero el dispositivo USB y si no es capaz de iniciar desde él entonces debe arrancar desde la tarjeta MicroSD.

Una vez que se ha reiniciado la raspberry, si queremos podemos editar manualmente el archivo «config.txt» (con el comando «sudo nano /boot/config.txt») y borrar la línea que hemos añadido, ya que la orden de arrancar desde un usb quedará grabada en la circuitería de nuestra raspberry. De hecho podemos comprobar si efectivamente este comando ha hecho el efecto deseado tecleando la siguiente orden en el terminal.

vcgencmd otp_dump | grep 17:

Si todo va bien, el resultado que nos debe dar es «17:3020000a», y eso significará que ya podemos arrancar la raspberry desde nuestra unidad USB sin necesidad de insertar ninguna tarjeta SD.

Simplemente tendríamos que grabar la imagen del sistema operativo de la raspberry en un pen drive en lugar de en la tarjeta de memoria, insertar esa unidad USB en la raspberry y encenderla sin ninguna tarjeta de memoria insertada. Debería arrancarnos el sistema operativo sin problema.

¿Entonces por qué digo que este método la mayor parte de las veces no funciona? Pues porque esto sólo va a funcionar para algunas marcas y modelos específicos de unidades de almacenamiento USB. Ninguna de las unidades USB que tengo en casa han sido capaces de arrancar con este método y hasta dónde yo sé sólo se puede arrancar con este método desde un pen drive, nunca desde un disco duro. Si necesitáis arrancar desde un pen drive y ese pen drive es uno de los afortunados que permite arrancar la raspberry, entonces este método es una opción valida. Si no, os tocará realizar el punto 3 del tutorial.

3) Segundo método. Arranque con una tarjeta SD que contiene sólo la partición «/boot».

Este método sí que funciona el 100% de las veces, con independencia de la marca o modelo de la unidad USB que vayáis a usar. Os explico primero lo que vamos a hacer.

  1. En la tarjeta SD sólo necesitamos tener la partición «/boot». En condiciones normales la raspberry sólo va a usar el contenido de esa partición para iniciar el sistema (sólo habrá una pequeña lectura muy breve durante el arranque) y además esta partición va a ocupar muy muy poco espacio en la tarjeta MicroSD, por lo que podemos usar cualquier tarjeta antigua para esta partición.
  2. En el disco duro (o pen drive) almacenaremos la partición «/», que contiene… todo lo que no va en «/boot». Aquí va todo el sistema operativo y los archivos que necesitéis.

Para ilustrarlo de modo más gráfico, esto es lo que me ocupan ambas particiones en la raspberry que alberga esta web.

Si os fijáis, la partición «/boot» sólo ocupa 40 megas (de los cuales tiene sólo 20 ocupados). Eso me permite tenerla en una tarjeta de memoria de un giga o menos de capacidad (sí… seguro que tenéis alguna de un teléfono viejo tirada en un cajón). Y si se estropea… pues que se estropee. Simplemente tengo que asegurarme de tener un backup de esa pequeña tarjeta por si algún día deja de funcionar para poder restaurar el contenido en otra tarjeta pequeña, pero no sería algo normal, dado que el uso que le daremos es ínfimo. En el momento de escribir este blog llevo aproximadamente dos años usando este método y aún no me falló la tarjeta SD (y doy fe que la que uso tiene muchos años y es de lo más cutre que existe). Y cuando falle… pues restauro su backup en otra y listo (tengo unas cuantas de ese tamaño por aquí zapateadas).

Así que al lío. Vamos a suponer que tenéis una raspberry ya funcionando con su tarjeta MicroSD insertada y que también tenéis ya pinchada en la raspberry una unidad de disco duro (o un pen drive) en el que queréis tener el sistema operativo. Lo que haremos es copiar todo el contenido del sistema operativo (excepto «/boot») en la unidad USB y obligar a que la raspberry trabaje sobre esa unidad en lugar de sobre la SD. Cuando terminemos, la raspberry sólo usará la SD para leer el contenido de «/boot» y para el resto de tareas usará nuestra unidad de disco duro.

Lo primero que debemos hacer es formatear la unidad de disco duro correctamente para que el sistema operativo pueda operar desde ahí. Pero primero vamos a ver cómo se llama la unidad que tenemos conectada. Para ello escribimos el siguiente comando en el terminal de la raspberry.

ls /dev/sda*

El comando nos dice que existe la unidad sda (que será nuestra unidad USB) y que en esa unidad hay una partición (sda1). Posiblemente, si hemos usado ese disco para otras cosas, esa partición esté en formato «fat32» o «NTFS», así que vamos a formatear la partición sda1 en «ext4», que es el formato que usa linux de forma nativa. Lo haremos con el siguiente comando:

sudo mkfs.ext4 /dev/sda1 -L unidadusb

Listo. Ya tenemos la unidad formateada. Vamos a comprobar si todo va bien con este comando.

sudo fdisk -l

Y si es así, debería salirnos algo similar a esto.

En este ejemplo podemos ver cómo tenemos una unidad SD metida en la raspberry (llamada mmcblk0) con dos particiones (mmcblk0p1, de 40 megas y formateada en fat32 y mmcblk0p2 de 1’8 gigas y formateada en el sistema de archivos de linux). Esto me concuerda, puesto que la tarjeta que estoy usando para el tutorial y desde la que estoy iniciando la raspberry es de sólo dos gigas.

También más abajo vemos que tenemos una unidad usb insertada (sda) que tiene una única partición (sda1) formateada también en el sistema de archivos de linux. En la captura veo que es de 15 Gb y es correcto, ya que para el ejemplo voy a instalar el sistema en un pen drive de 16 GB (aunque podría estar usando un disco de varios Terabytes sin ningún problema).

Ahora vamos a montar las dos unidades para poder realizar la copia de los archivos de una a la otra. Primero haremos accesible la unidad usb (recuerda que es la partición sda1) en la ruta «/mnt/usb» con los siguientes comandos.

cd /mnt
sudo mkdir usb
sudo mount /dev/sda1 /mnt/usb

Ahora haremos accesible el contenido de la tarjeta MicroSD (la partición «/» en la ruta «/mnt/tarjeta».

sudo mkdir tarjeta
sudo mount /dev/mmcblk0p2 /mnt/tarjeta

Llega el momento de la verdad: hay que copiar el contenido de la tarjeta en la unidad USB. Para ello primero debemos darnos permiso de administrador y luego ejecutar el comando para realizar la copia. Y si alguien se lo pregunta, no se puede hacer esto en una única línea usando el comando «sudo». Hay que hacerlo tal cual lo pongo aquí.

cd tarjeta
sudo su
time tar -S -cf - . |tar -C /mnt/usb -xf -

Esto tardará un rato (porque tiene que copiar muchos datos), pero en cuanto termine debería mostrarse algo similar a esto.

Vale. Ya tenemos la tarjeta copiada en el usb. Ahora debemos dar las órdenes para que arranque correctamente, y para ello debemos editar dos archivos (uno está en /etc/fstab en la unidad usb y el otro está en /boot/cmdline.txt en la tarjeta de memoria). Empecemos por el primero. Tecleamos los siguientes comandos.

cd /mnt/usb/etc
sudo nano fstab

Vamos a ver en el archivo algo similar a esto.

Si nos fijamos, las dos líneas que empiezan por «PARTUUID» son las líneas que indican las particiones que usa la raspberry (la partición «/boot» y la «/». Lo que debemos de hacer es sustituir la identificiación de la partición «/» (en este caso sería PARTUUID=2bfb83f5-02) por la ruta de la partición en la unidad usb (/dev/sda1), de forma que el archivo quedaría de la siguiente forma.

(Nota: no me gusta eliminar líneas así que he copiado la línea que quiero editar y la he comentado poniéndole una «#» al principio. De esta forma tengo un registro de lo que había antes de hacer cambios)

Una vez editado el archivo, guardamos cambios pulsando control+o y salimos del editor con control+x.

Ahora debemos editar el otro archivo. Nos vamos a la partición /boot de la tarjeta SD y editamos el archivo cmdline.txt tecleando lo siguiente.

cd /boot
sudo nano cmdline.txt

El archivo sólo tiene una línea similar a ésta.

Lo que nos interesa es lo que hay después de «root=». Ahí se indica la partición que debe arrancar la raspberry. Debemos borrar lo que hay en ese fragmento y poner la ruta de la unidad usb, que en nuestro caso es /dev/sda1, de tal forma que quedará algo similar a esto.

Guardamos cambios pulsando control+o y salimos de nano pulsando control+x.

Por último reiniciamos nuestra raspberry tecleando el comando

 sudo shutdown -r now

Y listo. Ahora la raspberry estará iniciándose siempre desde la unidad USB, con la garantía de que este método no nos fallará en el futuro aunque le deis caña a la raspberry. Ya veis que yo tengo la mitad del disco de 500 gigas ocupado y además sigo una política de actualizaciones muy estricta. Si este método tuviera algún problema ya debería haber surgido en algún momento y por el momento todo sigue vivo (toco madera).

Share

11 comentarios

  1. Olegario

    Hola,
    he seguido el tutorial paso por paso y me da un problema, el sistema arranca desde el disco usb pero como sólo lectura, incluso como root.

    • Marcos

      Hola.
      La verdad es que es un problema muy extraño. ¿Estás seguro que en el FStab sólo has cambiado la identificación de la partición «/»? Porque me da que el problema va a estar en ese archivo, que es el que le dice al sistema dónde están las particiones y cómo tiene que montarlas. Revísalo y compáralo con el que tienes en la tarjeta SD, que me da que estás creando la partición y copiando los datos de forma correcta, pero que estás montando el disco en sólo lectura.

      • Olegario

        Hola, ya está solucionado, el problema estaba en que no me funcionaba porque al poner en /etc/fstab y en /boot/cmdline.txt la ruta de la partición, (/dev/sda1) no funcionaba, en su lugar tengo que poner el PARTUUID.
        Al quemar la img en la tarjeta y en el SSD cogen el mismo PARTUUID, (6c586e13) y tambien en «disk identifier» (0x6c586e13), y eso produce que se vuelva loco el sistema, pero hay una manera de cambiarlo por otro número hexadecimal, ¿cómo se hace?
        ejecutamos fdisk,
        # fdisk /dev/sda
        Command (m for help): p
        «te muestra la info de las particiones y del disk identifier»
        Command (m for help): x
        Expert command (m for help): i
        Enter the new disk identifier: 0xd34db33f
        Disk identifier changed from 0x6c586e13 to 0xd34db33f.
        Expert command (m for help): r
        Guardamos
        Command (m for help): w
        The partition table has been altered.
        Syncing disks.

        Verificar usando blkid

        Y terminar siguiendo su tutorial que está genial, aunque yo he realizado otro método, muchísimas gracias haces un gran trabajo.

  2. Fabián

    Hola !
    debemos alimentar el disco externo si se trata de un SSD ?
    Muchas Gracias y felicidades por el aporte !

    • Marcos

      Pues no necesariamente. De hecho yo tengo el mío sin alimentar. Al principio lo alimentaba, pero le puse a la raspbery un alimentador de 3 amperios y listo. Yo lo tengo con un SSD y una caja cutre-salchichera. Cuando cambie la raspberry por una pi 4 he de mirar una caja USB3 que me proporcione algo más de velocidad, pero por lo de ahora con la USB2 que tengo va que chuta.

  3. Antonio

    Hola Marcos, gracias por tan detallada explicación, pero me gustaría saber si las órdenes que se implementan en el terminal son idénticas si, en lugar de usar Raspbian, se usa Manjaro en la Raspberry 4, como es mi caso.
    ¿Se sigue al pie de la letra o hay que cambiar alguna parte de las mismas?
    Ya sabes, sudo, syu, pacman o similar.
    Muchas gracias por tu ayuda.

  4. Javier

    Hola,
    antes de meterme de lleno. ¿Esto funciona también para una raspberry Pi 2b? (el método de la partición Boot en la SDCARD y el resto en el disco duro)
    Lo comento porque he leído que la Pi 2, no puede botar desde USB….

    Gracias y un saludo

    • Marcos

      Efectivamente. Sí que funciona este método con la 2b. ¿Por qué? Pues porque el boot inicial sigue haciéndose desde la tarjeta SD. La raspberry primero lee el boot en la SD y luego lo que hace es cargar el resto del sistema desde la unidad que está en el puerto usb. Así que sólo vas a necesitar una tarjeta SD minúscula para arrancar y el resto inicia sobre usb. Para que tengas un ejemplo: este blog está alojado en una raspberry (Sí… la página que estás viendo te la acaba de generar una raspberry que está en mi escritorio). La partición boot está en una tarjeta SD de 1 giga (porque no tengo ninguna más pequeña), pero realmente la partición ocupa ¡¡50 megas!!. De los que realmente uso 23. El resto del sistema (sistema operativo, programas, todo el blog, etc…) está en una unidad USB de 500 GB. Puedes ver todo aquí

      https://www.flopy.es/monitor/status.html

      Así que efectivamente, vas a poder usar la unidad USB para el sistema operativo y programas, pero seguirás necesitando una pequeña SD para almacenar una pequeñísima partición «boot».

      • Javier

        Muchas gracias por responder tan rápido Marcos.

        Saludos!!

      • Javier

        Hola Marcos,
        me fue genial tu tutorial, a la primera, muchas gracias!

        Una consulta: Yo tengo la raspberry 2B, mi idea es ponerle un disco SSD para el sistema operativo donde tengo docker y demás… (ahora uso PiDrive de WD), no va mal pero mejorable…
        Mi idea es conectar el SSD al USB2 (no tengo USB3), pero no se si notaré la diferencia. (por el límite de velocidad del USB2).

        Tú tienes el SSD bajo un USB3 o USB2?

        Muchas gracias por compartir tus experiencias!

  5. Jesús

    Hola!
    Hace poco que tengo una Raspberry 4B y me viene con raspbian en la SD.
    Tengo varios discos duros por casa de 2.5 sin uso con una caja USB y querría probar lo siguiente:
    Quemar desde el PC imagenes de sistemas operativos para Raspberry en los diferentes discos duros. Por ejemplo Ubuntu o Batocera.
    Si hago eso, me servirá este tutorial? Porque entiendo que más que decirle que arranque por USB le estás diciendo que arranque con una unidad en concreto, me equivoco? Debería añadir más líneas a los ficheros?
    Y si no le conecto ninguna unidad al usb, arrancará desde la SD?
    Gracias!

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

© 2020 Flopy.es

Tema por Anders NorenArriba ↑

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies