精通init ramfs构建
一、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构建相关推荐
- 前端-Vue.js从入门到精通基础笔记(理论+实操+知识点速查)
#[2022.3]尚硅谷Vue.js从入门到精通基础笔记(理论+实操+知识点速查) 前言 本文完全基于 参考资料:加工整理而成,包括其代码,案例,资源等.前置知识是学习尚硅谷的视频教程,本文配合其教程 ...
- 微信小程序使用npm 进行下载构建组价
1.进入小程序根目录 构建前微信小程序目录 使用npm 初始化命令进行初始化小程序目录 npm init -y 构建后的目录为 构建完成后 如何进行使用 {"usingComponents& ...
- Linux的init进程(内核态到用户态的变化)
init进程,也就是内核启动3个进程中的进程1: init进程完成了从内核态向用户态的转变: (1)init进程是比较特殊,一个进程两个状态,init刚开始运行时是内核态,他属于内核线程,然后他自己运 ...
- init进程(即进程1,或者说linuxrc)的详解
以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除. 一.init进程详解1 1.init进程完成了从内核态向用户态的转变 (1)一个进程先后两种状态 init进程刚开始运行的时候是内核态,它属 ...
- loading linux img2a,嵌入式Linux中initrd的应用--浅析ramdisk、ramfs、initrd和initramfs
看到这样的一句话很让我费解,因为似乎我理解为这样做能够提高一点嵌入式linux启动速度,我对此是非常地感兴趣 自此,就开始了我的解惑之旅 首先需要知道的是ramdisk和ramfs http://ww ...
- mysql 镜像备份_手动构建percona-xtrabackup Docker镜像,并实现mysql数据备份
由于最近项目比较多,并且都需要自己部署运维Mysql,为了保证mysql数据的安全,那么数据备份就必不可少了.之前做mysql数据备份的时候,都是使用的xtrabackup,所以这次也不例外,由于需要 ...
- 前端框架vue3的node安装及项目构建的4种方法
前端框架vue3的node安装及项目构建的4种方法 C:\Users\Mac\Documents\newlifewyq\技术精英-source\vue\vue3pro>cnpm install ...
- dockerfile构建一个(python+flask+html)镜像 + 上传到阿里云私有仓库 + 部署到k8s---全过程
前言 因为之前根据一些网上的教程一个个部分实践过整个部署流程,但都是根据现有的程序/ymal文件等进行创建部署,未能根据自己特定的项目进行部署.因此,这篇博文,打算完整部署一个自己编写的python+ ...
- 量化交易 米筐 构建一个完整策略
实现第一个股票策略 1.选股简单介绍 选择某些表现比较好的股票作为股票池,从中进行交易的判断或者直接购买. 2.需求 选股:获取市盈率大于50且小于65,营业总收入前10的股票 调仓:每日调仓,将所有 ...
最新文章
- Docker(一):这可能是最为详细的Docker入门总结
- copy()与deepcopy()
- BSCI—8-(2):OSPF的特殊区域类型与配置
- 6.QT信号槽的时序分析
- 单板计算机倍受欢迎 廉价的ARM计算机能干嘛
- opsforhash 过期时间_药品过期还能吃吗?本文带你秒懂药品有效期~
- UGUI_使用DoTween
- Python二级笔记(2)
- python cookbook 小结
- 「Python 编程」编码实现网络请求库中的 URL 解析器
- 【RGB检测】基于matlab GUI图像RGB检测【含Matlab源码 088期】
- 7个简单步骤解释区块链挖掘和交易如何工作
- PHP 51tracking物流单个查询接口调用
- 企业如何进行客户细分 客户细分的方法和类型
- Android消息传递机制总结
- Farpoint Spread 单元格中嵌入下拉多选框
- 突破圈层,个体崛起,欢迎想突破自己的你
- 计算机网络——知识点超详细总结
- 字节程序媛:大厂技术岗求职流程解读经验分享,这是一份保姆级校招攻略
- cdr 表格自动填充文字_10万设计师好评的CDR最强插件,甩掉繁琐,拥抱简单
热门文章
- $(document).ready() 和 window.onload 方法比较
- java.logging的重定向?
- java工程转maven工程_将java工程转换为Maven工程
- python3:(unicode error) 'utf-8' codec can't decode
- vue项目实现登录(sessionStorage 存储 token)
- centos8 linux部署node项目
- mysql 聚簇索引和非聚簇索引_图文并茂,说说MySQL索引
- linux chattr 无权限,从零开始学习Linux(二十八):文件权限之chattr权限
- 【JSON系列】JSON核心知识点总结
- c语言错误重定义,C语言的重定义错误求解