J'ai essayé d'extraire l'initrd casper/initrd
de Ubuntu 18.10 et j'ai obtenu un résultat inattendu. Je n'ai pas vu le système de fichiers racine ni les fichiers, mais juste un dossier nommé kernel
.
Tout d'abord, j'ai essayé de savoir si je devais décompresser l'initrd ou simplement extraire l'archive directement, alors j'ai lancé cette commande:
$ file initrd
initrd: ASCII cpio archive (SVR4 with no CRC)
Selon le résultat, il devrait s'agir d'une archive cpio et j'ai utilisé cpio
pour extraire l'archive.
$ cpio -id < initrd
56 blocks
$ ls
initrd kernel
Si je suis allé voir le répertoire kernel
, je me suis
kernel/
└── x86
└── microcode
└── AuthenticAMD.bin
2 directories, 1 file
Il devrait y avoir des fichiers et des dossiers comme init
, etc
, usr
, etc. Par exemple:
bin conf cryptroot etc init lib lib64 run sbin scripts usr var
Je réalise que l'initrd d'Ubuntu 18.10 est archivé de manière différente des versions précédentes. Dans les versions précédentes, initrd est généralement une archive cpio compressée lzma (ou gzip pour les versions précédentes). Le initrd de 18.10 est une archive composée de plusieurs fichiers binaires dans différents formats.
Pour plonger dans les archives, vous aurez peut-être besoin de binwalk
(ou d’autres outils similaires. Vous pourriez obtenir binwalk
avec Sudo apt install binwalk
). Une fois que vous obtenez binwalk
, exécutez la commande binwalk initrd
:
$ binwalk initrd
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 ASCII cpio archive (SVR4 with no CRC), file name: ".", file name length: "0x00000002", file size: "0x00000000"
112 0x70 ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"
232 0xE8 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"
356 0x164 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"
488 0x1E8 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/AuthenticAMD.bin", file name length: "0x00000026", file size: "0x00006B2A"
28072 0x6DA8 ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
28672 0x7000 ASCII cpio archive (SVR4 with no CRC), file name: "kernel", file name length: "0x00000007", file size: "0x00000000"
28792 0x7078 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86", file name length: "0x0000000B", file size: "0x00000000"
28916 0x70F4 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode", file name length: "0x00000015", file size: "0x00000000"
29048 0x7178 ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/.enuineIntel.align.0123456789abc", file name length: "0x00000036", file size: "0x00000000"
29212 0x721C ASCII cpio archive (SVR4 with no CRC), file name: "kernel/x86/microcode/GenuineIntel.bin", file name length: "0x00000026", file size: "0x00180C00"
1605296 0x187EB0 ASCII cpio archive (SVR4 with no CRC), file name: "TRAILER!!!", file name length: "0x0000000B", file size: "0x00000000"
1605632 0x188000 LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: -1 bytes
Vous pouvez voir qu'il existe deux fichiers binaires de microcode et un fichier de données compressé LZMA. Ce dernier est ce que nous voulons: le initrd compressé lzma.
Obtenons l'initrd compressé lzma par
dd if = initrd bs = 1605632 skip = 1 | unlzma -c | cpio -id
Vous obtiendrez les fichiers attendus mentionnés dans les questions. Éditez les fichiers que vous voulez changer. Utilisez les commandes suivantes pour reconditionner les fichiers binaires:
trouver | cpio -H newc -o | lzma -c> initrd.partial.lz
Et enfin, concaténez les fichiers du microcode et votre nouveau initrd (initrd.partial.lz) en
dd if=initrd of=initrd.microcode bs=512 count=3136
cat initrd.microcode initrd.partial.lz > initrd.new
Maintenant, renommez initrd.new
pour qu'il soit initrd
et remettez-le dans casper/initrd
. Vous pouvez démarrer votre système live avec votre nouvel initrd.
Ma réponse est inspirée par ce message https://unix.stackexchange.com/questions/163346/why-is-it-that-my-initrd-only-has-one-directory-namely-kernel =