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-initramfses el método más fácil para hacer esto.
Si initramfs-toolsestá instalado, cada vez que apt-getinstale un nuevo núcleo, debería activarse update-initramfsautomáticamente.
sudo apt-get update
sudo apt-get install initramfs-tools
Sin embargo, si utiliza rpi-updatepara instalar un nuevo núcleo, deberá ejecutarlo update-initramfsmanualmente 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
btrfspor 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-toolsecho 'btrfs' | sudo tee -a /etc/initramfs-tools/modulessudo 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.txtpara usar este initramfs, agregandoinitramfs initrd.img-3.11.0+ followkernelEl 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-toolschmod +xseEn 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 btrfsahora 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 /mnten 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/mmcblk0p2sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgzsudo nano /mnt/etc/fstabDeberí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 /mntEncuentre 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 /mntsudo nano /mnt/cmdline.txtEncuentra estos dos parámetros
Y reemplazar con
Tenga en cuenta que el UUID es el que copiamos anteriormente, solo sin comillas.
sudo umount /mntEn 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 upgradesi 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 unchrootsistema armhf.apt upgradeestá 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/bootpartición (error - sin espacio) y la generación no termina.MODULES=list.