Как перепаковать initrd.img?


9

На оригинальном /boot/initrd.img- kernel_ver binwalk показывает эту структуру:

введите описание изображения здесь

От 0 до 22528 байт имеется архив CPIO, содержащий только прошивку GenuineIntel.bin в определенной иерархии папок.
Из 22528 байт есть архив gzip, содержащий соответствующую файловую систему, и этот архив также архивируется с помощью CPIO.

После распаковки и изменения, как я могу сжать initrd.img таким же образом (с той же иерархией папок)? как эта оригинальная структура:

введите описание изображения здесь

После предложения от комментария:

find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

binwalk :

введите описание изображения здесь

Это совершенно другая структура.


Вы извлекаете initrd.img в рабочий каталог. Вы добавляете прошивку GenuineIntel.bin в определенной иерархии папок в рабочий каталог. Затем вы переделываете архив с помощью. find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lzЕсли эта процедура не работает, уточните, какие команды вы выполняли, а какие - нет.
Пантера

Ваше редактирование с изображением практически ничего не добавляет к моему пониманию вашей проблемы. Вам необходимо извлечь изображение, добавить свой код с соответствующей структурой файла и расположением прошивки GenuineIntel.bin и повторно упаковать в новый .img.
Пантера

@ bodhi.zazen, как я уже сказал, это сделало другой файл ...
EdiD

@ bodhi.zazen ты наконец понял, что я спрашиваю?
EdiD

1
Похоже, что файл initramfs является объединением архивов CPIO. Каждый архив CPIO может быть сжат (с помощью gzip, xz и т. Д.) Или без сжатия. Ваш входной файл начинается с несжатого файла со смещением 0, затем продолжается со сжатым файлом со смещением 22528. К сожалению, я не знаю стандартного инструмента, который мог бы извлекать конкатенацию, возможно, сжатых архивов CPIO.
Очков

Ответы:


4

Я разобрался, как сделать точно такой же initrd.imgархив.

Ответ Bodhi.zazen, вероятно, будет работать, потому что это общеизвестное решение:

find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

но вопрос был в другом. Этот ответ был бы хорош, если в архиве cpio есть одна gzip-файловая система, но в этой ситуации есть также прошивка Intel в определенной структуре папок, которую я хочу сохранить.

Чтобы сохранить ту же иерархию папок, необходимо выполнить три шага:

  1. Создайте архив файловой системы CPIO с простой опцией -o без формата newc , созданного ранее, например. базовая папка:

    find . | cpio -o | gzip -9 > ../base/file_system.gz

  2. Сделайте правильный архив с форматом newc , содержащий kernel / x86 / microcode / GenuineIntel.bin :

    find kernel/ | cpio -o -H newc > new_initrd.img

  3. Добавьте архив gzip-файловой системы в соответствующий файл new_initrd.img:

    find base/ | cpio -o >> new_initrd.img


1
Большой! Спасибо! +10! Но как распаковать оригинальный initrd?
Rth

Кроме того, ваше решение создает немного другую структуру. У меня есть абсолютно то же самое в binwalk СТРУКТУРА , когда я сделал шаг (2), а затемfind . | cpio -o | gzip -9 >> new_initrd.img
RTH

@EdiD как распаковать оригинальный initrd?
ИмранРазаХан

1
@ImranRazaKhan вам нужно четыре шага: cpio -id < initrd.img-kernel_ver; dd if=initrd.img-4.4.0-22-generic of=image.gz bs=22528 skip=1- сопоставьте имя файла initrd.img и размер блока; gunzip image.gz; cpio -i < image
EdiD

3

Вы переупаковываете с

cd your_working_directory_with_modifications
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz

Вторая команда переименовывает initrd, вы указываете initrd для использования при загрузке в grub.

Я предлагаю вам протестировать (загрузить) пользовательский initrd перед его перемещением или переименованием.

Дополнительная информация из обсуждения в комментариях:

Во-первых, я не думаю, что вы понимаете роль cpio / tar. и cpio, и tar берут несколько файлов и / или каталогов и объединяют их в один файл или архив.

Во-вторых, я не думаю, что вы понимаете роль сжатия, сжатие просто делает полученный архив меньше. Вы можете использовать любой инструмент для сжатия.

Видеть

https://wiki.ubuntu.com/CustomizeLiveInitrd

https://wiki.gentoo.org/wiki/Initramfs/Guide

В-третьих, ядро ​​Linux использует Cipo, а не tar.

Видеть

https://www.kernel.org/doc/Documentation/filesystems/ramfs-rootfs-initramfs.txt

Смотрите "Почему cpio, а не tar?" раздел

