快速业务通道

精通init ramfs构建step by step (五)

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-11

十七、配置内核支持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用户或有"/"目录的写权限,那么展开的文件就有可能覆盖同名的文件(在文件修改时间新于原有文件),那就糟糕了!


展开文件前,你可能会想先看看打包文件里都有哪些文件,这时就要用 -t 选项了.例如,我们想看看内核编译时生成的init ramfs_data.cpio.gz中都有哪些文件,我们就可以用下面的命令:

  zcat ini tramfs_data.cpio.gz | cpio -t

  在标准输出中打出文件名列表.

  使用 -v 选项可以在cpio命令执行时输出详细信息:在打包或展开文件时,输出已处理的文件名;与 -t 选项连用时,则显示文件的详细信息,类似 ls -l 的输出内容.-V 选项则用打点的方式,显示cpio命令的执行进度信息,一个点代表处理一个文件.


凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号