cpio неправильно распаковывает initrd в Ubuntu Xenial

Я пытаюсь распаковать образ initrd:

# file /boot/initrd.img-4.11.0-14-generic
/boot/initrd.img-4.11.0-14-generic: ASCII cpio archive (SVR4 with no CRC)
# mkdir /tmp/initrd; cd /tmp/initrd
# cpio -i -d -H newc --no-absolute-filenames -F /boot/initrd.img-4.11.0-14-generic
194 blocks
# ls -R
.:
kernel

./kernel:
x86

./kernel/x86:
microcode

./kernel/x86/microcode:
GenuineIntel.bin

Так что только экстракты cpio ./kernel подкаталог архива. Но lsinitramfs показать гораздо больше файлов внутри него:

# lsinitramfs /boot/initrd.img-4.11.0-14-generic
/boot/initrd.img-4.11.0-14-generic
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/GenuineIntel.bin
.
lib
lib/libnss_files.so.2
lib/cryptsetup

...

bin/egrep
init
run

Как я могу получить все содержимое архива?

1 ответ

Решение

Если у вас установлен intel-microcode (и у вас есть) и / или amd64-micrcocode, initrd состоит из двух объединенных образов. Первое изображение содержит только микрокод. Второй содержит все остальное. Ваша команда cpio просто извлекает первую.

Самый простой способ - это использовать unmkinitramfs из initramfs-tools >= 0.126, который включен в Ubuntu 18.04 (бионический) и новее. На xenial вы можете просто клонировать https://salsa.debian.org/kernel-team/initramfs-tools и позвонить unmkinitramfs из этого каталога.

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