Як упакувати initrd.img?


9

У оригіналі /boot/initrd.img- kernel_ver binwalk показана така структура:

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

Від 0 до 22528 байтів є архів CPIO, що містить лише програмне забезпечення GenuineIntel.bin у певній ієрархії папок.
З 22528 байтів є gzip archiwe містить відповідну файлову систему, і цей 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 Ви нарешті розумієте, про що я прошу?
ЕдіД

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 є одна файлова система gzipped, але в цій ситуації також є вбудована програма Intel в конкретній структурі папок, яку я хочу зберігати.

Щоб зберегти ту саму ієрархію папок, потрібно три кроки:

  1. Зробіть архів файлової системи CPIO за допомогою простого -o без формату newc у створеному раніше, наприклад. базова папка:

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

  2. Створіть належний архів із форматом newc , що містить ядро / 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


1
Чудово! Дякую! +10! Але як ви розпакуєте оригінал initrd?
Rth

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

@EdiD як ви розпакуєте оригінал initrd?
ImranRazaKhan

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
ЕдіД

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, а не дьоготь?" розділ

Чому cpio, а не дьоготь?

Це рішення було прийнято ще в грудні 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 з 1996 року:

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

Це не так популярно, як смола, оскільки для традиційних інструментів командного рядка 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 на дьогті приблизно настільки ж актуальна, як стандартизація Windows на zip. Linux також не є частиною, і вільний приймати власні технічні рішення.

4) Оскільки це внутрішній формат ядра, він може бути легко
новим. Ядро надає власні інструменти для створення та вилучення цього формату в будь-якому випадку. Використання існуючого стандарту було кращим, але не суттєвим.

5) Аль-Віро прийняв рішення (цитата: "дьоготь некрасивий як пекло і його не підтримуватимуть на стороні ядра"):

  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 на root у папці kernel / x86 / microcode і чому lzma, коли я говорю про gzip?
ЕдіД

lzma дає менший архів. використовуйте gzip, якщо бажаєте. Я не впевнений, чому ви стурбовані стисненням чи ні, повинні спрацьовувати добре при стисненні і призводити до отримання меншого зображення на диску. Не дуже впевнений, що ви намагаєтеся досягти з того, що ви розмістили.
Пантера

Я хочу знати, як це було зроблено спочатку. Можливо, вбудована програма Intel не стискається через швидку доступність.
ЕдіД

майже напевно був стиснутий, можна перевірити архів. Стиснення використовується за замовчуванням, оскільки це не помітно впливає на продуктивність.
Пантера

У посібнику cpio немає нічого про компресію. Перевірити прийняту відповідь: superuser.com/questions/343915/…
EdiD

3

Нещодавно я стикався з цим самим запитанням, і мої пошукові роботи в Інтернеті привели мене до цієї теми, тож, якщо це допомагає іншим, хто слідує цим крокам, ось відповідь 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.)


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.