一、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已经能够正常工作了!

转载于:https://www.cnblogs.com/linengier/archive/2013/03/30/2990293.html

精通init ramfs构建相关推荐

  1. 前端-Vue.js从入门到精通基础笔记(理论+实操+知识点速查)

    #[2022.3]尚硅谷Vue.js从入门到精通基础笔记(理论+实操+知识点速查) 前言 本文完全基于 参考资料:加工整理而成,包括其代码,案例,资源等.前置知识是学习尚硅谷的视频教程,本文配合其教程 ...

  2. 微信小程序使用npm 进行下载构建组价

    1.进入小程序根目录 构建前微信小程序目录 使用npm 初始化命令进行初始化小程序目录 npm init -y 构建后的目录为 构建完成后 如何进行使用 {"usingComponents& ...

  3. Linux的init进程(内核态到用户态的变化)

    init进程,也就是内核启动3个进程中的进程1: init进程完成了从内核态向用户态的转变: (1)init进程是比较特殊,一个进程两个状态,init刚开始运行时是内核态,他属于内核线程,然后他自己运 ...

  4. init进程(即进程1,或者说linuxrc)的详解

    以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.init进程详解1 1.init进程完成了从内核态向用户态的转变 (1)一个进程先后两种状态 init进程刚开始运行的时候是内核态,它属 ...

  5. loading linux img2a,嵌入式Linux中initrd的应用--浅析ramdisk、ramfs、initrd和initramfs

    看到这样的一句话很让我费解,因为似乎我理解为这样做能够提高一点嵌入式linux启动速度,我对此是非常地感兴趣 自此,就开始了我的解惑之旅 首先需要知道的是ramdisk和ramfs http://ww ...

  6. mysql 镜像备份_手动构建percona-xtrabackup Docker镜像,并实现mysql数据备份

    由于最近项目比较多,并且都需要自己部署运维Mysql,为了保证mysql数据的安全,那么数据备份就必不可少了.之前做mysql数据备份的时候,都是使用的xtrabackup,所以这次也不例外,由于需要 ...

  7. 前端框架vue3的node安装及项目构建的4种方法

    前端框架vue3的node安装及项目构建的4种方法 C:\Users\Mac\Documents\newlifewyq\技术精英-source\vue\vue3pro>cnpm install ...

  8. dockerfile构建一个(python+flask+html)镜像 + 上传到阿里云私有仓库 + 部署到k8s---全过程

    前言 因为之前根据一些网上的教程一个个部分实践过整个部署流程,但都是根据现有的程序/ymal文件等进行创建部署,未能根据自己特定的项目进行部署.因此,这篇博文,打算完整部署一个自己编写的python+ ...

  9. 量化交易 米筐 构建一个完整策略

    实现第一个股票策略 1.选股简单介绍 选择某些表现比较好的股票作为股票池,从中进行交易的判断或者直接购买. 2.需求 选股:获取市盈率大于50且小于65,营业总收入前10的股票 调仓:每日调仓,将所有 ...

最新文章

  1. Docker(一):这可能是最为详细的Docker入门总结
  2. copy()与deepcopy()
  3. BSCI—8-(2):OSPF的特殊区域类型与配置
  4. 6.QT信号槽的时序分析
  5. 单板计算机倍受欢迎 廉价的ARM计算机能干嘛
  6. opsforhash 过期时间_药品过期还能吃吗?本文带你秒懂药品有效期~
  7. UGUI_使用DoTween
  8. Python二级笔记(2)
  9. python cookbook 小结
  10. 「Python 编程」编码实现网络请求库中的 URL 解析器
  11. 【RGB检测】基于matlab GUI图像RGB检测【含Matlab源码 088期】
  12. 7个简单步骤解释区块链挖掘和交易如何工作
  13. PHP 51tracking物流单个查询接口调用
  14. 企业如何进行客户细分 客户细分的方法和类型
  15. Android消息传递机制总结
  16. Farpoint Spread 单元格中嵌入下拉多选框
  17. 突破圈层,个体崛起,欢迎想突破自己的你
  18. 计算机网络——知识点超详细总结
  19. 字节程序媛:大厂技术岗求职流程解读经验分享,这是一份保姆级校招攻略
  20. cdr 表格自动填充文字_10万设计师好评的CDR最强插件,甩掉繁琐,拥抱简单

热门文章

  1. $(document).ready() 和 window.onload 方法比较
  2. java.logging的重定向?
  3. java工程转maven工程_将java工程转换为Maven工程
  4. python3:(unicode error) 'utf-8' codec can't decode
  5. vue项目实现登录(sessionStorage 存储 token)
  6. centos8 linux部署node项目
  7. mysql 聚簇索引和非聚簇索引_图文并茂,说说MySQL索引
  8. linux chattr 无权限,从零开始学习Linux(二十八):文件权限之chattr权限
  9. 【JSON系列】JSON核心知识点总结
  10. c语言错误重定义,C语言的重定义错误求解