Si btrfs se compila como un módulo de kernel, entonces debe crear un initramfs para cargar el módulo en el arranque. En Raspian (y otros derivados de Debian), update-initramfs
es el método más fácil para hacer esto.
Si initramfs-tools
está instalado, cada vez que apt-get
instale un nuevo núcleo, debería activarse update-initramfs
automáticamente.
sudo apt-get update
sudo apt-get install initramfs-tools
Sin embargo, si utiliza rpi-update
para instalar un nuevo núcleo, deberá ejecutarlo update-initramfs
manualmente antes de reiniciar en el nuevo núcleo:
sudo update-initramfs -u -k <kernel-version>
Esto creará o actualizará initramfs en /boot/initrd.img-<kernel-version>
.
El último paso es agregarlo a su configuración de arranque: agregue la siguiente línea a /boot/config.txt
:
initramfs initrd.img-<kernel-version> followkernel
initrd-<kernel-version>
debe coincidir exactamente con el nombre del archivo en /boot
.
Tendrá que repetir estos pasos cada vez que corra rpi-update
.
Para que encuentre mi partición raíz BTRFS externa, necesitaba especificar explícitamente el UUID de la partición raíz en la partición de arranque
cmdline.txt
. Por ejemplo:Puede determinar el UUID de la partición BTRFS usando
lsblk -f
.fuente
El núcleo de Raspbian no incluye soporte
btrfs
por defecto; las etapas iniciales de arranque se ejecutan normalmente, pero cuando se carga el kernel, no verá ningún sistema de archivos que pueda montar, y entra en pánico. Existe una solución: agregue btrfs como un módulo del núcleo, en initramfs. En gran parte gracias a tres artículos diferentes , lo he configurado así:sudo apt install btrfs-tools initramfs-tools
echo 'btrfs' | sudo tee -a /etc/initramfs-tools/modules
sudo mkdir -p /etc/initramfs-tools/hooks ; sudo mkdir -p /etc/initramfs-tools/scripts/local-premount ; sudo cp /usr/share/initramfs-tools/hooks/btrfs /etc/initramfs-tools/hooks ; sudo cp /usr/share/initramfs-tools/scripts/local-premount/btrfs /etc/initramfs-tools/scripts/local-premount; sudo chmod +x /etc/initramfs-tools/hooks/btrfs /etc/initramfs-tools/scripts/local-premount/btrfs
-c
) los nuevos initramfs para la versión actual del kernel (uname -r): si está actualizando uno existente, deberá usar update (-u
) en su lugar. Esto creará un archivo llamado como /boot/initrd.img-*, donde * es la versión actual del kernel. Tenga en cuenta el nombre generado (el script lo generará), lo usaremos en el siguiente paso.update-initramfs -c -k $(uname -r)
/boot/config.txt
para usar este initramfs, agregandoinitramfs initrd.img-3.11.0+ followkernel
El nombre del archivo no tiene ruta, es el generado en el paso anterior; "followkernel" controla la ubicación en la memoria ( documentación de config.txt ).Eso resuelve el núcleo actual, pero como señaló @Ingo, actualizar el núcleo rompería el sistema. Para solucionar esto, utilicé sus scripts de enlace de instalación de kernel :
INITRD=Yes
/etc/kernel/postinst.d/initramfs-tools
chmod +x
seEn este punto, tenemos un sistema que podría usar btrfs como dispositivo raíz. Pruebe reiniciando: el sistema aún se iniciará desde la partición ext4 (o lo que esté en su /boot/cmdline.txt ), pero
dmesg | grep -i btrfs
ahora debería mostrar una línea que contiene "Btrfs cargado". Ahora necesitamos hacer y usar una partición btrfs.Haga una copia de seguridad de la
/
partición (ext4), suponiendo que sea / dev / mmcblk0p2, normalmente: apague el RPi, saque la tarjeta SD, móntela en otro lugar (en este ejemplosudo mount /dev/mmcblk0p2 /mnt
en una computadora Linux) y archive el contenido; tenga en cuenta que debe usar una herramienta que conserve la propiedad y los permisos, por ejemplo, tar:cd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *
(y luego desmonte la tarjeta SD nuevamente)mkfs.btrfs /dev/mmcblk0p2
sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
sudo nano /mnt/etc/fstab
Debería haber una fila similar a esta:
Cámbielo a esto (el nuevo tipo de FS es btrfs y usa las opciones predeterminadas):
sudo umount /mnt
Encuentre el UUID de su nueva partición btrfs: busque la línea con / dev / mmcblk0p2 y copie la parte UUID =, con el (¡no UUID_SUB, no PARTUUID! Eso provocaría un error en el gestor de arranque, y el núcleo no arrancaría) .):
sudo blkid
/ dev / mmcblk0p2: UUID = "cafebeef-0000-1234-aaaa-12346589" UUID_SUB = "ababccdd-2345-cafe-beee-587989991110" TYPE = "btrfs" PARTUUID = "beef0bee-02"
Monte la partición de arranque (FAT32):
sudo mount /dev/mmcblk0p1 /mnt
sudo nano /mnt/cmdline.txt
Encuentra estos dos parámetros
Y reemplazar con
Tenga en cuenta que el UUID es el que copiamos anteriormente, solo sin comillas.
sudo umount /mnt
En el RPi, vea que realmente está ejecutando desde un montaje raíz btrfs:
mount
/ dev / mmcblk0p2 en / type btrfs (rw, space_cache, subvol = /)
Et voilà! No es solo apuntar y hacer clic, pero al estar de pie sobre los hombros de gigantes, podría hacer que funcione. ( También convirtió esto en un repositorio ).
fuente
sudo apt upgrade
si también actualiza el núcleo, esta configuración fallará dramáticamente en el arranque porque el nuevo núcleo intenta cargar los viejos initramfs que fallarán y el núcleo no puede cargar los controladores btrfs. Y no es una manera fácil de arreglarlo, al menos con unchroot
sistema armhf.apt upgrade
está haciendo y generar un initramfs a mano si es necesario, antes de iniciar el nuevo kernel. No es una tarea factible para un principiante porque fallar es dramático. Puede echar un vistazo a ¿Cómo puedo usar un disco de inicio (initramfs) en el arranque de Raspberry Pi?4.14.98+
y4.14.98-v7+
. Si update-initramfs es activado por una actualización del núcleo, generará dos initrd.img *, uno para cada modelo. Esto no cabe en la/boot
partición (error - sin espacio) y la generación no termina.MODULES=list
.