快速业务通道

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

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

 一、init ramfs是什么

  在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系统,然后内核检查rootfs中是否包含有init文件,如果有则执行它,作为PID为1的第一个进程.这个init进程负责启动系统后续的工作,包括定位、挂载“真正的”根文件系统设备(如果有的话).如果内核没有在rootfs中找到init文件,则内核会按以前版本的方式定位、挂载根分区,然后执行/sbin/init程序完成系统的后续初始化工作.

  这个压缩过的cpio格式的打包文件就是init ramfs.编译2.6版本的linux内核时,编译系统总会创建init ramfs,然后把它与编译好的内核连接在一起.内核源代码树中的usr目录就是专门用于构建内核中的init ramfs的,其中的ini tramfs_data.cpio.gz文件就是init ramfs.缺省情况下,init ramfs是空的,X86架构下的文件大小是134个字节.

  二、构建第一个init ramfs:hello world

  从C语言开始,学习计算机编程语言的第一个程序几乎都是hello world,因此我们也构建一个最简单的hello world式的init ramfs,以说明init ramfs的基本构建方法.

  init ramfs的灵魂是init文件(或者叫程序,它会被内核第一个执行),我们先写一个简单的init程序,它会在内核的console中打印出经典的hello world信息.

  hello.c:

  #include

  #include

  int main(int argc,char argv[])

  {

  printf("hello world, from init ramfs.n");

  sleep(9999999);

  return 0;

  }

  其中的sleep()函数语句是为了避免执行时内核很快打出panic的信息,并非功能上的需要.

  接着把hello.c编译成静态连接程序:

  gcc -o hello_static -static -s hello.c

  命令行中的-s参数表示编译后的程序不包含调试定位信息,目的是减少编译出来的程序文件的大小.

  再创建一个init ramfs的构建源文件目录image,把hello_static程序拷入这个目录,并改名为init.

  在image目录下,创建一个dev/console的设备文件,否init程序无法在内核console中输出信息:

  mknod -m 600 dev/console c 5 1

  注意,执行这个命令需要有root权限.

  好了,现在可以设置内核配置参数,进行init ramfs的构建了:

  在general setup配置目录下的init ramfs sources配置项下输入image的路径名,比如我的路径就是/home/wyk/init ramfs-test/image.我们的init程序是ELF格式的,内核需要支持ELF的可执行文件,否则启动这个init程序会失败.在内核的 Executable file formats配置目录下,选择 kernel support for ELF binaries,则可使内核支持ELF格式的可执行文件.其他内核配置参数根据实际需要设置即可,不过,为了减少内核编译时间,可参考这篇文章http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-293122.html设置一个最简单的内核配置.

  内核配置参数设置完成后,按常规的内核编译方法进行编译,init ramfs就自动连接到编译好的内核映像文件中了.

  三、试验环境搭建

  试验init ramfs需要经常重启系统,使用CPU模拟器是不错的选择.我们可以选用qemu,它支持直接启动linux内核,无需在模拟器中安装OS.从方便使用的角度考虑,我们采用qemu launcher设置qemu的各项参数,它的安装可参考http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-612280.html.

  在qemu launcher的linux配置标签中,打勾直接启动linux,然后在下面的文本框中填上刚才编译好的内核映像文件的路径名.qemu的运行还需要设置硬盘映像文件,还需要在左边的配置标签中新建一个硬盘映像文件,但实际上我们并不使用硬盘.

  配置好qemu的参数后,点击launcher按钮,内核就开始在qemu中运行了.内核输出一堆内核运行信息后,打出了

  hello world, from init ramfs.

  哈哈,我们构建的init ramfs已经能够正常工作了!

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号