我正在修改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 …
Run Code Online (Sandbox Code Playgroud)