Wenn btrfs als Kernelmodul kompiliert wird, müssen Sie ein initramfs erstellen, um das Modul beim Booten zu laden. Bei Raspian (und anderen Debian-Derivaten) update-initramfs
ist dies die einfachste Methode.
Wenn initramfs-tools
installiert, sollte jedes Mal, wenn apt-get
ein neuer Kernel installiert wird, dieser update-initramfs
automatisch ausgelöst werden.
sudo apt-get update
sudo apt-get install initramfs-tools
Wenn Sie rpi-update
jedoch einen neuen Kernel installieren, müssen Sie ihn update-initramfs
manuell ausführen, bevor Sie den neuen Kernel neu starten :
sudo update-initramfs -u -k <kernel-version>
Dadurch werden die initramfs in erstellt oder aktualisiert /boot/initrd.img-<kernel-version>
.
Der letzte Schritt besteht darin, es Ihrer Boot-Konfiguration hinzuzufügen: Fügen Sie die folgende Zeile hinzu /boot/config.txt
:
initramfs initrd.img-<kernel-version> followkernel
initrd-<kernel-version>
muss genau mit dem Namen der Datei in übereinstimmen /boot
.
Sie müssen diese Schritte jedes Mal wiederholen, wenn Sie ausgeführt werden rpi-update
.
Um meine externe BTRFS-Root-Partition zu finden, musste ich die UUID der Root-Partition in der Boot-Partition explizit angeben
cmdline.txt
. Beispielsweise:Sie können die UUID der BTRFS-Partition mithilfe von bestimmen
lsblk -f
.quelle
Der Raspbian-Kernel bietet
btrfs
standardmäßig keine Unterstützung . Die ersten Startphasen werden normal ausgeführt, aber wenn der Kernel geladen wird, wird kein Dateisystem angezeigt, das gemountet werden könnte - und es kommt zu Panik. Es gibt eine Lösung: Fügen Sie btrfs als Kernelmodul in initramfs hinzu. Vor allem dank drei verschiedener Artikel habe ich es so eingerichtet: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
) die neuen initramfs für die aktuelle Kernelversion (uname -r) - Wenn Sie eine vorhandene aktualisieren, müssen Sie-u
stattdessen update ( ) verwenden. Dadurch wird eine Datei mit dem Namen /boot/initrd.img-* erstellt, wobei * die aktuelle Kernelversion ist. Beachten Sie den generierten Namen (das Skript gibt ihn aus). Wir werden ihn im nächsten Schritt verwenden.update-initramfs -c -k $(uname -r)
/boot/config.txt
, um dieses Initramfs zu verwenden, und fügen Sie hinzu.initramfs initrd.img-3.11.0+ followkernel
Der Dateiname ist ohne Pfad. Er wurde im vorherigen Schritt generiert. "followkernel" steuert den Speicherort im Speicher ( Dokumentation zu config.txt ).Das löst den aktuellen Kernel, aber wie @Ingo hervorhob, würde ein Upgrade des Kernels das System beschädigen . Um dies zu beheben, habe ich seine Kernel-Installations-Hook- Skripte verwendet :
INITRD=Yes
/etc/kernel/postinst.d/initramfs-tools
chmod +x
esAn dieser Stelle haben wir ein System , das könnte Btrfs als Root - Gerät verwenden. Test durch Neustart: Das System bootet weiterhin von der ext4-Partition (oder was auch immer in Ihrer /boot/cmdline.txt steht ),
dmesg | grep -i btrfs
sollte aber jetzt eine Zeile mit "Btrfs geladen" anzeigen . Jetzt müssen wir tatsächlich eine btrfs-Partition erstellen und verwenden./
Erstellen Sie eine Sicherungskopie der (ext4) -Partition - vorausgesetzt, dies ist / dev / mmcblk0p2 - normalerweise: Fahren Sie das RPi herunter, nehmen Sie die SD-Karte heraus, mounten Sie siesudo mount /dev/mmcblk0p2 /mnt
an einer anderen Stelle (in diesem Beispiel auf einem Linux-Computer) und archivieren Sie den Inhalt. Beachten Sie, dass Sie ein Tool verwenden müssen, das den Besitz und die Berechtigungencd /mnt; sudo tar -czvf ~/rpi-rootfs-backup.tgz *
beibehält , z. B. tar: (und dann die SD-Karte wieder aushängen)mkfs.btrfs /dev/mmcblk0p2
sudo partprobe; sudo mount /dev/mmcblk0p2 /mnt; cd /mnt; tar -xzvf ~/rpi-rootfs-backup.tgz
sudo nano /mnt/etc/fstab
Es sollte eine ähnliche Zeile geben:
Ändern Sie dies in diesen (der neue FS-Typ ist btrfs und verwendet Standardoptionen):
sudo umount /mnt
Suchen Sie die UUID Ihrer neuen btrfs-Partition - suchen Sie die Zeile mit / dev / mmcblk0p2 und kopieren Sie den UUID = -Teil mit (nicht UUID_SUB, nicht PARTUUID! Dies würde einen Fehler im Bootloader auslösen und der Kernel würde nicht booten .):
sudo blkid
/ dev / mmcblk0p2: UUID = "cafebeef-0000-1234-aaaa-12346589" UUID_SUB = "ababccdd-2345-cafe-beee-587989991110" TYPE = "btrfs" PARTUUID = "Beef0bee-02"
Mounten Sie die Boot-Partition (FAT32):
sudo mount /dev/mmcblk0p1 /mnt
sudo nano /mnt/cmdline.txt
Finden Sie diese beiden Parameter
Und ersetzen durch
Beachten Sie, dass die UUID die zuvor kopierte ist, nur ohne Anführungszeichen.
sudo umount /mnt
Stellen Sie auf dem RPi sicher, dass Sie tatsächlich von einem btrfs-Root-Mount ausgeführt werden:
mount
/ dev / mmcblk0p2 on / type btrfs (rw, space_cache, subvol = /)
Et voilà! Nicht ganz per Mausklick, aber wenn ich auf den Schultern von Riesen stehe, kann ich es zum Laufen bringen. (Hat das auch zu einem Repo gemacht .)
quelle
sudo apt upgrade
Upgrade des Kernels schlägt dieses Setup beim Booten dramatisch fehl, da der neue Kernel versucht, die alten Initramfs zu laden, die fehlschlagen, und der Kernel keine btrfs-Treiber laden kann. Und es ist keine einfache Möglichkeit, dies zu beheben, zumindest mit einemchroot
Armhf-System.apt upgrade
gerade passiert, und bei Bedarf ein Initramfs von Hand generieren - bevor Sie den neuen Kernel starten. Keine machbare Aufgabe für einen Anfänger, weil es dramatisch ist, sie nicht zu bestehen. Sie können einen Blick darauf werfen, wie ich eine Init-Ramdisk (initramfs) beim Booten von Raspberry Pi verwenden kann.4.14.98+
und4.14.98-v7+
. Wenn update-initramfs durch ein Kernel-Update ausgelöst wird, werden zwei initrd.img * generiert, eine für jedes Modell. Dies passt nicht auf die/boot
Partition (Fehler - nicht genügend Speicherplatz) und die Generierung wird nicht abgeschlossen.MODULES=list
.