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
重新包装之后看?我宁愿不改变标准访问权限。
由于您使用的是 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。
感谢您的回答,它们很有用,但我找到了自己的解决方案。
重新创建 initrd 映像可以使用 fakeroot-ng 来完成(也可能使用 fakeroot)。
该工具的基本思想是包装所有系统调用,因此在 fakeroot 环境中执行的所有程序都认为它们是由 root 运行的。
我在 fakeroot 环境中调用部分脚本 - 解压 initramfs,执行所有更改并再次打包。
所有权限均已正确设置,root 是所有文件的所有者。
fakeroot-ng 位于: http: //fakeroot-ng.lingnu.com/index.php/Home_Page
归档时间: |
|
查看次数: |
11697 次 |
最近记录: |