На оригинальном /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
:
Это совершенно другая структура.
find . | cpio --quiet --dereference -o -H newc | lzma -7 > ../cusotm.initrd.lz
Если эта процедура не работает, уточните, какие команды вы выполняли, а какие - нет.Ответы:
Я разобрался, как сделать точно такой же
initrd.img
архив.Ответ Bodhi.zazen, вероятно, будет работать, потому что это общеизвестное решение:
но вопрос был в другом. Этот ответ был бы хорош, если в архиве cpio есть одна gzip-файловая система, но в этой ситуации есть также прошивка Intel в определенной структуре папок, которую я хочу сохранить.
Чтобы сохранить ту же иерархию папок, необходимо выполнить три шага:
источник
find . | cpio -o | gzip -9 >> new_initrd.img
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
Вы переупаковываете с
Вторая команда переименовывает 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?" раздел
источник
Недавно я столкнулся с тем же вопросом, и мой поиск в Интернете привел меня к этой теме, поэтому в случае, если это поможет другим, идущим по этим шагам, вот ответ 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
.)источник
в Ubuntu файл
initrd.img
сжимается в gzip, я хотел бы сохранить это при редактировании. вот как:экстракт:
компресс:
источник