J'utilise debian live-build pour travailler sur un système amorçable. À la fin du processus, j'obtiens les fichiers typiques utilisés pour démarrer un système en direct: un fichier squashfs, certains modules GRUB et fichiers de configuration, et un fichier initrd.img.
Je peux très bien démarrer en utilisant ces fichiers, en passant l'initrd au noyau via
initrd=/path/to/my/initrd.img
sur la ligne de commande du chargeur de démarrage. Mais quand j'essaie d'examiner le contenu de mon image initrd, comme ceci:
$file initrd.img
initrd.img: ASCII cpio archive (SVR4 with no CRC)
$mkdir initTree && cd initTree
$cpio -idv < ../initrd.img
l'arborescence des fichiers que je reçois ressemble à ceci:
$tree --charset=ASCII
.
`-- kernel
`-- x86
`-- microcode
`-- GenuineIntel.bin
Où se trouve l'arborescence du système de fichiers, avec les fichiers / bin, / etc, / sbin ... contenant les fichiers réellement utilisés lors du démarrage?
Réponses:
La méthode de saut de bloc cpio donnée ne fonctionne pas de manière fiable. C'est parce que les images initrd que j'obtenais moi-même n'avaient pas les deux archives concaténées sur une limite de 512 octets.
Au lieu de cela, procédez comme suit:
Utilisez le dernier numéro (21136) qui n'est pas sur une limite de 512 octets pour moi:
la source
cd
dans le répertoire où vous avez décompressé l' archive cpio, coursefind | cpio -H newc -o > /tmp/my_archive.cpio
, puis gzip avecgzip /tmp/my_archive.cpio
et enfin, concaténer avec la l'image de microcode, si vous aviez un:cat my_microcode_image.cpio /tmp/my_archive.cpio.gz > mynewinitrd.img
. Si vous n'aviez pas d'image de microcode, alors vous pouvez simplement utiliser votre fichier compressé tel quel dans votre chargeur de démarragecpio -i
plutôt quecpio -tdv | head
.Si vous savez que votre
initrd.img
fichier se compose d'une archive cpio non compressée suivie d'une archive cpio compressée gz, vous pouvez utiliser ce qui suit pour extraire tous les fichiers (des deux archives) dans votre répertoire de travail actuel (testé en bash):La ligne de commande ci-dessus transmet le contenu de
initrd.img
l'entrée standard dans un sous-shell qui exécute les deux commandescpio -id
et dezcat | cpio -id
manière séquentielle. La première commande (cpio -id
) se termine une fois qu'elle a lu toutes les données appartenant à la première archive cpio. Le contenu restant est ensuite transmis àzcat | cpio -id
, qui décompresse et décompresse la deuxième archive.la source
Il s'avère que l'initrd généré par la construction live de Debian (et à ma grande surprise, accepté par le noyau) est en fait la concaténation de deux images:
En extrayant le initrd.img d'origine, directement à partir de la sortie live-build, j'ai obtenu cette sortie:
Ce qui signifie que l'extraction de cpio s'est terminée après l'analyse de 896 blocs de 512 octets chacun. Mais le fichier initrd.img d'origine était bien plus grand que 896 * 512 = 458752B = 448 Ko:
Donc, l'image initrd réelle que je cherchais a été ajoutée juste après la première archive cpio (celle contenant les mises à jour du microcode) et était accessible en utilisant dd:
la source
Vous pouvez utiliser
unmkinitramfs
depuis initramfs-tools> = 0.126, qui est inclus depuis Debian 9 (stretch) et Ubuntu 18.04 (bionic).la source
Sur la base de l'idée donnée dans la réponse de @ woolpool, j'ai écrit une fonction récursive qui fonctionnera pour n'importe quelle archive cpio quelle que soit la disposition des données concaténées et ne nécessite aucun outil spécial comme binwalk. Par exemple, mon mkinitramfs produisait un fichier cpio; cpio; gzip. Il fonctionne en extrayant chaque partie du fichier initrd concaténé, en enregistrant le reste dans un fichier temporaire puis en utilisant le programme "file" pour décider quoi faire avec la partie suivante.
Pour utiliser, tapez: uncpio initrdfilename
la source
Si vous devez effectuer cette tâche souvent, vous souhaiterez peut-être créer une petite fonction bash comme la suivante (et peut-être l'ajouter à votre .bashrc):
Le code est basé sur la réponse de Marc, mais il est beaucoup plus rapide car binwalk ne recherchera que les fichiers gzip. Vous pouvez l'invoquer, comme ceci:
Vous aurez besoin
binwalk
installé pour le faire fonctionner.la source