以用户身份解压、修改和打包initrd

Dej*_*jwi 5 linux initrd cpio not-root-user

我在initrd以用户身份重建图像时遇到问题。首先,当我尝试“解压缩”原始initrd图像时:

cpio -idm < initrd-base 
cpio: dev/tty8: Cannot mknod: Operation not permitted
cpio: dev/tty3: Cannot mknod: Operation not permitted
cpio: dev/zero: Cannot mknod: Operation not permitted
cpio: dev/loop0: Cannot mknod: Operation not permitted
cpio: dev/loop4: Cannot mknod: Operation not permitted
cpio: dev/loop7: Cannot mknod: Operation not permitted
cpio: dev/loop5: Cannot mknod: Operation not permitted
cpio: dev/loop2: Cannot mknod: Operation not permitted
cpio: dev/tty9: Cannot mknod: Operation not permitted
cpio: dev/tty4: Cannot mknod: Operation not permitted
cpio: dev/null: Cannot mknod: Operation not permitted
cpio: dev/loop6: Cannot mknod: Operation not permitted
cpio: dev/loop1: Cannot mknod: Operation not permitted
cpio: dev/console: Cannot mknod: Operation not permitted
cpio: dev/loop3: Cannot mknod: Operation not permitted
cpio: dev/tty1: Cannot mknod: Operation not permitted
133336 blocks
Run Code Online (Sandbox Code Playgroud)

我怎样才能摆脱这些警告?

其次 - 我不确定文件所有权将如何处理。解压后,似乎一切都属于当前用户。

如何initrd重新包装之后看?我宁愿不改变标准访问权限。

Gil*_*il' 6

由于您使用的是 cpio,因此您实际上是在制作initramfs,而不是initrd。initrd 将存储为文件系统映像,而不是 cpio 存档。initrd 和 initramfs 在 Linux 启动过程中的作用类似,提供一些在真正的根文件系统之前可用的文件(用于挂载真正的根文件系统);它们在引擎盖下以不同的方式处理,但这在这里无关紧要。initrd 较旧,有些不推荐使用 initramfs。许多构建系统仍然使用文件名,initrd即使它们已将内容切换到 initramfs。

根映像通常包含需要特定权限的设备节点和文件。该cpio命令只能根据文件系统中存在的文件生成存档,并且您需要 root 权限才能创建属于 root 的设备节点或文件。内核源代码包含一个工具usr/gen_init_cpio和一个包装脚本scripts/gen_initramfs_list.sh,它们被精确地提供来生成 initramfs,而无需在文件系统上创建所有文件,从而无需任何特权即可生成 initramfs。这些程序记录在内核源代码树中的Documentation/filesystems/ramfs-rootfs-initramfs.txt和 中Documentation/early-userspace/README

构建 initramfs 的常规方法ramfs-rootfs-initramfs.txt在“填充 initramfs”一节中描述。您编写一个文本文件,其中包含要使用其类型(目录、常规、设备节点等)、权限和其他属性创建的路径列表。对于常规文件,您可以提供包含内容的本地文件的名称。然后usr/gen_init_cpio在这个文件上运行。构建内核时,如果将CONFIG_INITRAMFS_SOURCE选项设置为文件名,则会通过调用usr/gen_init_cpio该文件生成 initramfs 。

如果您已经有一个 initramfs 映像并想要修改它,请使用cpio -tv列出它,并根据它重建 ramfs 描述文件。如果可能,从原始内核源获取 initramfs 描述文件,以节省您的工作。仅在某个目录中提取常规文件的内容。然后修改regular文件和ramfs描述文件,最后运行usr/gen_init_cpio生成新的initramfs。


Dej*_*jwi 1

感谢您的回答,它们很有用,但我找到了自己的解决方案。

重新创建 initrd 映像可以使用 fakeroot-ng 来完成(也可能使用 fakeroot)。

该工具的基本思想是包装所有系统调用,因此在 fakeroot 环境中执行的所有程序都认为它们是由 root 运行的。

我在 fakeroot 环境中调用部分脚本 - 解压 initramfs,执行所有更改并再次打包。

所有权限均已正确设置,root 是所有文件的所有者。

fakeroot-ng 位于: http: //fakeroot-ng.lingnu.com/index.php/Home_Page