Как изменить начальный виртуальный диск initrd в Ubuntu 18.10 Cosmic Cuttlefish
Я пытался извлечь 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
1 ответ
Я выяснил, что initrd Ubuntu 18.10 архивируется не так, как в предыдущих выпусках. В предыдущих выпусках initrd обычно представляет собой сжатый архив cpio lzma (или gzip для более ранних выпусков). 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 -id
Вы получите ожидаемые файлы, упомянутые в вопросах. Отредактируйте файлы, которые вы хотите изменить. Используйте следующие команды для перепаковки двоичных файлов:
найти | 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