快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

精通initramfs构建stepbystep(五)

    十七、配置内核支持initrd

  到目前为止,我们的init ramfs都由内核编译系统生成的,并链接到内核中。其实我们也可以用cpio命令生成单独的init ramfs,与内核编译脱钩,在内核运行时以initrd的形式加载到内核,以增加灵活性。

  首先配置内核使用单独的initrd:在 Device Driver / Block device / 配置目录下,选择 RAM filesystem and RAMdisk ( init ramfs/initrd ) support 配置项;再到 General Setup 配置目录项下,将 init ramfs source file(s) 配置项原有的内容清空。然后把内核源码树的usr目录下已由内核编译生成的init ramfs文件initramfs_data.cpio.gz拷贝到 ~/initramfs-test 目录下,我们先直接用这个文件试验一下 initrd 方式的init ramfs的效果。最后,执行make命令重新编译内核后,在QEMU试验环境中,把initrd配置框(linux配置框的下面)的内容写为 ~/init ramfs-test/init ramfs_data.cpio.gz,指定initrd的文件路径。

  好了,试验一下新的initrd方式的init ramfs吧,效果跟先前的完全一样。

  十八、用cpio命令生成init ramfs

  cpio命令有三种操作模式:copy-out、copy-in、copy-pass,生成init ramfs用的是它的copy-out模式,即把文件打包的操作模式。cpio的copy-out操作模式使用 -o 命令行选项指定。缺省情况下,cpio从标准输入读取输入数据,向标准输出写入输出数据。使用 -I 选项可以指定文件名代替标准输入,使用 -O 选项可以指定文件名代替标准输出,而 -F 选项指定的文件名则根据cpio操作模式的不同可代替标准输入或标准输出。

  把~/init ramfs-test/image目录下的文件打包成init ramfs,执行下面的命令:

  find . | cpio -o -H newc | gzip > ../image.cpio.gz

  命令执行完毕后,在~/init ramfs-test目录下就会生成文件名为imgae.cpio.gz的init ramfs。

  上面cpio命令的 -H 选项指定打包文件的具体格式,要生成init ramfs,只能用newc 格式,如果使用其他格式,内核会打出这样的出错信息:Unpacking init ramfs...<0> kernel panic - not syncing: no cpio magic

  在QEMU试验环境下试验一下新的initrd方式的init ramfs,效果跟先前的完全一样。

  十九、cpio命令的其他用法

  如果我们要解开一个cpio格式的打包文件,则要使用cpio命令的copy-in操作模式。cpio的copy-out操作模式使用 -i 命令行选项指定。例如,我们想把前一步从内核源码树 usr目录下拷贝的init ramfs_data.cpio.gz 展开到~/init ramfs-test/init ramfs_data目录下,则使用下列命令:

  mkdir ~/init ramfs-test/init ramfs_data

  cd ~/init ramfs-test/init ramfs_data

  cpio -i -F ../init ramfs_data.cpio.gz --no-absolute-filename

  命令执行完毕后,init ramfs_data目录下出现多个目录和文件,用diff命令比较init ramfs_data与image目录,两者的完全一样。

  上面cpio命令的 --no-absolute-filename 选项的作用是展开文件时,去掉文件路径最前面的"/",把绝对路径名变为相对路径名。内核编译时生成的init ramfs使用了绝对路径名,所以这个选项必须使用,否则init ramfs内文件展开到"/"目录去了,如果你是root用户或有"/"目录的写权限,那么展开的文件就有可能覆盖同名的文件(在文件修改时间新于原有文件),那就糟糕了!

 [2] 下一页

顶(0)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论