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

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

enter image description here

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

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

enter image description here

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

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

binwalk:

enter image description here

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

8
задан 26 May 2016 в 21:13

4 ответа

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

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

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

Я предлагаю, чтобы Вы протестировали (загружают) пользовательский initrd прежде, чем переместить или переименовать его.

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

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

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

Посмотрите

https://wiki.ubuntu.com/CustomizeLiveInitrd

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

В-третьих, ядро Linux использует директора по интеллектуальной собственности скорее затем tar.

Посмотрите

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

Посмотрите раздел "Why cpio rather than 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 (в об/мин, дисках драйвера устройства Red Hat). Вот Статья в журнале Linux об этом с 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. Все три вместе прибывают в меньше, чем 26k общее количество человекочитаемого текста.

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

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

5) Al Viro принял решение (кавычка: "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.

3
ответ дан 27 May 2016 в 07:13

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

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

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

но вопрос отличался. Этот ответ был бы хорош если в архиве cpio существует одна gzipped файловая система, но в этой ситуации существует также встроенное микропрограммное обеспечение 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. Добавьте gzipped архив файловой системы к надлежащему new_initrd.img:

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

3
ответ дан 27 May 2016 в 07:13

Я недавно столкнулся с этим тем же вопросом, и мой веб-поиск привел меня к этому потоку, поэтому в случае, если помогает, что другие, идущие по тем стопам, вот являются ответом 2018 года на старый вопрос...

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

Это обсуждено кратко на странице Debian Wiki:
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 файла сам, но на основе той страницы Wiki кажется, что для редактирования сценариев начальной загрузки initramfs нельзя было бы хотеть распаковывать архив GenuineIntel вообще. Вместо этого Вы могли просто сохранить это архив cpio как есть где-нибудь отдельно, затем распаковать второй (сжатый) архив, изменить дерево каталогов, и восстановить сжатый архив cpio, затем связать сохраненный архив микрокода с недавно сгенерированным.

(Код, который первоначально генерировал этот "предварительно ожидаемый" архив, найден в /usr/share/initramfs-tools/hooks/intel_microcode.)

2
ответ дан 16 November 2019 в 17:43

в 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
0
ответ дан 23 November 2019 в 05:43

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

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