J'ai trouvé qu'il y a une configuration dans
rpi ~ $ cat / etc / default / raspberrypi-kernel # Par défaut pour raspberrypi-kernel # Décommentez la ligne suivante pour activer la génération de # fichiers /boot/initrd.img-KVER (nécessite initramfs-tools) # INITRD = Yes # Décommentez la ligne suivante pour activer la génération de # /boot/initrd(7).img ( nécessite rpi-initramfs-tools) # RPI_INITRD = Oui
Les commentaires sont la seule documentation que j'ai trouvée. En particulier, je ne trouve rien sur rpi-initramfs-tools
. Ils ne sont tout simplement pas disponibles. J'ai donc testé avec INITRD = Yes
en le décommentant car les initramfs-tools
sont installés par défaut. Ensuite, pour créer un initramfs, j'exécute
rpi ~ $ sudo update-initramfs -c -k $ (uname -r)
et cela fonctionne comme un charme. Vous devez également le faire pour générer les premiers initramfs . Il en produit un par exemple /boot/initrd.img-4.14.71-v7+
. À partir de maintenant, vous pouvez simplement mettre à jour avec:
rpi ~ $ sudo update-initramfs -uln: échec de la création du lien dur '/ boot / initrd. img-4.14.71-v7 + .dpkg-bak '= >' /boot/initrd.img-4.14.71-v7+ ': Opération non autoriséeupdate-initramfs: Génération de /boot/initrd.img-4.14.71-v7+
Comme vous le voyez, vous recevrez un avertissement (ce n'est pas une erreur) de ln
. La partition de démarrage a un système de fichiers gros qui ne prend pas en charge les liens, mais cela n'a pas d'importance. Le seul problème est qu'il a besoin d'une entrée dans /boot/config.txt
comme
initramfs initrd.img-4.14.71-v7 +
(sans signe égal)
Sinon, le chargeur de démarrage ne peut pas trouver le disque mémoire et le démarrage échoue.
Avec Raspbian, nous avons également deux images de noyau, par exemple /boot/initrd.img-4.14.71
et /boot/initrd.img-4.14.71-v7+
et par défaut, update-initramfs génère un disque ram d'initialisation pour chaque noyau mais qui ne rentrera pas dans l'espace limité de la partition de démarrage. Nous devons donc également nous assurer que nous ne générons qu'un initramfs pour le noyau en cours d'exécution.
La gestion de initramfs se fait avec le script /etc/kernel/postinst.d/ outils-initramfs
. Nous devons modifier ce script comme suit. Mais avant de déplacer le script d'origine vers un emplacement de sauvegarde:
rpi ~ $ sudo mv /etc/kernel/postinst.d/initramfs-tools ~
Ensuite, créez un fichier
rpi ~ $ sudo editor /etc/kernel/postinst.d/rpi- initramfs-tools
avec ce contenu:
#! / bin / bash -e # Les variables d'environnement sont définies par l'appelant scriptversion = "$ 1" bootopt = "" commande -v update-initramfs > / dev / null 2>&1 || exit 0 # le passage de la version du noyau est requisif [-z "$ {version}"]; then echo >&2 "W: initramfs-tools: $ {DPKG_MAINTSCRIPT_PACKAGE: -kernel package} n'a pas passé de numéro de version" exit 2fi # exit si le noyau n'a pas besoin d'un initramfsif ["$ INITRD" = 'Non']; puis # effacez les entrées initramfs dans /boot/config.txt / bin / sed -i '/ ^ initramfs / d' /boot/config.txt exit 0fi # il n'y a que deux types de noyau: avec et sans suffixe "-v7 +" ou "-v8 +" currentversion = "$ (uname -r)" # get §currenttype à partir de $ 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 # * -}" # get $ newtype à partir de $ version
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 # * -}" # nous ne faisons rien si le nouveau noyau n'est pas pour le même type de noyau alors le currentif ["$ newtype"! = "$ currenttype"]; puis exit 0fi # le nom de fichier absolu de l'image du noyau peut être passé comme second argument; # crée le fichier initrd dans le même répertoireif [-n "$ 2"]; then bootdir = $ (dirname "$ 2") bootopt = "- b $ {bootdir}" fi # éviter d'exécuter plusieurs fois si [-n "$ DEB_MAINT_PARAMS"]; puis eval set - "$ DEB_MAINT_PARAMS" if [-z "$ 1"] || ["$ 1"! = "Configurer"]; puis quittez 0 fifi # nous allons bien - créez des initramfs. la mise à jour s'exécute do_bootloaderINITRAMFS_TOOLS_KERNEL_HOOK = 1 update-initramfs -c -t -k "$ {version}" $ {bootopt} >&2 # supprimer les entrées initramfs dans /boot/config.txt/bin/sed -i '/ ^ initramfs / d' boot / config.txt # insérer l'entrée initramfs dans /boot/config.txtINITRD_ENTRY="initramfs initrd.img - $ {version} "echo >&2 $ (nom de base" $ 0 "): insérer \" $ INITRD_ENTRY "" \ 'dans / boot /config.txt/bin/sed -i "1i $ INITRD_ENTRY" /boot/config.txt
Rendre le script exécutable:
rpi ~ $ sudo chmod 755 /etc/kernel/postinst.d/rpi-initramfs-tools
Les extensions dans le script garantissent qu'un initramfs est uniquement créé pour le noyau en cours d'exécution et qu'il est géré une entrée dans /boot/config.txt
. Si vous aimez voir les changements, vous pouvez le faire avec diff --ignore-tab-expansion ~ / initramfs-tools /etc/kernel/postinst.d/rpi-initramfs-tools
.
Pour les mises à jour manuelles, nous créons:
rpi ~ $ sudo editor / usr / local / sbin / update-rpi-initramfs
avec ce contenu:
#! / bin / bash # Ce script appelle default update-initramfs # puis insère une entrée 'initramfs' dans /boot/config.txt si nécessaire # devrait retour par exemple "update-initramfs: Génération de /boot/initrd.img-4.14.79-v7+"# ou" update-initramfs: Suppression de /boot/initrd.img-4.14.71-v7+"MSG=$(/usr/sbin/update -initramfs "$ @") RETCODE = $? echo $ MSGif [[$ RETCODE -ne 0]]; puis echo >&2 ATTENTION! Vérifiez l'entrée \ 'initramfs \' dans /boot/config.txt exit "$ RETCODE" fiCMP = "update-initramfs: Suppression *" if [[$ MSG == $ CMP]]; puis # supprimer les entrées initramfs dans /boot/config.txt / bin / sed -i '/ ^ initramfs / d' /boot/config.txt echo $ (basename "$ 0"): supprimé toutes les entrées \ 'initramfs \' de / boot / config.txt exit 0fiCMP = "update-initramfs: Generating *" if [[$ MSG == $ CMP]]; puis # supprimez les entrées initramfs dans /boot/config.txt / bin / sed -i '/ ^ initramfs / d' /boot/config.txt # exit si le noyau n'a pas besoin d'une source initramfs / etc / default / raspberrypi-kernel si ["$ {INITRD ,,}"! = 'Oui']; then echo $ (basename "$ 0"): pas d'entrée dans /boot/config.txt \ (voir INITRD dans / etc / default / raspberrypi-kernel \) exit 0 fi # insérer l'entrée initramfs dans /boot/config.txt VERSION = $ (basename "$ MSG") INITRD_ENTRY = "initramfs $ VERSION" echo $ (basename "$ 0"): insérez \ '"$ INITRD_ENTRY" \' dans /boot/config.txt / bin / sed -i "1i $ INITRD_ENTRY "/boot/config.txt exit 0fiecho >&2 ATTENTION! Vérifiez l'entrée 'initramfs' dans /boot/config.txtexit 1
Définissez les autorisations:
rpi ~ $ sudo chmod 755 / usr / local / sbin / update-rpi-initramfs
À partir de maintenant, vous ne devriez utiliser que update-rpi-initramfs
au lieu de update-initramfs
, par exemple:
rpi ~ $ sudo update-rpi-initramfs -u
Cela garantit que vous avez toujours la bonne entrée dans /boot/config.txt
.
Références:
[1] Scripts et hooks du responsable du package