`

ramfs, rootfs, initrd and initramfs

 
阅读更多

ramfs, rootfs, initrd and initramfs

-------------------------------------------------------------------------------
什么是ramfs?

ramfs是空间规模动态变化的RAM文件系统。它非常简单,用来实现Linux缓存机制(缓存page cache and dentry cache)的文件系统。

通常情况下,Linux的所有文件在内存中都有缓存。需要读取的数据页从支撑存储设备(block device)中读取后,缓存于内存。在支撑存储设备中的数据页执行marked as clean操作。当虚拟文件系统需要支撑存储设备中的数据页内存时,可以释放。基于同样的机制,支撑存储设备的写入操作(写入文件然后写回支撑存储设 备,marked as clean)后,也可以释放占用的数据页内存。对于文件目录占用的缓存(dentry: directory entry),也存在同样的机制。

但是,ramfs中不需要支撑存储设备(没有支撑缓存,但是有缓存)。也就是说,写入ramfs的文件可以正常的分配page cache and dentry cache,但是不能写入支撑存储设备。这些page cache and dentry cache不能被VM释放、回收。

由于ramfs可以基于现有的Linux的文件系统结构,用于实现ramfs的代码很小。一般而言,支撑存储设备的缓存被安装为一个文件系统。所以,ramfs不能通过menuconfig选择,是必然进入内核的。

在ramfs的下面可以一直写入数据,直到写满内存为止。由于VM(Vitual Memory)认为文件应该被写回支撑存储设备,而不是交换空间(swap space),所以VM不能释放ramfs分配的内存。从而,只有root用户(or trusted user)才能进行ramfs写操作。
-------------------------------------------------------------------------------
什么是ram disk?

"ram disk"是一种实现文件系统的支撑存储的、过时的机制(2.6不用了),就是在RAM上面开辟的综合块设备(synthetic block device)。ram disk的大小是固定的,安装的文件系统大小(不是ramfs)也是固定的。ram disk的使用需要从这个假的块设备到page cache之间拷贝内存,生成和销毁dentry,而且需要文件系统的驱动格式化和解释上面的数据,所以ram disk的机制不再使用。

与ramfs相比,ram disk浪费了内存,也浪费了内存总线的带宽。同时,ram disk还为CPU加重了不必要的负担,污染了CPU的cache(尽管有避免污染的方法,但是非常耗费资源)。ramfs机制非常自然,因为文件访问可 以通过page cache and dentry cache。ram disk被弃用的另外一个原因是环回设备(loopback)引入。环回设备提供了一种更加灵活、方便的从文件而不是从内存块中创建综合块设备的方法。
-------------------------------------------------------------------------------
什么是tmpfs?

tmpfs是ramfs的衍生物,用来限制缓存大小、向swap空间写入数据。它是用来保存VM所有文件的文件系统。tmpfs中缓存的内容全部是临时 的。一旦卸载,所有的内容都会遗失。它把所有的缓存置于内核,它的规模随着文件的规模同步变化。但是它规模有大小限制,可以修改。它可以把当前不再需要的 页写入到swap空间。
-------------------------------------------------------------------------------
什么是rootfs?

rootfs是ramfs的特殊实例,在2.6的内核中必然存在。rootfs不能被卸载(与其添加特殊代码用来维护空的链表,不如把rootfs节点始 终加入,因此便于kernel维护:简单、精炼。rootfs是ramfs的一个空实例,占用空间极小)。大部分其他的文件系统安装于rootfs之上。
-------------------------------------------------------------------------------
什么是initramfs?

2.6的Linux内核包含有gzip压缩的cpio格式的文档,可以在内核引导的时候解压缩为rootfs。在解压缩后,kernel将检查 rootfs中是否包含init文件。如果init文件存在,内核就会执行这个文件,并且赋予PID=1的进程号。这个init程序将整个系统引导起来, 包括定位并且安装真正的root设备。如果在cpio文档解压缩后的rootfs中没有init程序(init文件),内核执行旧的代码,定位并且安装 root分区,执行/sbin/init程序。
-------------------------------------------------------------------------------
initramfs与initrd的区别

1. initrd是一个单独的文件;initramfs和Linux内核链接在一起(/usr目录下的程序负责生成initramfs文档)。

2. initrd是一个压缩的文件系统映像(可以是ext2等,需要内核的驱动);initramfs是类似tar的cpio压缩文档。内核中的cpio解压缩代码很小,而且init数据在boot后可以丢弃。

3. initrd运行的程序(initd,不是init)进行部分setup后返回内核;initramfs执行的init程序不返回内核(如果/init需要向内核传递控制权,可以再次安装在/目录下一个新的root设备并且启动一个新的init程序)。

4. 切换到另一个root设备时,initrd执行pivot_root后,卸载ramdisk;initramfs是rootfs,既不能 pivot_root,也不能卸载。initramfs会删掉rootfs的所有内容(find -xdev / -exec rm '{}' ';'),再次安装root到rootfs(cd /newmount; mount --move . /; chroot .),把stdin/sdout/stderr挂在新的/dev/console上,重新执行init。由于这是一个相当困难的实现过程(包括在使用一个 命令之前把它删除),所以klibc工具包引入一个帮助程序/utils/run_init.c来执行上述过程。其他大部分工具包(包括busybox) 把这个命令称为"switch_root"。
-------------------------------------------------------------------------------
Populating initramfs

2.6的内核缺省情况下总是生成一个gzipped的cpio文档,并且和内核链接在一起。这个文档缺省是空的,在X86环境下的大小是134字节。

CONFIG_INITRAMFS_SOURCE配制参数指定initramfs文档的源,并且自动的嵌入到二进制文件中。这个参数可以指向一个gzipped的cpio文档,一个包含文件的目录,或者文件描述的文本文件。例如文本文件:

   dir /dev 755 0 0
   nod /dev/console 644 0 0 c 5 1
   nod /dev/loop0 644 0 0 b 7 0
   dir /bin 755 1000 1000
   slink /bin/sh busybox 777 0 0
   file /bin/busybox initramfs/busybox 755 0 0
   dir /proc 755 0 0
   dir /sys 755 0 0
   dir /mnt 755 0 0
   file /init initramfs/init.sh 755 0 0

在内核编译完成后,可以执行/usr/gen_init_cpio命令获得cpio文档。配置文件的一个优势是不需要root权限,也不需要在新的文档中 生成设备节点。在上述文档中的两个file命令用来发现initramfs目录下面的init.sh文件和busybox文件。内核不需要外部的cpio 工具实现initramfs的cpio文档。如果在配置时指定了一个目录而不是一个描述文件,内核编译时将从这个目录生成一个描述文件(作为/usr /gen_init_cpio.c的输入)。内核编译时cpio生成代码和内核浑然一体,boot时解压缩程序也和内核浑然一体。

如果不使用配置文件或者配置目录,而使用定制的cpio文档时,需要外部的cpio工具。例如下面的命令可以从cpio映像文件抽取包含的文件、压缩cpio映像文件:

    cpio -i -d -H newc -F initramfs_data.cpio --no-absolute-filenames
   
下面的shell脚本可以生成一个定制的cpio.gz文档,可以用来代替配置文件生成的cpio文档:

   #!/bin/sh

   if [ $# -ne 2 ]
   then
     echo "usage: mkinitramfs directory imagename.cpio.gz"
     exit 1
   fi

   if [ -d "$1" ]
   then
     echo "creating $2 from $1"
     (cd "$1"; find . | cpio -o -H newc | gzip) > "$2"
   else
     echo "First argument must be a directory"
     exit 1
   fi

分享到:
评论

相关推荐

    解析linux根文件系统的挂载过程.pdf

    虚拟rootfs是为了保持内核精简,将部分功能转移到用户空间执行,常见的有initramfs和cpio-initrd、image-initrd。initramfs是内核2.5版本引入的技术,它是一个包含在内核镜像中的cpio包,内核启动时将其解压并作为...

    解析linux根文件系统的挂载过程参照.pdf

    虚拟 rootfs 又可以分为两种:initramfs 和 cpio-initrd。initramfs 是在 kernel 2.5 中引入的技术,它可以精简内核的初始化代码,使得内核的初始化过程更容易定制。cpio-initrd 是传统格式的 rootfs。 三、rootfs ...

    解析linux根文件系统的挂载过程

    虚拟根文件系统的典型形式有initramfs、cpio-initrd和image-initrd等。 - **initramfs**:在Kernel 2.5中引入的技术,它实际上是将一个小文件系统嵌入到内核镜像中。该文件系统包含了一组必要的工具和服务,这些...

    文件系统制作

    在本文中,我们将深入探讨ramdisk、rootfs和ramfs的制作,以及它们在Linux内核中的应用。 1. **ramdisk制作**: ramdisk是一种在内存中模拟磁盘的机制,它创建了一个虚拟的块设备,数据存储在内存中,速度极快但不...

    Matlab基础与应用获奖课件.pptx

    Matlab基础与应用获奖课件.pptx

    铁路订票平台 2025免费JAVA微信小程序毕设

    2025免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。

    深部应力环境模拟中pfc-flac耦合代码的应用与实现

    内容概要:本文详细介绍了pfc-flac耦合代码在深部应力环境中模拟巷道和煤层开挖的应用。pfc-flac耦合代码将颗粒流(PFC)和有限差分法(FLAC)相结合,分别用于微观颗粒间相互作用和宏观应力应变问题的处理。文中展示了具体的Python代码片段,解释了如何生成颗粒模型、定义接触模型、创建模拟区域、设置初始应力状态以及实现数据交换。此外,还讨论了耦合代码在处理煤岩损伤演化、开挖步进控制等方面的优势,并提供了实际应用中的优化建议和技术难点。 适合人群:从事岩土工程、矿山开采等领域研究的技术人员和科研工作者。 使用场景及目标:①模拟深部应力环境下的巷道和煤层开挖过程;②研究岩体应力重分布及其对开挖的影响;③提高模拟精度,更好地预测岩层破坏形态。 其他说明:尽管pfc-flac耦合代码在深部应力环境模拟中有显著优势,但也存在一些挑战,如内存消耗较大等问题。文中提到了一些优化措施,如调整参数以节省内存开销等。

    电力系统基于谐波线性化的阻抗建模与稳定性分析:考虑锁相环影响的逆变器输出阻抗模型设计及应用

    内容概要:文章详细阐述了阻抗建模过程,分为不考虑锁相环影响和考虑锁相环影响两种情况。不考虑锁相环时,基于电路拓扑结构列出方程,通过谐波线性化方法建模,并将电流基频分量及其正负序谐波分量进行傅里叶变换至频域,再变换至dq坐标系下,最终求得正负序输出阻抗。考虑锁相环影响时,重点在于锁相环对abc坐标系向dq坐标系转换的作用,以及谐波分量对锁相环角度的影响,通过引入传递函数,推导出正负序谐波电压分量到输出扰动角的传递函数,进而求得更精确的输出阻抗。此外,还介绍了稳定性分析,通过诺顿等效和戴维南等效,依据奈奎斯特稳定判据确保系统稳定。 适合人群:电力电子、自动化等相关专业的研究人员和技术人员,尤其是对电力系统建模与稳定性分析感兴趣的读者。 使用场景及目标:①用于研究并网逆变器的阻抗特性;②提高对锁相环在电力系统中作用的理解;③为电力系统的稳定性分析提供理论支持。 阅读建议:本文涉及较多数学公式和专业术语,建议读者先掌握基本的电力系统理论和控制理论基础知识,结合相关文献深入理解公式推导过程。

    SpringBoot的租房系统,你看这篇就够了(附源码)

    SpringBoot的租房系统,你看这篇就够了(附源码)

    MapGIS地质图件一般统一规定.doc

    MapGIS地质图件一般统一规定.doc

    MATLAB/Simulink中800V直流母线311V交流输出的VSG虚拟同步发电机控制详解

    内容概要:本文详细介绍了如何在MATLAB/Simulink中搭建和调试800V直流母线、311V交流输出的虚拟同步发电机(VSG)控制系统。首先,文章解释了VSG的基本概念及其重要性,接着深入探讨了功率计算模块、机械方程模块和电压环控制的具体实现方法。文中提供了多个关键公式的代码实现,并强调了调试过程中需要注意的关键参数和常见错误。此外,还分享了一些实践经验,如避免过度调制、设置合理的虚拟惯量和阻尼系数、以及进行负载突变测试的方法。 适合人群:从事电力电子、电力系统仿真研究的技术人员,尤其是有一定MATLAB/Simulink基础的研发人员。 使用场景及目标:适用于需要理解和实现虚拟同步发电机控制系统的科研项目和技术开发。目标是帮助读者掌握VSG的工作原理和实现方法,提高仿真和实际应用的成功率。 其他说明:文章不仅提供了详细的理论推导和代码实现,还结合了大量的实践经验,使读者能够更好地应对实际工程中的挑战。同时,提醒读者在实际应用前进行全面的极端工况测试,确保系统的稳定性和可靠性。

    智慧校园管理系统 2025免费JAVA微信小程序毕设

    2025免费微信小程序毕业设计成品,包括源码+数据库+往届论文资料,附带启动教程和安装包。 启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS 讲解视频:https://www.bilibili.com/video/BV1BVKMeZEYr 技术栈:Uniapp+Vue.js+SpringBoot+MySQL。 开发工具:Idea+VSCode+微信开发者工具。

    PLC关键工程师现场调试步骤.doc

    PLC关键工程师现场调试步骤.doc

    PCCAN接口解决专题方案.doc

    PCCAN接口解决专题方案.doc

    电力传输领域中110kV三相高压电缆对地面人体电磁场影响的COMSOL仿真分析

    内容概要:本文详细介绍了如何使用COMSOL软件对110kV三相高压电缆周围的电磁场进行建模和分析,探讨其对人体的影响。主要内容包括:建立电缆和人体的几何模型,选择适当的物理场模块并设置相关参数,进行精细的网格划分,以及最终求解和结果分析。文中不仅提供了具体的MATLAB和Java代码片段,还讨论了实际工程中需要注意的关键细节和技术难点,如电流密度、磁场强度的计算,网格划分策略,求解器设置等。通过对电场和磁场分布的深入分析,得出电缆周围电磁场对人体的具体影响及其安全性评价。 适合人群:从事电力系统设计、电磁兼容性研究的专业人士,以及对电磁场仿真感兴趣的科研工作者。 使用场景及目标:适用于电力设施建设前期的电磁环境评估,帮助工程师优化电缆布局,确保电磁辐射在安全标准范围内,保障公共健康。此外,也可作为教学案例,帮助学生掌握电磁场仿真技术和COMSOL软件的应用。 其他说明:文章强调了实际工程应用中的注意事项,如材料参数的选择、网格划分的合理性、求解器配置等,这些都是确保仿真结果准确性的重要因素。同时,通过具体实例展示了如何利用COMSOL进行复杂电磁场问题的研究,为相关领域的进一步探索提供了宝贵的经验和参考。

    【数学建模竞赛】“妈妈杯”全国大学生数学建模竞赛:参赛指南与备赛经验分享

    内容概要:“妈妈杯”是全国大学生数学建模竞赛的俗称,由中国工业与应用数学学会(CSIAM)主办。该竞赛面向全国普通高校全日制在校本科生和研究生,通常于每年11月左右举行。比赛形式为团队赛,每队3人,在规定时间内完成数学建模题目并提交论文。竞赛题目涉及实际问题,要求参赛者运用数学建模、计算机编程和论文写作能力解决问题。文中详细介绍了比赛的报名方式、备赛经验和往届题目。报名时间为每年10月左右,费用约为200~400元/队。备赛建议包括团队分工、核心技能提升、赛前模拟训练等方面。往届题目涵盖社会热点问题,如城市垃圾分类、新能源汽车充电桩布局等。 适合人群:全国普通高校全日制在校本科生和研究生,尤其是对数学建模感兴趣的学生。 使用场景及目标:①了解“妈妈杯”全国大学生数学建模竞赛的具体情况,包括主办单位、参赛对象、比赛时间和形式;②掌握比赛的报名方式、费用和官方信息渠道;③学习备赛经验和技巧,如团队分工、核心技能提升、赛前模拟训练;④参考往届题目和社会热点问题,为参赛做好充分准备。 阅读建议:此资源详细介绍了“妈妈杯”全国大学生数学建模竞赛的各个方面,从比赛基本信息到备赛经验都有覆盖。建议参赛学生仔细阅读,结合自身情况进行团队分工和技能提升,并关注官方渠道以获取最新信息。

    Linux操作系统试验基础指导书.doc

    Linux操作系统试验基础指导书.doc

    永磁同步电机非奇异快速终端滑模速度控制(GFTSMC)仿真及其应用

    内容概要:本文详细介绍了永磁同步电机(PMSM)采用非奇异快速终端滑模控制(GFTSMC)进行速度控制的方法和仿真结果。首先解释了传统PI调节器和滑模控制存在的问题,特别是抖振和收敛速度慢。接着展示了GFTSMC的核心设计思路,包括滑模面设计、控制律实现以及参数选择。文中提供了具体的MATLAB代码片段,用于实现滑模面和控制律,并讨论了如何通过调整参数来优化性能。仿真结果显示,在负载突变情况下,GFTSMC相比传统方法表现出更快的响应时间和更低的抖振水平。此外,作者还分享了一些调试经验和注意事项,如使用sigmoid函数减少抖振、设置合理的参数范围等。 适合人群:从事电机控制系统研究与开发的技术人员,尤其是对永磁同步电机有深入了解并希望提高其抗扰能力和响应速度的研究者。 使用场景及目标:适用于需要高性能速度控制的应用场合,如无人机电调、电动汽车驱动系统等。目标是实现快速响应的同时确保系统的稳定性和平滑性。 其他说明:文中提到的实际案例基于3kW永磁同步电机的实验数据,强调了理论与实践相结合的重要性。同时指出,尽管GFTSMC表现优异,但在实际应用中仍需考虑电机参数辨识的准确性,以避免因参数失配导致的性能下降。

    基于COMSOL的煤矿瓦斯抽采数值模拟:变渗透率模型与煤体变形耦合效应研究

    内容概要:本文详细介绍了利用COMSOL进行煤矿瓦斯抽采数值模拟的方法,特别是变渗透率模型与煤体变形之间的耦合效应。文章首先解释了如何在COMSOL中建立固体力学和达西流的耦合模型,通过引入动态渗透率公式(如指数型变渗透率模型),将煤体变形与瓦斯流动紧密联系在一起。接着讨论了边界条件的设置技巧,强调了钻孔周围网格加密的重要性以及求解器配置的优化方法。此外,文中还分享了一些实用的操作技巧,如使用探针功能实时监测压力变化,确保模拟结果的准确性。最后,作者通过实际案例展示了模型的有效性和应用价值,指出该模型能够更好地预测瓦斯流动路径和抽采效果。 适合人群:从事煤矿开采、瓦斯治理及相关领域的科研人员和技术工程师。 使用场景及目标:适用于需要精确模拟煤矿瓦斯抽采过程的研究项目,旨在提高抽采效率并保障矿井安全。通过该模型,研究人员可以深入理解煤体变形与瓦斯流动之间的复杂关系,从而优化抽采工艺。 其他说明:文章不仅提供了详细的建模步骤和技术细节,还分享了许多实践经验,帮助读者避免常见错误,提升模拟的成功率。同时,作者鼓励进一步探索多物理场耦合的可能性,如加入温度场的影响,以获得更加全面的理解。

    自动控制领域中直流电机模糊PID控制算法的Matlab实现

    内容概要:本文详细介绍了直流电机的传递函数及其在Matlab环境下的模糊PID控制算法实现。首先,阐述了直流电机传递函数的基本概念,描述了输入电枢电压与输出转速之间的动态关系。接着,解释了模糊控制PID算法的工作原理,包括模糊化、模糊规则制定、模糊推理与解模糊等步骤。然后,展示了具体的Matlab代码实现,涵盖了传递函数定义、模糊控制器设计、仿真过程以及绘图展示控制效果。通过对比实验数据,证明了模糊PID控制在应对负载突变时的优势。 适合人群:对自动控制理论有一定了解并希望通过Matlab实现具体控制算法的研究人员和技术人员。 使用场景及目标:适用于需要精确控制直流电机转速的应用场景,如工业自动化生产线、机器人控制系统等。主要目标是提高系统的鲁棒性和适应性,尤其是在面对非线性或不确定性的环境中。 其他说明:文中提供的Matlab代码可以直接运行,便于读者理解和实践。同时,强调了在设计模糊控制器时需要注意的一些关键点,如隶属函数的选择和规则库的设计,确保控制效果最优。

Global site tag (gtag.js) - Google Analytics