以前一直在使用image-initrd的格式,也就是Linux

2.4内核当中所使用的格式,即便在升级到2.6内核以后,也依然如此,虽然2.6内核开始支持新的cpio-initrd格式。最近开始转向cpio-

initrd的格式了,这种格式有不少好处,例如不需要事先生成一个block文件并对其进行格式化,也不必担心这个block文件在使用过程中会不够用

而不得不重新制作,也不会因为这个block文件被反复改变以后导致压缩性能下降,好处真的是蛮多。当然也有坏处,呵呵,以往image-initrd只

需要把一些准备工作做好,挂载真实根文件系统的工作可以由内核来完成(当然也可以骗过内核不用内核挂载),而在cpio-initrd当中,执行

cpio-initrd下的init就是内核做的最后一件事情了,挂载真实根文件系统以及执行/sbin/init都要由cpio-initrd下的

init来完成,包括根切换,任务更重了。

好在这都不算什么难事,不过有一个事情却很让人疑惑。在使用image-initrd格式时,initrd.img当中的内容是被展开到/dev

/ram0当中的,在挂载真实文件系统时,可以通过pivot_root进行根切换,并将原来/dev/ram0当中的内容挂载到新根下的某个目录上,此

时在新的根目录内还可以访问到initrd.img当中的内容,也可以用umount把所占据的资源释放。而使用cpio-initrd格式时,这一点就

完全不同了,cpio-initrd的img在展开时并不依赖于设备文件,即与/dev/ram0无关,其内容是直接存放于rootfs当中,在切换到新

的根目录下时,无法使用pivot_root。在mount新根文件系统时,原cpio-initrd当中的内容将无法再访问到,于是原cpio-

initrd所占用的空间将无法收回。

如何解决这个问题?其实在Linux内核Documentation/filesystems/ramfs-rootfs-initramfs.txt当

中已经有相关的描述,而我们通常使用的由系统自带的(2.6内核)initrd.img当中,是通过nash所解析的switchroot命令来完成的,

这个命令不仅仅是完成了根切换的动作,更重要的是在根切换动作前执行了recursiveRemove的动作,如下面一段代码所示:

chdir(new);

nashHotplugNewRoot(_nash_context);

nashHotplugNotifyExit(_nash_context);

recursiveRemove("/");

if (mount(new, "/", NULL, MS_MOVE, NULL) < 0) {

eprintf("switchroot: mount failed: %m\n");

close(fd);

return 1;

}

recursiveRemove("/")就是从(原)根目录开始删除所有的文件,但是这个函数在实现时仅对当前文件系统进行递归操作,因此不会“殃及”新挂载的新根(此时挂在原根的某个目录下)。

由此可见,对cpio-initrd所占用资源的释放就是通过删除来完成的。但是值得注意的是,这个动作我们几乎无法通过脚本使用通常的命令来完成,因为

普通的rm、find等命令都依赖于glibc库,在删除的过程当中一旦glibc库被删除,则rm、find都无法再继续了,而通常之后还需要使用

chroot等命令来执行新根目录下的/sbin/init,所以若试图通过普通脚本来完成这样的动作,是需要特别的技巧的。

linux 内核 cpio,Linux 2.6内核cpio initrd释放资源的处理相关推荐

  1. linux img 内核启动,linux的启动流程(initrd.img)

    http://www.ibm.com/developerworks/cn/linux/l-initrd.html 一.从哪里到哪里 本文旨在描述linux中内核如何调用启动,然后如何从img的文件系统 ...

  2. 剪辑内核linux,Linux01-Linux编辑内核定制属于自己的内核49

    一.编译内核相关命令 1.重装initrd文件命令: mkinitrd:creates initial ramdisk p_w_picpaths for preloading modules 格式:m ...

  3. 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装

    这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...

  4. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  5. linux5.5内核,一条命令就可以升级到Linux 5.5内核或Linux 5.5以上版本

    升级Linux内核其实很简单,本文介绍的方法只需要一条命令,至少能够升级到Linux 5.5内核版本.当然,脚本当中要是加入新的Linux内核,你就能够升级到那个新内核,也就是说可以升级到Linux ...

  6. linux内核报告,Linux升级内核报告.docx

    Linux升级内核报告精要 我的Linux 内核升级记录 准备工作内核安装包的下载下载地址为: HYPERLINK "/pub/linux/kernel/" /pub/linux/ ...

  7. linux 驱动 内核模式,Linux内核模块和驱动的编写

    Linux内核是一个整体是结构,因此向内核添加任何东西,或者删除某些功能,都十分困难.为了解决这个问题引入了内核机制.从而可以动态的想内核中添加或者删除模块. 模块不被编译在内核中,因而控制了内核的大 ...

  8. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  9. kali linux 内核,关于kali编译安装内核和多内核保留的问题求解答。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 没动静啊,难道沉了么?一说这内核啊有人说和那个boot文件夹里的有关,我没事闲将live启动的kali1.0.5的boot文件夹中的文件弄了出来放到了实体 ...

  10. linux查看安装的所有内核,Linux怎么查看系统已安装内核

    当我们需要在Linux系统中安装一些软件而去下载安装文件时,一般都需要确认到底下载哪个版本的安装包,这就需要我们知道自己的Linux系统到底是什么版本.什么内核,下面跟着学习啦小编一起来了解一下Lin ...

最新文章

  1. Android system server之WatchDog看门狗分析
  2. yii框架安装及环境配置!!!
  3. 最全Kafka 设计与原理详解【2017.9全新】
  4. neo4j 两个点创建关系_Neo4j:找到两个纬度/经度之间的中间点
  5. 唯一的hashCodes不足以避免冲突
  6. 【学习笔记】【C语言】类型说明符
  7. Spring MVC学习总结(19)——SpringMVC权限注解拦截
  8. matlab2c使用c++实现matlab函数系列教程-hilb函数
  9. SpringBoot技术点细解
  10. php中文歌词,酷狗krc歌词解析并转换为lrc歌词php版
  11. Python学习视频收集
  12. scala 转换、过滤、分组、排序
  13. 举头望明月打计算机术语,与月亮有关的谜语
  14. python中and、or、not、in和not in五种运算用法
  15. 大型软件外包项目的开发流程
  16. 计算机知识竞赛策划书前言,计算机知识竞赛策划书范文.docx
  17. svn co 的常用命令解释
  18. tracert 实作
  19. 车间调度问题总结笔记二——AGV调度
  20. hp 5200每次打印,需要手动确认纸盘的问题处理

热门文章

  1. 我国现有 xx 亿人口,蒜头君想知道按照每年 0.1\% 的增长速度,n 年后将有多少人?输入格式一行,包含两个整数 x 和 n,分别是人口基数和年数,以单个空格分隔。输出格式 保留四位小数。
  2. 大家注意了,襄阳宏帆商务咨询有限公司是诈骗公司。
  3. 13种老人不适合带孩子_湖南127岁长寿老人,共养育13个孩子,却没有一人能活过成年...
  4. poll调用深入解析
  5. 水果之王之猕猴桃-系列四(猕猴桃和奇异果的区别)
  6. r7 PRO 4750u 和r74800h 的区别
  7. 在 ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图。
  8. 【机器学习】强化学习:马尔科夫决策过程(Markov decision process)
  9. 联想服务器查raid型号,联想服务器所配备RAID卡规格
  10. php设置timezone,php设置 timeZone方法