motivación
Aparentemente, las tarjetas SD no están orientadas a el uso masivo de operaciones de entrada / salida y, al menos en mi caso, cada cierto tiempo empiezan a producirse errores que corrompen la información almacenada. Cansado de estos problemas he empezado a realizar cambios en la configuración de almacenamiento de las Raspberry Pi.
En una instalación al uso de Raspberry Pi, se configuran dos particiones en la tarjeta SD. La primera, en formato FAT almacena los archivos necesarios para el arranque y en una segunda partición se encuentra el sistema propiamente dicho.
A continuación se puede observar la salida de un fdisk de una tarjeta instalada con Raspbian.
# fdisk -l /dev/mmcblk0 Disk /dev/mmcblk0: 3,8 GiB, 4012900352 bytes, 7837696 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x6f92008e Device Boot Start End Sectors Size Id Type /dev/mmcblk0p1 8192 131071 122880 60M c W95 FAT32 (LBA) /dev/mmcblk0p2 131072 7837695 7706624 3,7G 83 Linux
# df -h S.ficheros Tamaño Usados Disp Uso% Montado en /dev/root 3,6G 1,4G 2,1G 40% / ... /dev/mmcblk0p1 60M 21M 40M 35% /boot
No es posible prescindir de la tarjeta SD ya que es necesaria en el proceso de arranque, en concreto de la primera partición montada en /boot. Sí que se puede instalar el sistema en una memoria flash o en un disco extraíble USB, en lugar de la segunda partición de la SD.
preparación del nuevo destino
Primero es necesario preparar el nuevo destino del sistema. Por ejemplo, una memoria usb de 16 Gb. Primero con fdisk limpiamos la tabla de particiones y creamos una partición nueva del tipo linux.
# fdisk /dev/sda Command (m for help): d Selected partition 1 Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p Partition number (1-4, default 1): 1 First sector (2048-15669247, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-15669247, default 15669247): Using default value 15669247 Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Ahora es necesario crear el sistema de archivos y montarlo.
# mke2fs -t ext4 -L rootfs /dev/sda1
# mount /dev/sda1 /mnt
cambio del sistema raíz desde la tarjeta SD a una memoria flash
Ahora es el momento del copiado de información. Yo prefiero usar rsync, aunque se podría hacer con otros mecanismos más a bajo nivel como dd.
# rsync -aAXv --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /* /mnt
Usando el conjunto de opciones -aAX, los ficheros son transferidos en modo archivo, asegurándose que los enlaces simbólicos, dispositivos, permisos y atributos de propiedad,tiempos de modificación, ACLs y atributos extendidos son preservados.
La opción –exclude hará que aquellos ficheros que coincidan con los patrones dados sean excluidos. Los contenidos de /dev, /proc, /sys, /tmp y /run se excluyen porque son inicializados al cargar el sistema, /lost+found es específico del sistema de archivos.
Es necesario tener paciencia ya que dependiendo del sistema copiado puede tardar bastante el traspaso de información.
modificaciones en el arranque
Al haber cambio el dispositivo donde se encuentra el sistema, es necesario indicarselo al proceso de arranque de la Raspberry Pi. Para ello, basta con modificar un archivo almacenado en la partición boot de la tarjeta SD.
# vi /boot/cmdline.txt dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline rootwait rootdelay=5
Se ha modificado el parámetro root=/dev/sda1 para que apunte al nuevo destino y se ha añadido una opción rootdelay=5 para asegurarnos que el dispositivo USB está listo. Es posible que otras instalaciones cambien los valores.
También es necesario modificar el archivo /etc/fstab para que contenta el destino de la partición root correctamente.
# vi /mnt/etc/fstab añade: /dev/sda1 / ext4 defaults,noatime 0 1 y comenta: #/dev/mmcblk0p2 / ext4 defaults,noatime 0 1
conclusiones
Ahora ya tenemos el sistema en un dispositivo USB con lo que el almacenamiento será más robusto. Con el cambio además de los comentado también se incrementa la velocidad, ya que el acceso de lectura / escritura a las tarjetas SD es muy lento en comparación con los USB.