initramfs
initramfs 与initd 的区别:
首先要介绍kernel启动init的两种方案。
第一种是,ramdisk,就是把一块内存(ram)当做磁盘(disk)去挂载,然后找到ram里的init进行执行。
第二种是,ramfs,直接在ram上挂载文件系统,执行文件系统中的init。
initrd(init ramdisk)就是ramdisk的实现,initramfs就是ramfs的实现。
Note:
tmpfs,是ramfs的增强版方案。
rootfs,是ramfs/tmpfs的一个特殊实例。
所以initramfs也可以是tmpfs/rootfs的实现。
来自:https://www.zhihu.com/question/22045825/answer/796011861
不要被文件名迷惑,kernel 2.6 以来都是 initramfs 了,只是很多还沿袭传统使用 initrd 的名字
initramfs 的工作方式更加简单直接一些,启动的时候加载内核和 initramfs 到内存执行,内核初始化之后,切换到用户态执行 initramfs 的程序/脚本,加载需要的驱动模块、必要配置等,然后加载 rootfs 切换到真正的 rootfs 上去执行后续的 init 过程。
initrd 是2.4 及更早的用法(现在你能见到的 initrd 文件实际差不多都是 initramfs 了),运行过程大概是内核启动,执行一些 initrd 的内容,加载模块啥的,然后交回控制权给内核,最后再切到用户态去运行用户态的启动流程。
从格式看,老的 initrd 是一个压缩的内存文件系统,具体是啥忘了,年月太久了。现在的 initramfs 是一个 gzip 压缩的 cpio 文件系统打包,如果遇到什么紧急情况需要处理的时候,你可以建立一个临时目录,把 initramfs 解压之后,直接 cpio -idv 解压出来,改之后再用 cpio 和 gzip 封上即可。虽然大家都喜欢用 tar 打包,但掌握点 cpio 在关键时刻还是可以救命的,呵呵
=======================================================================================================================================================================
来自:https://blog.csdn.net/zyqash/article/details/126041951
临时的文件系统
“initramfs是一个临时的文件系统,其中包含了必要的设备如硬盘、网卡、文件系统等的驱动以及加载驱动的工具及其运行环境,比如基本的C库,动态库的链接加载器等等。
initramfs原理
在讲解initramfs之前,先介绍initramfs的一个前辈initrd
在2.4以及更早版本的内核中,内核使用的是initrd。initrd是基于ramdisk技术的,而ramdisk就是一个基于内存的块设备,因此initrd也具有块设备的一切属性。比如initrd容量是固定的,一旦创建initrd时设定了一个大小,就不能再进行动态调整。而且,如同块设备一样,initrd 需要按照一定的文件系统格式进行组织,因此制作initrd时需要使用如mke2fs这样的工具“格式化”initrd,访问initrd时需要通过文件系统驱动。更重要的是,虽然initrd是一个伪块设备,但是从内核的角度看,其与真实的块设备并无区别,因此,内核访问initrd也需使用缓存机制,显然这是多此一举的,因为本身initrd就在内存中。
由于initrd太拉胯,于是initram呼之欲出
鉴于ramdisk机制的种种限制,Linus Torvalds提出了一个想法:能否将cache当作一个文件系统直接挂载使用?基于这个想法,Linus Torvalds基于已有的缓存机制实现了ramfs。ramfs与ramdisk有着本质的区别,ramdisk本质上是基于内存的一个块设备,而ramfs是基于缓存的一个文件系统。因此,ramfs去除了前述块设备的一些限制。比如,ramfs根据其中包含的文件大小可自由伸缩;增加文件时,自动分配内存;删除文件时,自动释放内存。更重要的是,ramfs是基于已有的缓存机制,因此不必再像ramdisk那样需要和缓存之间进行多余的复制一环。
伴随着ramfs的出现,从2.6开始,内核开发人员基于ramfs开发了initramfs替代initrd。那么initramfs是怎样工作的呢?
当2.6版本的内核引导时,在挂载真正的根文件系统之前,首先将挂载一个名为rootfs的文件系统,并将rootfs的根作为虚拟文件系统目录树的总根。那么为什么要使用rootfs这么一个中间过程呢?原因之一还是为了解决鸡和蛋的问题。内核需要根文件系统上的驱动以及程序来驱动和挂载根文件系统,但是这些驱动和程序有可能没有编译进内核,而在根文件系统上。如果不借助第三方,内核是没有办法挂载真正的根文件系统的。而rootfs虽然名称为rootfs,但是并不是什么新的文件系统,事实上,rootfs就是一个ramfs,只不过换了一个名称。换句话说,rootfs是在内存中的,内核不需要特殊的驱动就可以挂载rootfs,所以内核使用rootfs作为一个过渡的桥梁。
在挂载了rootfs后,内核将Bootloader加载到内存中的initramfs中打包的文件解压到rootfs中,而这些文件中包含了驱动以及挂载真正的根文件系统的工具,内核通过加载这些驱动、使用这些工具,实现了挂载真正的根文件系统。此后,rootfs也完成了历史使命,被真正的根文件系统覆盖(overmount)。但是rootfs作为虚拟文件系统目录树的总根,并不能被卸载。但是这没有关系,前面我们已经谈到了,rootfs基于ramfs,删除其中的文件即可释放其占用的空间。
————————————————
=======================================================================================================================================================================
initramfs 生成工具:
dracut 基本介绍:
好像是centos下面的工具
dracut 维基 https://dracut.wiki.kernel.org/index.php/Main_Page
http://www.360doc.com/content/13/0428/09/12139495_281449877.shtml
dracut 官方手册 https://www.kernel.org/pub/linux/utils/boot/dracut/dracut.html#dracutkernel7
https://www.kernel.org/pub/linux/utils/boot/dracut/
基本介绍
dracut 是一个事件驱动的 initramfs 基础设施。dracut(工具)被用来通过拷贝工具和文件,从一个已经安装的系统创建一个 initramfs 镜像,并将镜像与dracut框架结合在一起。通常发现在 /usr/lib/dracut/modules.d/.
不像已经存在的initramfs框架,dracut的框架尝试有尽可能更少的硬编码进入initramfs。initramfs在生命中有一个基本的目标:获取已经挂载的rootfs,以致我们能够过渡到真正的rootfs。这是所有驱动装置的可用性。因此,取代脚本硬编码去做各种事情,dracut的 initramfs 依赖 udev 去创建符号链接到设备节点,接着,当rootfs的设备节点出现的时候,它被挂载和根切换到rootfs设备。 这个有助于保持在initramfs里要求的时间尽可能的少,以致一些事情,如5s钟启动,作为一个initramfs的存在结果不是不可能的。
在dracut中,大部分的initramfs生成器功能由一群生成模块提供,这些模块是被主要的dracut工具采购,来安装特定的功能进入initramfs。他们存在于这些模块的子目录。和使用由dracut-functions提供的功能去做他们的工作。
dracut 作为新一代的 initramfs 系统,和前一代的initramfs系统的 mkinitrd 的不同点在于, dracut设计上就考虑到了映像尺寸的问题,尽量避免硬编码,以提高生成的 cpio 映像载入内存的速度。实际上,由于initramfs的唯一作用就是挂载rootfs(因此不需要把一堆无用的比如 plymouth 等都装进去),它主要依赖 udev 去获取 rootfs 的设备节点,一旦 rootfs 节点出现则立刻切换过去。按照官方维基的说法:5秒启动不是梦。另外它采用了模块化的方式,使用者可自由在 %{_libdir}/dracut/modules.d 下创建他需要的特殊模块,可扩展性很强。最后它的使用方式和 mkinitrd 非常接近,迁移成本较低。
dracut 用于制作initrd启动镜像文件, dracut-network会为镜像内添加nfs等网络支持.
centos 7.2
版本: dracut-033-359.el7.x86_64
dracut-config-rescue-033-360.el7_2.x86_64
dracut-033-360.el7_2.x86_64
dracut-network-033-360.el7_2.x86_64
centos 6
dracut-004-32.el6.noarch
dracut-kernel-004-32.el6.noarch
=======================================================================================================================================================================
参考:
https://www.zhihu.com/question/22045825/answer/796011861
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下