Initramfs应用问题记录

因为想把升级应用和内核做到一个Image中,所以打算采用Initramfs。

先准备root文件系统,比如到/home/qianjiang/tmp/initramfs目录下。

通过kernel menuconfig打开CONFIG_BLK_DEV_INITRD,
并且设置CONFIG_INITRAMFS_SOURCE="/home/qianjiang/tmp/initramfs/",

通过调试理解如下:
内核编译时,通过CONFIG_INITRAMFS_SOURCE指定的目录生成cpio文件(所以也可以直接指定cpio文件而不是指定目录)。
内核在初始化启动的时候会先注册一个rootfs的文件系统,然后通过rootfs_initcall来生成其中的内容。
A. 当CONFIG_BLK_DEV_INITRD未选中时,rootfs_initcall调用noinitramfs.c中的default_rootfs()来生成。
B. 如果选中时:
rootfs_initcall调用initramfs.c中的populate_rootfs()函数来填充。
static int __init populate_rootfs(void)
{
        char *err = unpack_to_rootfs(__initramfs_start, __initramfs_end - __initramfs_start, 0);
         if (initrd_start) {  
                  err = unpack_to_rootfs((char *)initrd_start, initrd_end ...
                  fd = sys_open("/initrd.p_w_picpath", O_WRONLY|O_CREAT, 0700);
                  if (fd >= 0) {
                           sys_write(fd, (char *)initrd_start, initrd_end - initrd_start);
                  }
         }
         ......
}

[__initramfs_start,__initramfs_end]指定了一个cpio包的位置,
A.1 如果设置了CONFIG_INITRAMFS_SOURCE,即我们目录对应的cpio数据包。
B.1 如果未设置,对应一个默认的cpio数据包,由内核编译时生成,和default_rootfs()生成的内容类似。

没有设置的情况,需要通过比如cmdline指定[initrd_start, initrd_end],该数据段被写入文件,/initrd.p_w_picpath(见上面的函数)。

接下来调用prepare_namespace(),调用initrd_load(),然后rd_load_p_w_picpath()对initrd.p_w_picpath进行解压(可以是gz, cramfs等)。

然后mount_root()把设备挂载到/root下面。

注意:系统在启动的时候,完成了cpio到rootfs的填充后,会检查是否存在/init,如果该文件不存在,则调用prepare_namespace()来挂载文件系统。

上述内容参考了:
http://liaowb1234.blog.163.com/blog/static/771555472010025114231594/
另外一个好的链接参考http://en.gentoo-wiki.com/wiki/Initramfs
确实写得很详细。

在/init脚本的书写时出了些问题
. Kernel panic - not syncing: Attempted to kill init!
/init 脚本写得有问题
---------------------------
#!/bin/busybox sh
/bin/echo hello
---------------------------
改成如下:
---------------------------
#!/bin/busybox
---------------------------
竟然好了,而且直接进入shell。
查看/proc/1/cmdline
发现是/bin/busybox init

?还有些疑惑

转载于:https://blog.51cto.com/jiangjqian/409645

Initramfs应用问题记录相关推荐

  1. initramfs两种方法恢复_微信会话记录删除了怎么恢复?最权威的方法在这

    随着手机软件的不断更新以及长时间使用,占用的手机内存也开始越来越大,我们只能通过清理手机内存来释放多余的空间了.如果我们在清理微信的时候删除了聊天记录,那后面有需要的时候该怎么找回呢?很多朋友都会上百 ...

  2. 解决Ubuntu16.04重启进入initramfs

    一直没有关机的习惯,有半个月没有来实验室,今天试图重装pycharm的时候遇到"磁盘写保护"问题,于是选择暴力重启,结果重启的时候进入initramfs,导致无法开机. 估计以后还 ...

  3. Ramfs、rootfs 和initramfs

    Ramfs, rootfs and initramfs - The Linux Kernel documentationhttps://www.kernel.org/doc/html/latest/f ...

  4. 【备份】使用ubuntu一个月,记录的问题和解决方案

    随手记录 50.推荐Ubuntu神器:Utools 49.推荐网页快捷键操作神器:Vimium 48.vnc扩展屏幕 设置扩展 鼠标移动 47.输入法 sudo gedit clion 不跟随光标 4 ...

  5. Ubuntu14.04+cuda6.5+opencv2.4.9+caffe配置记录

    从4月5日差不多开始安装,到今天4月15日,快两个星期了.如果加上之前自己看点Linux的时间,这折腾的有两个星期(半个月了).哎,快装好了,我也快崩溃了,真的想放弃的时候,突然找到个博客,好像照它的 ...

  6. 【非原创】Ubuntu14.04+cuda6.5+opencv2.4.9+caffe配置记录

    Ubuntu14.04+cuda6.5+opencv2.4.9+caffe配置记录 从4月5日差不多开始安装,到今天4月15日,快两个星期了.如果加上之前自己看点Linux的时间,这折腾的有两个星期( ...

  7. liunx启动时:initramfs unpacking failed:write error

    阅读前请看一下:我是一个热衷于记录的人,每次写博客会反复研读,尽量不断提升博客质量.文章设置为仅粉丝可见,是因为写博客确实花了不少精力.希望互相进步谢谢!! 文章目录 阅读前请看一下:我是一个热衷于记 ...

  8. Ubuntu 开机显示 initramfs 进不了系统

    通常出现进入initramfs,是因为关机不当导致磁盘文件受损还是什么引起的,所以:我们要把主分区修复! 1.可参照此命令,在随后的多个确认对话框中输入:y fsck -t ext4 /dev/sda ...

  9. initramfs学习

    (一)hello world 一.initramfs是什么 在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系 ...

最新文章

  1. 如何获取元素在父级div里的位置_前端面试题--元素的BFC特性和实例
  2. 网页简单配置捉取网购信息
  3. 【Java每日一题】20161128
  4. OpenStack 多节点纳管 vCenter 5.5
  5. 关于jQuery的$.getJSON乱码问题
  6. Sony如何启动微型计算机,索尼笔记本怎么进入bios 索尼VAIO笔记本进入bios技巧
  7. python3 解析html_Python3.x网页抓取HTMLParser
  8. 第三次学JAVA再学不好就吃翔(part16)--方法及方法重载
  9. 在你做推荐系的过程中都遇到过什么坑?
  10. Java 1.2.4 文件输入输出时——文件的位置
  11. 阿里 90 后科学家研发,达摩院开源新一代 AI 算法模型
  12. 有商在线进销存成功案例
  13. java对接微信公众号
  14. 使用Java编写一个简单的Web的监控系统cpu利用率,cpu温度,总内存大小
  15. HTTP代理的代理形式
  16. Google 创始人
  17. unity Maya中模型动画可能存在的问题总结
  18. UGUI事件系统——事件接口
  19. 开放存取知识库及其数据采集规范的研究
  20. win10用户查看系统激活码方式

热门文章

  1. 【AS3 Coder】任务七:初涉PureMVC——天气预报功能实现
  2. 从“在winform里打开网页功能”引发的问题探究
  3. Linux内存实际使用率
  4. 数据库设计中一个矛盾:数据库外键,用还是不用?你怎么看.?
  5. git 创建webpack项目_近期总结:手动搭建react项目,将项目从自己的库引入到新的项目中使用...
  6. Golang 笔记 2 函数、结构体、接口、指针
  7. poj2240 最短路判环
  8. Drawing with GoogLeNet
  9. linux(Centos5.1)升级至2.6.19内核+L7实现-- 续限P2P软件
  10. 在asp.net如何取得ActiveDirectory域中用户的信息,比如工号,邮件地址等等