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 字节的倍数。我认为这个“功能”对我来说很有用,可以避免在修改其中的文件时重新创建存档。确实它有效,至少对于Debian
和CloneZilla
。
例如,如果我们/init
在initrd.gz
Debian 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
档案的一个特征initramfs
。 cpio
只是继续提取其输入....我们可能知道该文件是一个接一个的两个 cpio 存档,但 cpio 只是将其视为单个输入流。
Debian 建议使用这种方法(将另一个 cpio 附加到 initramfs)将二进制 blob 固件添加到他们的安装程序 initramfs。例如:
DebianInstaller / NetbootFirmware | Debian 维基
Initramfs 本质上是由 gzip 压缩的 cpio 档案串联而成,这些档案被提取到一个 ramdisk 中,并被 Linux 内核用作早期的用户空间。Debian 安装程序的 initrd.gz 实际上是一个单独的 gzipped cpio 存档,其中包含安装程序在启动时需要的所有文件。通过简单地附加另一个 gzip 压缩的 cpio 存档 - 包含我们丢失的固件文件 - 我们可以在路上看到节目!