我作为用户重建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
我怎样才能摆脱这些警告?
其次 – 我不确定如何处理文件所有权.解压后,似乎一切都属于当前用户.
重新包装后,initrd将如何看待?我宁愿不改变标准访问权限.
解决方法:
由于你使用的是cpio,你实际上是在制作initramfs,而不是initrd. initrd将存储为文件系统映像,而不是cpio存档. Initrd和initramfs在Linux启动过程中具有类似的作用,提供一些在真正的根文件系统之前可用的文件(用于挂载真正的根文件系统);它们在引擎盖下以相当不同的方式处理,但这与此无关. Initrd较旧,有些不赞成使用initramfs.许多构建系统仍然使用文件名initrd,即使它们已将内容切换为initramfs.
根映像通常包含设备节点和需要特定权限的文件. cpio命令只能根据文件系统中存在的文件生成存档,并且您需要root权限才能创建属于root的设备节点或文件.内核源代码包含一个工具usr / gen_init_cpio和一个包装脚本脚本/ gen_initramfs_list.sh,这些脚本只是为了生成initramfs而不必在文件系统上创建所有文件,从而生成initramfs而不需要任何权限.这些程序记录在内核源代码树中,在Documentation/filesystems/ramfs-rootfs-initramfs.txt
和Documentation/early-userspace/README
中.
构建initramfs的常规方法在“填充initramfs”部分的ramfs-rootfs-initramfs.txt中进行了描述.您编写一个文本文件,其中包含要使用其类型(目录,常规,设备节点等),权限和其他属性创建的路径列表.对于常规文件,您可以使用内容指定本地文件的名称.然后在此文件上运行usr / gen_init_cpio.构建内核时,如果将CONFIG_INITRAMFS_SOURCE选项设置为文件名,则通过在该文件上调用usr / gen_init_cpio来生成initramfs.
如果您已有initramfs映像并想要修改它,请使用cpio -tv列出它,并根据它重新构建ramfs描述文件.如果可能,从原始内核源获取initramfs描述文件,以节省您的工作.仅在某个目录中提取常规文件的内容.然后修改常规文件和ramfs描述文件,最后运行usr / gen_init_cpio以生成新的initramfs.