Как изменить initrd начальный электронный диск Ubuntu 18.10 Космическая Каракатица

Я пытался извлечь initrd casper/initrd из Ubuntu 18.10 и получил неожиданный результат. Я не видел корневую файловую систему и файлы, но просто названную папку kernel.

Что я сделал

Во-первых я пытался знать, должен ли я распаковать initrd или просто извлечь архив непосредственно, таким образом, я дал эту команду:

$ file initrd
initrd: ASCII cpio archive (SVR4 with no CRC)

Что я получил

Согласно выводу, это должен быть архив cpio, и я использовал cpio извлечь архив.

$ cpio -id < initrd 
56 blocks
$ ls
initrd  kernel

Если я пошел, чтобы взглянуть каталога kernel, Я добрался

kernel/
└── x86
    └── microcode
        └── AuthenticAMD.bin

2 directories, 1 file

Что я ожидаю

Должны быть файлы и папки как init, etc, usr, и так далее. Например:

bin  conf  cryptroot  etc  init  lib  lib64  run  sbin  scripts  usr  var
2
задан 21 November 2018 в 18:48

1 ответ

Я выясняю, что initrd Ubuntu 18.10 заархивирован по-другому от предыдущих выпусков. В предыдущих выпусках initrd обычно является lzma (или gzip для намного более ранних выпусков) сжал архив cpio. initrd 18,10 является архивом, состоявшим из нескольких двоичных файлов в различных форматах.

Для дайвинга в архив Вам, возможно, понадобится binwalk (или другие подобные инструменты. Вы могли добраться binwalk sudo apt install binwalk). После того как Вы добираетесь binwalk, дайте команду 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

Вы видели, что существует два двоичных файла микрокода, и LZMA сжал файл данных. Последний - то, что мы хотим: lzma сжатый initrd.

Давайте получим lzma сжатый initrd

dd if=initrd bs=1605632 skip=1 | unlzma-c | cpio - идентификатор

Вы упомянете ожидаемые файлы в вопросах. Отредактируйте файлы, которые Вы хотите изменить. Используйте следующие команды для переупаковки двоичных файлов:

найдите | cpio-H newc-o | lzma-c> initrd.partial.lz

И наконец свяжите файлы микрокода и Ваш новый initrd (initrd.partial.lz)

dd if=initrd of=initrd.microcode bs=512 count=3136
cat initrd.microcode initrd.partial.lz > initrd.new

Теперь переименуйте initrd.new быть initrd и отложенный это к casper/initrd. Вы могли загрузить свою живую систему с Вашим новым initrd.

Мой ответ вдохновлен этим сообщением https://unix.stackexchange.com/questions/163346/why-is-it-that-my-initrd-only-has-one-directory-namely-kernel

4
ответ дан 2 December 2019 в 02:12

Другие вопросы по тегам:

Похожие вопросы: