如何重新打包initrd.img?


9

在原始的/boot/initrd.img-上,kernel_ver binwalk显示了以下结构:

在此处输入图片说明

022528字节,CPIO存档仅包含特定文件夹层次结构中的GenuineIntel.bin固件。
22528字节开始,存在一个gzip档案,其中包含适当的文件系统,并且该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存档的串联。

Answers:


4

我想出了如何制作完全相同的initrd.img存档。

Bodhi.zazen答案可能会起作用,因为这是众所周知的解决方案:

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

但问题不同。如果在cpio归档文件中有一个gzip压缩的文件系统,但在这种情况下,我还想保留特定文件夹结构中的Intel固件,那么此答案将很好。

要保持相同的文件夹层次结构,需要三个步骤:

  1. 使用简单的-o选项使CPIO文件系统归档,而在创建之前没有newc格式。基本文件夹:

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

  2. 使用包含kernel / x86 / microcode / GenuineIntel.bin的newc格式进行适当的归档:

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

  3. 将gzip压缩的文件系统存档添加到适当的new_initrd.img中:

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


1
大!谢谢!+10!但是,您如何解压缩原始的initrd?
18th

另外,您的解决方案会创建一些不同的结构。我有在binwalk绝对相同tructure当我做的步骤(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,您指定了在grub引导时使用的initrd。

我建议您在移动或重命名它之前测试(引导)自定义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年12月做出的。讨论从这里开始:

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

并从此处开始生成第二个线程(特别是在tar vs cpio上):

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

快速而肮脏的摘要版本(不能替代阅读上面的线程)是:

1)cpio是标准。它已有几十年的历史(从AT&T时代开始),并且已经在Linux上广泛使用(在Red Hat的设备驱动程序磁盘RPM内部)。这是一篇关于1996年的Linux Journal文章:

  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)在tar上标准化的GNU项目与在zip上标准化的Windows大致相关。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代码。


这将不会保留文件夹结构。我想要与原始initrd.img相同的结构。含义-> GenuineIntel.bin不压缩,只是用cpio存档在root / x86 / microcode文件夹中的根目录下,为什么在我谈论gzip时使用lzma?
EdiD '16

lzma提供了一个较小的存档。如果需要,请使用gzip。我不确定您是否关心压缩,压缩后是否可以正常工作,并导致磁盘上的映像较小。不太确定要根据发布的内容完成什么。

我想知道它最初是如何完成的。可能是因为更快的可访问性,英特尔固件未压缩。
EdiD '16

几乎可以肯定已压缩,可以检查存档。默认情况下使用压缩,因为它不会明显影响性能。

cpio手册中没有关于压缩的任何内容。检查接受的答案:superuser.com/questions/343915/...
EDID

3

我最近遇到了同样的问题,我的网络搜索将我带到了这个话题,因此如果它可以帮助其他人跟随这些脚步,这是一个古老问题的2018年答案...

在“最近”的内核中,initrd.img文件似乎可以包含未压缩的cpio存档(即,包含微代码更新),该存档之前是包含常规initramfs目录树的(压缩的)cpio存档。

在Debian Wiki页面中对此进行了简要讨论:
https : //wiki.debian.org/initramfs#How_to_inspect_initramfs
,但是可以通过splitinitramfs()以下unmkinitramfs命令中的函数找到通过这种initrd.img文件进行解析的更精确的代码。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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.