Почему cpio, а не tar?

Это решение было принято еще в декабре 2001 года. Обсуждение началось здесь:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1538.html

И породил второй поток (в частности, tar против cpio), начиная здесь:

http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1587.html

Краткая и быстрая версия (которая не заменит чтение вышеупомянутых тем):

1) cpio - это стандарт. Его десятилетия (от дней AT & T) и уже широко используются в Linux (внутри RPM, дисков с драйверами устройств Red Hat). Вот статья Linux Journal об этом с 1996 года:

  http://www.linuxjournal.com/article/1213

Он не так популярен, как tar, потому что традиционные инструменты командной строки cpio требуют _truly_hideous_ аргументов командной строки. Но это ничего не говорит о формате архива, и есть альтернативные инструменты, такие как:

 http://freecode.com/projects/afio

2) Формат архива cpio, выбранный ядром, проще и чище (и, следовательно, его легче создавать и анализировать), чем любой из (буквально десятков) различных форматов архива tar. Полный формат архива initramfs описан в buffer-format.txt, создан в usr / gen_init_cpio.c и извлечен в init / initramfs.c. Все три вместе составляют менее 26 тыс. Человек текста.

3) Проект GNU по стандартизации на tar примерно так же актуален, как и Windows по стандартизации на zip. Linux также не является частью и может принимать собственные технические решения.

4) Поскольку это внутренний формат ядра, он мог бы быть
чем-то совершенно новым. Ядро предоставляет свои собственные инструменты для создания и извлечения этого формата в любом случае. Использование существующего стандарта было предпочтительным, но не обязательным.

5) Аль Виро принял решение (цитата: «tar ужасен как ад и не будет поддерживаться на стороне ядра»):

  http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1540.html

объяснил свои рассуждения:

  http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1550.html
  http://www.uwsg.iu.edu/hypermail/linux/kernel/0112.2/1638.html

и, самое главное, разработал и внедрил код initramfs.


Это не сохранит структуру папок. Я хочу такую ​​же структуру, как оригинальный initrd.img. Значение -> GenuineIntel.bin не сжимается, просто архивируется с помощью cpio в корневом каталоге в папке kernel / x86 / microcode, и почему lzma, когда я говорю о gzip?
EdiD

Изма дает меньший архив. используйте gzip, если хотите. Я не уверен, почему вы беспокоитесь о сжатии или нет, должно прекрасно работать со сжатием и приводить к уменьшению изображения на диске. Не совсем уверен, что вы пытаетесь достичь из того, что вы опубликовали.
Пантера

Я хочу знать, как это было сделано изначально. Возможно, прошивка Intel не сжата из-за более быстрого доступа.
EdiD

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

В руководстве по cpio нет ничего о сжатии. Проверьте принятый ответ: superuser.com/questions/343915/…
EdiD

3

Недавно я столкнулся с тем же вопросом, и мой поиск в Интернете привел меня к этой теме, поэтому в случае, если это поможет другим, идущим по этим шагам, вот ответ 2018 года на старый вопрос ...

Кажется, что в «последних» ядрах файл initrd.img может содержать несжатый архив cpio (то есть содержащий обновления микрокода), добавленный к (сжатому) архиву cpio, содержащему обычное дерево каталогов initramfs.

Это кратко обсуждается на странице вики Debian:
https://wiki.debian.org/initramfs#How_to_inspect_initramfs
, но более точный код для синтаксического анализа такого рода файла initrd.img можно найти в splitinitramfs()функции unmkinitramfsкоманды, найденной в initramfs-tools-coreпакет (например, https://git.launchpad.net/ubuntu/+source/initramfs-tools/tree/unmkinitramfs ).

Я сам не пытался пересобрать такой файл initrd.img, но на этой вики-странице кажется, что для редактирования загрузочных скриптов initramfs не нужно вообще распаковывать архив GenuineIntel. Вместо этого вы можете просто сохранить этот архив cpio как есть где-то отдельно, затем распаковать второй (сжатый) архив, изменить дерево каталогов и перестроить сжатый архив cpio, а затем объединить сохраненный архив микрокода с вновь созданным.

(Код, который изначально генерировал этот «добавленный» архив, находится в /usr/share/initramfs-tools/hooks/intel_microcode.)


0

в Ubuntu файл initrd.imgсжимается в gzip, я хотел бы сохранить это при редактировании. вот как:

экстракт:

zcat /boot/initrd.img-3.19.0-80-generic | cpio --extract

компресс:

find . 2>/dev/null | cpio --quiet --dereference -o -H newc | gzip -9 > /boot/initrd.img-3.19.0-80-generic
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.