web-dev-qa-db-fra.com

Comment modifier le disque virtuel initial initrd d'Ubuntu 18.10 Cosmic Cuttlefish

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.

Ce que j'ai fait

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)

Ce que j'ai

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

Ce que j'attends

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
2
tai271828

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 =

3
tai271828