Intro

 

Un par de tarjetas microSD (o tres) que no pueden arrancar después de unos meses de uso en la Raspberry Pi nos hacen pensar que hay algo que no funciona.

Después de leer en Google todo lo que encontré sobre el tema, parece que la solución pasa por dos cosas principalmente:

  • Usar una buena fuente de alimentación
  • Evitar en lo posible la escritura en la tarjeta microSD

 

Lo de la fuente es «fácil». Basta con comprar una de las buenas. Las recomendadas para la Raspberry Pi 3 son de 2,5A y se supone que si la compras de la propia Raspberry son de confianza.

Respecto a evitar la escritura en la tarjeta microSD, parece que lo que puede ocasionar más uso es la escritura de la memoria swap y los logs del sistema. Por tanto, lo ideal es emplear para éstos particiones fuera de la tarjeta microSD.

 

Swap

El sistema que utiliza raspbian para la swap es ingenioso. La monta como un archivo dentro del directorio /var una vez se inicia. El responsable de hacerlo es el script /etc/dphys-swapfile (1)

Los valores importantes en este script son los siguientes:
CONF_SWAPSIZE
CONF_SWAPFILE

El primero le indica al sistema el tamaño (en MB) del archivo generado para albergar la memoria swap y el segundo, donde la debe guardar. Por defecto, el primero está en 100 y el segundo en /var/swap

Si queremos localizar la swap en otro sitio hemos de hacer lo siguiente (2):

  1. Crear la partición o el archivo que la albergará. Nosotros nos inclinamos por una partición de 5GB en un disco duro externo (ej. /dev/sda1).
  2. Configurar la swap en la nueva partición y activarla:
    # mkswap /dev/sda1
    # swapon /dev/sda1
  3. Desactivar el sistema de dphys-swapfile que lleva raspbian por defecto:
    # dphys-swapfile swapoff
    # dphys-swapfile uninstall
  4. Montar la swap al inicio con fstab.  Para ello me gusta más emplear el sistema de UUID de las particiones que el nombre de las mismas, ya que si añadimos o quitamos dispositivos USB de la raspberry pueden verse alterados los nombres de las unidades. Añadiremos la siguiente línea al archivo /etc/fstab:
    UUID=639042a8-7668-435f-9934-a17453cba769 none swap sw 0 0
  5. Comprobamos que todo está bien con el siguiente comando:
    $ swapon -s
    Filename Type Size Used Priority
    /dev/sda2 partition 4194300 0 -1
    /var/swap file 909308 0 -2

El sistema ha colocado la nueva partición como swap con una prioridad de -1 y luego la generada por el script dphys-swapfile en segundo lugar.

 

/var

Para mover el directorio de logs a una nueva localización deberíamos mover el directorio /var/log, pero preferimos montar todo el directorio /var en la nueva localización. Ésta será la partición 2 del disco USB /dev/sda:

  1. Creamos el sistema de archivos ext4 en la partición:
    # mkfs.ext4 /dev/sda2
  2. Montamos la partición en /mnt:
    # mkdir /mnt/var
    # mount /dev/sda2 /mnt/var
  3. Pasamos a modo single-user para que no haya escritura ni lectura en /var durante el proceso:
    # init 1
  4. Copiamos el contenido del directorio /var en /mnt/var (sin copiar el propio directorio):
    # cd /var
    # cp -ax * /mnt/var
  5. Renombramos el directorio /var una vez copiado su contenido:
    # cd /
    # mv var var.old
  6. Creamos el nuevo directorio /var:
    # mkdir /var
  7. Desmontamos el directorio /mnt/var:
    # umount /mnt/var
  8. Montamos el nuevo directorio /var:
    # mount /dev/sda2 /var
  9. Creamos la entrada correspondiente en /etc/fstab:
    UUID=296d8493-de44-4149-b41b-71d88ee84baa /var ext4 defaults 0 0
  10. Reiniciamos el sistema:
    # systemctl reboot

 

Ya está todo.

Bibliografía

  1. Adding swap to the Raspberry Pi. de raspberrypimaker.com
  2. Adding an external harddrive to a Raspberry Pi. de Dogsbodytechnology.com