linux 内核 cpio,Linux 2.6内核cpio initrd释放资源的处理
以前一直在使用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释放资源的处理相关推荐
- linux img 内核启动,linux的启动流程(initrd.img)
http://www.ibm.com/developerworks/cn/linux/l-initrd.html 一.从哪里到哪里 本文旨在描述linux中内核如何调用启动,然后如何从img的文件系统 ...
- 剪辑内核linux,Linux01-Linux编辑内核定制属于自己的内核49
一.编译内核相关命令 1.重装initrd文件命令: mkinitrd:creates initial ramdisk p_w_picpaths for preloading modules 格式:m ...
- 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装
这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...
- 【内核】linux内核启动流程详细分析【转】
转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...
- linux5.5内核,一条命令就可以升级到Linux 5.5内核或Linux 5.5以上版本
升级Linux内核其实很简单,本文介绍的方法只需要一条命令,至少能够升级到Linux 5.5内核版本.当然,脚本当中要是加入新的Linux内核,你就能够升级到那个新内核,也就是说可以升级到Linux ...
- linux内核报告,Linux升级内核报告.docx
Linux升级内核报告精要 我的Linux 内核升级记录 准备工作内核安装包的下载下载地址为: HYPERLINK "/pub/linux/kernel/" /pub/linux/ ...
- linux 驱动 内核模式,Linux内核模块和驱动的编写
Linux内核是一个整体是结构,因此向内核添加任何东西,或者删除某些功能,都十分困难.为了解决这个问题引入了内核机制.从而可以动态的想内核中添加或者删除模块. 模块不被编译在内核中,因而控制了内核的大 ...
- 【内核】linux内核启动流程详细分析
Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...
- kali linux 内核,关于kali编译安装内核和多内核保留的问题求解答。
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 没动静啊,难道沉了么?一说这内核啊有人说和那个boot文件夹里的有关,我没事闲将live启动的kali1.0.5的boot文件夹中的文件弄了出来放到了实体 ...
- linux查看安装的所有内核,Linux怎么查看系统已安装内核
当我们需要在Linux系统中安装一些软件而去下载安装文件时,一般都需要确认到底下载哪个版本的安装包,这就需要我们知道自己的Linux系统到底是什么版本.什么内核,下面跟着学习啦小编一起来了解一下Lin ...
最新文章
- Android system server之WatchDog看门狗分析
- yii框架安装及环境配置!!!
- 最全Kafka 设计与原理详解【2017.9全新】
- neo4j 两个点创建关系_Neo4j:找到两个纬度/经度之间的中间点
- 唯一的hashCodes不足以避免冲突
- 【学习笔记】【C语言】类型说明符
- Spring MVC学习总结(19)——SpringMVC权限注解拦截
- matlab2c使用c++实现matlab函数系列教程-hilb函数
- SpringBoot技术点细解
- php中文歌词,酷狗krc歌词解析并转换为lrc歌词php版
- Python学习视频收集
- scala 转换、过滤、分组、排序
- 举头望明月打计算机术语,与月亮有关的谜语
- python中and、or、not、in和not in五种运算用法
- 大型软件外包项目的开发流程
- 计算机知识竞赛策划书前言,计算机知识竞赛策划书范文.docx
- svn co 的常用命令解释
- tracert 实作
- 车间调度问题总结笔记二——AGV调度
- hp 5200每次打印,需要手动确认纸盘的问题处理
热门文章
- 我国现有 xx 亿人口,蒜头君想知道按照每年 0.1\% 的增长速度,n 年后将有多少人?输入格式一行,包含两个整数 x 和 n,分别是人口基数和年数,以单个空格分隔。输出格式 保留四位小数。
- 大家注意了,襄阳宏帆商务咨询有限公司是诈骗公司。
- 13种老人不适合带孩子_湖南127岁长寿老人,共养育13个孩子,却没有一人能活过成年...
- poll调用深入解析
- 水果之王之猕猴桃-系列四(猕猴桃和奇异果的区别)
- r7 PRO 4750u 和r74800h 的区别
- 在 ArcGIS Engine 应用程序中加载搜狗地图和谷歌地图。
- 【机器学习】强化学习:马尔科夫决策过程(Markov decision process)
- 联想服务器查raid型号,联想服务器所配备RAID卡规格
- php设置timezone,php设置 timeZone方法