将文件附加到 initramfs 映像 - 可靠吗?

Emi*_*azo 8 boot kernel initramfs cpio

我正在修改initramfs来自不同 Linux 发行版的一堆档案,其中通常只更改一个文件。

我想在不切换到 root 用户的情况下自动执行该过程以提取initramfs图像中的所有文件并再次打包它们。

首先,我尝试在gen_init_cpio 提取initramfs存档中的所有内容的情况下生成文件列表,即通过脚本解析cpio -tvn initrd.img(如ls -l输出)的输出,该脚本将所有权限更改为八进制并将输出排列为所需的格式gen_init_cpio,例如:

dir /dev 755 0 0
nod /dev/console 644 0 0 c 5 1
slink /bin/sh busybox 777 0 0
file /bin/busybox initramfs/busybox 755 0 0
Run Code Online (Sandbox Code Playgroud)

这涉及一些替换,脚本可能很难为我编写,所以我找到了一个更好的方法,我在问它的​​安全性和便携性如何:

在某些发行版中,我们有一个initramfs包含连接部分的文件,显然内核会解析整个文件,提取打包在 1 字节边界中的所有部分,因此无需将每个部分填充为 512 字节的倍数。我认为这个“功能”对我来说很有用,可以避免在修改其中的文件时重新创建存档。确实它有效,至少对于DebianCloneZilla

例如,如果我们/initinitrd.gzDebian 8.2.0上修改了文件,我们可以将其附加到initrd.gz图像中:

$ echo ./init | cpio -H newc -o | gzip >> initrd.gz
Run Code Online (Sandbox Code Playgroud)

所以initrd.gz有两个串联的档案,原始的和它的修改。让我们看看结果binwalk

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             gzip compressed data, maximum compression, has original file name: "initrd", from Unix, last modified: Tue Sep  1 09:33:08 2015
6299939       0x602123        gzip compressed data, from Unix, last modified: Tue Nov 17 16:06:13 2015
Run Code Online (Sandbox Code Playgroud)

它完美地工作。但它可靠吗?将数据附加到initfamfs文件时,我们有哪些限制?在不将原始存档填充到 512 字节的倍数的情况下追加是否安全?此功能支持哪个内核版本?

cas*_*cas 11

它非常可靠,所有支持 initrd、AFAIK 的内核版本都支持它。这是组成cpio档案的一个特征initramfscpio只是继续提取其输入....我们可能知道该文件是一个接一个的两个 cpio 存档,但 cpio 只是将其视为单个输入流。

Debian 建议使用这种方法(将另一个 cpio 附加到 initramfs)将二进制 blob 固件添加到他们的安装程序 initramfs。例如:

DebianInstaller / NetbootFirmware | Debian 维基

Initramfs 本质上是由 gzip 压缩的 cpio 档案串联而成,这些档案被提取到一个 ramdisk 中,并被 Linux 内核用作早期的用户空间。Debian 安装程序的 initrd.gz 实际上是一个单独的 gzipped cpio 存档,其中包含安装程序在启动时需要的所有文件。通过简单地附加另一个 gzip 压缩的 cpio 存档 - 包含我们丢失的固件文件 - 我们可以在路上看到节目!