Bootear Raspberry Pi desde volumen LVM en disco externo
Usualmente el Sistema Operativo del Raspberry Pi se ejecuta desde la tarjeta microSD (o SD en el Rpi1), pero dependiendo de la SD y con el paso del tiempo se puede ir dañando la información haciendo necesario tener que reinstalar el SO regularmente. Esto se puede evitar usando la SD sólo para el bootloader y el SO dejarlo en una partición en un pendrive o disco externo.
Estos pasos los realicé desde un Raspberry Pi booteado desde la SD.
- Crear partición LVM e inicializar con pvcreate/vgcreate (omitir si ya existe)
- Crear volumen LVM con
lvcreate -n <nombre vol> -L 10G <nombre vg>
- En la página donde obtuve la información hicieron una copia del root actual a la nueva partición, yo en lugar de eso copie la imagen del sistema raspbian original al nuevo volumen (no la imagen original, ya que incluye la partición de boot, tuve que dividirla primero)
dd if=system.img of=/dev/<nombre vg>/<nombre lv> bs=1M
- Ajustar partición para que ocupe todo el tamaño del LV
e2fsck -f /dev/<nombre vg>/<nombre lv>
resize2fs /dev/<nombre vg>/<nombre lv>
- Ahora hay que hacer chroot en el sistema nuevo para ajustar el fstab e instalar el initramfs y lvm. La línea touch ssh es opcional, es para que en el sistema nuevo se active el servicio SSH por defecto si estás haciendo estos pasos por SSH.
mkdir /mnt/root
mount /dev/<nombre vg>/<nombre lv> /mnt/root
mount -t proc /proc /mnt/root/proc
mount -o bind /dev /mnt/root/dev
mount -o bind /dev/pts /mnt/root/dev/pts
mount -t sysfs /sys /mnt/root/sys
mount -o bind /boot /mnt/root/boot
touch /mnt/root/boot/ssh
chroot /mnt/root
- Luego
nano /etc/fstab
Cambiar /dev/mmcblk0p2 por /dev/mapper/<nombre vg>-<nombre lv>
-
Instalar LVM y generar el initramfs
apt-get update
apt-get install lvm2
mkinitramfs -o /boot/initramfs.gz
-
Editar el archivo /boot/config.txt y agregar al final
initramfs initramfs.gz 0xa00f00000
-
Editar el archivo /boot/cmdline.txt y reemplazar root=/dev/mmcblk0p2 por la ruta del LVM nuevo (/dev/<nombre vg>/<nombre lv>)
-
Salir del chroot (exit) y reiniciar (reboot)
-
Si todo ha funcionado debería iniciar el SO y poder acceder a él, lo puedes confirmar corriendo el comando mount y viendo que / está montado desde LVM (mi VG se llama storage y el LV se llama root)
/dev/mapper/storage-root on / type ext4 (rw,noatime,data=ordered)
Posibles problemas
-
Al iniciar aparece un error asociado a que no puede encontrar el volumen root /dev/mapper/xxxxx
Ese problema lo tuve y se debía a que en el sistema nuevo no tenía instalado LVM por lo que en el archivo initramfs no tiene soporte del mismo, se debe instalar LVM, regenerar el initramfs y copiarlo en /boot/, puedes confirmar si el initramfs tiene soporte LVM corriendo ese comando, debe retornar los siguientes resultados
# lsinitramfs initramfs.gz | grep lvm
scripts/local-block/lvm2
scripts/local-top/lvm2
lib/udev/rules.d/56-lvm.rules
etc/lvm
etc/lvm/lvm.conf
sbin/lvm
-
Los cambios hechos en los archivos de la carpeta /boot/ no persisten y al reiniciar se vuelve a iniciar el sistema de la SD
Estos pasos los estuve haciendo en un Rpi remotamente y al reiniciar se perdían los cambios, lo mismo si desmontaba la partición /boot, esto se debe a que la SD está corrupta y no guarda los cambios. Se debe extraer la SD y reformatearla en un computador.
Fuente original: https://raspberrypi.stackexchange.com/a/23555
Comentarios recientes