我是这个 Linux 内核的新手,我正在尝试从 USB 启动主板,并且成功了
现在我的问题是 USB 有两个文件 a) initramfs.cpio.xz b) linux.img
现在我需要解压这个 initramfs 并向这个文件系统添加一些文件,然后将其压缩回去
我在解压缩时遇到了问题,任何知道如何解压缩的人都会对我有很大帮助
谢谢
答案1
我遇到了同样的问题并根据以下方法解决如何查看、更改、重新创建 Linux initrd.img 文件。
首先,从 2.6 版开始(见这里) initrd 映像只是 initramfs(只是保留了名称)。然后,内核映像是一个简单的 gzip 文件,其中包含一个 cpio 存档(至少对于 debian 而言)。
文件格式
验证图像/启动(看起来像initrd.img.other_info, 例如 :初始化文件-4.9.0-8-686-pae)是 gzip 文件
file initrd.img-4.9.0-8-686-pae
>> initrd.img-4.9.0-8-686-pae: gzip compressed data, was "newinitrd", last modified: Sat Apr 27 10:03:57 2019, from Unix
即使扩展压缩由于缺少.gz在它的末尾(这意味着我们需要将文件转换为可识别的格式,以便进行解压缩)
解压缩
GZIP 部分
下一步是使用以下命令获取文件的正确形状:
mv initrd.img-4.9.0-8-686-pae initrd.img-4.9.0-8-686-pae.gz
请注意,只需重命名文件初始化文件-4.9.0-8-686-pae进入初始化文件.img-4.9.0-8-686-pae.gz没有效果。
然后使用适当的命令解压缩文件(此处针对 gzip 文件):
gunzip initrd.img-4.9.0-8-686-pae.gz
CPIO 部分
您将获得一个 cpio 档案(此处文件将保留相同的名称初始化文件-4.9.0-8-686-pae)
file initrd.img-4.9.0-8-686-pae
>> initrd.img-4.9.0-8-686-pae: ASCII cpio archive (SVR4 with no CRC)
然后将所有文件放入存档中,使用以下命令进入新文件夹:
cpio -id < ../initrd.img-4.9.0-8-686-pae
这就是解压部分的全部内容
压缩
编辑图像后,您需要再次压缩它。首先为所有这些文件创建一个 cpio 存档(仍然位于用于打开 cpio 存档的目录中)
find . | cpio --create --format='newc' > ../newInitrd
然后,使用以下命令压缩档案(在父目录中):
gzip newInitrd
最后:
mv newInitrd.gz newInitrd.img
(然后你只需要重命名新的初始化映像进入初始化文件-4.9.0-8-686-pae并将文件放入/启动)
答案2
initramfs 是一个 cpio 存档文件,可以选择使用 gzip、xz 或 bzip2 格式压缩。
根据您的情况,检查进行了哪种类型的压缩。压缩大多是 gzip。
$ file /boot/initrd.img-3.2.0-4-686-pae
/boot/initrd.img-3.2.0-4-686-pae: gzip compressed data, from Unix
如果是 gzip 压缩,请使用 gunzip 实用程序或任何其他适合该压缩格式的实用程序进行解压。解压后,使用cpio
实用程序提取档案。
$ cpio -id < initrd.img-3.2.0-4-686-pae
48843 blocks
该档案将包含启动期间所需的文件和目录。