Ich habe festgestellt, dass es ein Setup in
gibt. rpi ~ $ cat / etc / default / raspberrypi-kernel # Standardeinstellungen für raspberrypi-kernel # Kommentieren Sie die folgende Zeile aus, um die Generierung von # /boot/initrd.img-KVER-Dateien zu aktivieren (erfordert initramfs-tools). # INITRD = Ja # Kommentieren Sie die folgende Zeile aus, um die Generierung von # /boot/initrd(7).img-Dateien zu aktivieren ( erfordert rpi-initramfs-tools) # RPI_INITRD = Ja
Die Kommentare dort sind die einzige Dokumentation, die ich gefunden habe. Insbesondere kann ich nichts über rpi-initramfs-tools
finden. Sie sind einfach nicht verfügbar. Deshalb habe ich mit INITRD = Yes
getestet, indem ich es auskommentiert habe, da initramfs-tools
standardmäßig installiert sind. Um dann ein Initramfs zu erstellen, führe ich
rpi ~ $ sudo update-initramfs -c -k $ (uname -r)
aus pre> und es funktioniert wie ein Zauber. Sie müssen dies auch tun, um das erste initramfs zu generieren. Es wird beispielsweise /boot/initrd.img-4.14.71-v7+
erstellt. Von nun an können Sie einfach aktualisieren mit:
rpi ~ $ sudo update-initramfs -uln: Hardlink '/ boot / initrd konnte nicht erstellt werden. img-4.14.71-v7 + .dpkg-bak '= >' /boot/initrd.img-4.14.71-v7+ ': Vorgang nicht zulässigupdate-initramfs: Generieren von /boot/initrd.img-4.14.71-v7+
Wie Sie sehen, erhalten Sie eine Warnung (es ist kein Fehler) von ln
. Die Boot-Partition verfügt über ein fettes Dateisystem, das keine Links unterstützt, aber keine Rolle spielt. Das einzige Problem ist, dass ein Eintrag in /boot/config.txt
wie
initramfs initrd.img-4.14.71-v7 +
(ohne) erforderlich ist Gleichheitszeichen)
Andernfalls kann der Bootloader die Ramdisk nicht finden und der Startvorgang schlägt fehl.
Mit Raspbian haben wir auch zwei Kernel-Images, zum Beispiel /boot/initrd.img-4.14.71
und /boot/initrd.img-4.14.71-v7+
und standardmäßig generiert update-initramfs für jeden Kernel eine init-RAM-Disk, die jedoch nicht auf den begrenzten Speicherplatz der Boot-Partition passt. Daher müssen wir auch sicherstellen, dass wir nur ein initramfs für den laufenden Kernel generieren.
Das Verwalten von initramfs erfolgt mit dem Skript /etc/kernel/postinst.d/ initramfs-tools
. Wir müssen dieses Skript wie folgt ändern. Bevor Sie jedoch das ursprüngliche Skript an einen sicheren Ort verschieben:
rpi ~ $ sudo mv /etc/kernel/postinst.d/initramfs-tools ~
Erstellen Sie dann eine Datei
rpi ~ $ sudo editor /etc/kernel/postinst.d/rpi- initramfs-tools
mit folgendem Inhalt:
#! / bin / bash -e # Umgebungsvariablen werden festgelegt durch den aufrufenden Befehl scriptversion = "$ 1" bootopt = "" -v update-initramfs > / dev / null 2>&1 || exit 0 # das Übergeben der Kernel-Version ist erforderlich, wenn [-z "$ {version}"]; dann echo >&2 "W: initramfs-tools: $ {DPKG_MAINTSCRIPT_PACKAGE: -kernel package} hat keine Versionsnummer übergeben" exit 2fi # exit, wenn der Kernel kein initramfsif benötigt ["$ INITRD" = 'No']; dann # lösche initramfs Einträge in /boot/config.txt / bin / sed -i '/ ^ initramfs / d' /boot/config.txt exit 0fi # es gibt nur zwei Kerneltypen: mit und ohne Postfix "-v7 +" oder "-v8 +" currentversion = "$ (uname -r)" # get §currenttype from $ currentversioncurrenttype = "<no currenttype>" echo $ currentversion | grep -Pq '^ \ d + \. \ d + \. \ d + \ + $' [$? -eq 0] && currenttype = "+" echo $ currentversion | grep -Pq '^ \ d + \. \ d + \. \ d + -v [78] \ + $' [$? -eq 0] && currenttype = "$ {currentversion # * -}" # $ newtype von $ version abrufen
newtype = "<no newtype>" echo $ version | grep -Pq '^ \ d + \. \ d + \. \ d + \ + $' [$? -eq 0] && newtype = "+" echo $ version | grep -Pq '^ \ d + \. \ d + \. \ d + -v [78] \ + $' [$? -eq 0] && newtype = "$ {version # * -}" # wir tun nichts, wenn der neue Kernel nicht für denselben Kerneltyp ist, dann der currentif ["$ newtype"! = "$ currenttype"]; Beenden Sie dann 0fi. # Der absolute Dateiname des Kernel-Images kann als zweites Argument übergeben werden. # Erstellen Sie die Initrd im selben Verzeichnis, wenn [-n "$ 2"]; dann bootdir = $ (dirname "$ 2") bootopt = "- b $ {bootdir}" fi # mehrere Male vermeiden, wenn [-n "$ DEB_MAINT_PARAMS"]; dann eval set - "$ DEB_MAINT_PARAMS" wenn [-z "$ 1"] || ["$ 1"! = "Configure"]; dann beende 0 fifi # wir sind gut - erstelle initramfs. Das Update wird ausgeführt. do_bootloaderINITRAMFS_TOOLS_KERNEL_HOOK = 1 update-initramfs -c -t -k "$ {version}" $ {bootopt} >&2 # Initramfs-Einträge in /boot/config.txt/bin/sed -i '/ ^ initramfs / d /' löschen boot / config.txt # füge den initramfs-Eintrag in /boot/config.txtINITRD_ENTRY="initramfs initrd.img ein - $ {version} "echo >&2 $ (Basisname" $ 0 "): füge \ '" $ INITRD_ENTRY "\' in / boot ein /config.txt/bin/sed -i "1i $ INITRD_ENTRY" /boot/config.txt
Machen Sie das Skript ausführbar:
rpi ~ $ sudo chmod 755 /etc/kernel/postinst.d/rpi-initramfs-tools
Die Erweiterungen im Skript stellen sicher, dass nur ein Initramfs erstellt wird für den aktuell laufenden Kernel und dass ein Eintrag in /boot/config.txt
verwaltet wird. Wenn Sie die Änderungen sehen möchten, können Sie dies mit diff --ignore-tab-extension ~ / initramfs-tools /etc/kernel/postinst.d/rpi-initramfs-tools
tun.
Für manuelle Updates erstellen wir:
rpi ~ $ sudo editor / usr / local / sbin / update-rpi-initramfs
mit folgendem Inhalt:
#! / bin / bash # Dieses Skript ruft das Standard-Update-initramfs # auf und fügt bei Bedarf einen 'initramfs'-Eintrag in /boot/config.txt ein zB zurück "update-initramfs: Generieren von /boot/initrd.img-4.14.79-v7+"# oder" update-initramfs: Löschen von /boot/initrd.img-4.14.71-v7+"MSG=$(/usr/sbin/update -initramfs "$ @") RETCODE = $? echo $ MSGif [[$ RETCODE -ne 0]]; dann echo >&2 ACHTUNG! Überprüfen Sie den Eintrag \ 'initramfs \' in /boot/config.txt. Beenden Sie "$ RETCODE" fiCMP = "update-initramfs: Löschen *", wenn [[$ MSG == $ CMP]]; dann # initramfs-Einträge in /boot/config.txt / bin / sed -i '/ ^ initramfs / d' /boot/config.txt löschen echo $ (Basisname "$ 0"): alle \ 'initramfs \' Einträge aus / gelöscht boot / config.txt exit 0fiCMP = "update-initramfs: Generating *" if [[$ MSG == $ CMP]]; dann # initramfs-Einträge in /boot/config.txt / bin / sed -i '/ ^ initramfs / d' /boot/config.txt löschen # beenden, wenn der Kernel keine initramfs-Quelle benötigt / etc / default / raspberrypi-kernel wenn ["$ {INITRD ,,}"! = 'Ja']; dann echo $ (Basisname "$ 0"): kein Eintrag in /boot/config.txt \ (siehe INITRD in / etc / default / raspberrypi-kernel \) exit 0 fi # initramfs-Eintrag in /boot/config.txt einfügen VERSION = $ (Basisname "$ MSG") INITRD_ENTRY = "initramfs $ VERSION" echo $ (Basisname "$ 0"): Fügen Sie \ "$ INITRD_ENTRY" \ / in /boot/config.txt / bin / sed -i "1i $ INITRD_ENTRY ein "/boot/config.txt exit 0fiecho >&2 ACHTUNG! Überprüfen Sie den Eintrag 'initramfs' in /boot/config.txtexit 1
Berechtigungen festlegen:
rpi ~ $ sudo chmod 755 / usr / local / sbin / update-rpi-initramfs
Von nun an sollten Sie nur update-rpi-initramfs
anstelle von verwenden update-initramfs
, zum Beispiel:
rpi ~ $ sudo update-rpi-initramfs -u
Dies stellt sicher, dass Sie immer den richtigen Eintrag in /boot/config.txt
.
Referenzen:
[1] Skripts und Hooks für die Paketverwaltung