18 октября 2023

Распаковка initramfs с микрокодом в Debian.

 
Вольный пересказ инструкции из wiki Debian.
При установки пакета с обновлением микрокода для процессора распаковать образ initramfs без дополнительных действий не получится, потому что в самом начале файла расположен образ с микрокодом, а хвост с остальным образом упаковщик видеть не желает.

Если не брать в расчёт другие форматы initramfs, а ограничиться только "ASCII cpio archive", то для распаковки образа надо выполнить следующие действия:
  1. Определить начало основного образа;
  2. Сохранить основной образ в отдельный файл;
  3. Распаковать полученный файл.
Для определения начала используется программа "cpio" из одноименного пакета. У неё есть ключ "-t" для отображения списка файлов в образе. Сам файл надо подавать на стандартный ввод. Делается всё примерно так:
$ cpio -t < /boot/initrd.img-6.1.0-13-amd64
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/.enuineIntel.align.0123456789abc
kernel/x86/microcode/GenuineIntel.bin
14064 блока
Видно, что программа вывела содержимое только куска файла с обновлением микрокода и так же показала размер этого куска в блоках по 512 байт.

Используя это значение, можно сохранить основной образ в отдельный файл с помощью программы "dd":
# dd if=/boot/initrd.img-6.1.0-13-amd64 of=initrd.img bs=512 skip=14064
63690+1 records in
63690+1 records out
32609563 bytes (33 MB, 31 MiB) copied, 1,17182 s, 27,8 MB/s
Теперь в файле "initrd.img" записан образ initramfs, который нужен, но он скорее всего сжат. Сжатые образы программа "cpio" не понимает. Для определения компрессора можно использовать программу "file". Если компрессор умеет распаковывать сжатые данные в стандартный вывод, то даже не понадобится  использовать временный файл.
$ file initrd.img
initrd.img: Zstandard compressed data (v0.8+), Dictionary ID: None

# список файлов
$ zstdcat initrd.img | cpio -t
.
bin
conf
conf/arch.conf
conf/conf.d
conf/conf.d/compress
conf/conf.d/resume
conf/conf.d/zz-resume-auto
conf/initramfs.conf
conf/modules
...

# извлечение
$ zstdcat initrd.img | cpio -i
267227 блоков
Содержимое образа находится в текущем каталоге.

-->