initrd 是linux kernel 2.4 及更早的用法,那时除了内核vmlinuz之外还有一个独立的initrd.img映像文件,initrd.img映像文件本质是一个文件液隐轮系统映像,linux kernel在初始化后会mount initrd.img作为一个[临时的根文件系统],而init进程就是在initrd.img里的,然后init进程会挂载[真正的根文件系统],然后umount initrd.img。 initrd 的工作主要为加载内核模块,然后交回控制权给内核,最后再切到用户态去运行用户态的启动流程。
kernel 2.6 以来都是 initramfs 了,不要被文件名迷惑,只是很多还沿袭传统使用 initrd 的名字。initramfs:init ram filesystem,它是一个cpio格式的内存文件系统。现在的 initramfs 是一个 gzip 压缩的 cpio 文件系统打包。
最初的想法是Linus提出的: 把cache当作文件系统装载。他在一个叫ramfs的cache实现上加了一层很薄的封装,其他内核开发人员编写了一个改进版tmpfs,这个文件系统上的数据可以写出到交换分区,而且可以设定一个tmpfs装载点的最大尺寸以免耗尽内存。initramfs就是tmpfs的一个应用。
优点:
(1)tmpfs随着其中数据的增减自动增减容量.
(2)在tmpfs和page cache/dentry cache之间没有重复数据.
(3)tmpfs重复利用了Linux caching的代码, 因此几乎没有增加内核尺寸, 而caching的代码已经经过良好测试, 所以tmpfs的代码质量也有保证.
(4)不需要额外的文件系统驱动.
另外, initrd机制被设计为旧的"root="机制的前端,而非其替代物,它假设真正的根设备是一个块设备, 而且也假设了自己不是真正的根设备,这样不便将NFS等作为根文件系统。最后/linuxrc不是以PID=1执行的, 因为1这个进程ID是给/sbin/init保留的。 initrd机制找到真正的根设备后闹信将其设备号写入/proc/sys/kernel/real-root-dev, 然后控制转移到内核由其装载根文件系统并启动/sbin/init。
initramfs则去掉了上述假设, 而且/init以PID=1执行, 由init装载根文件系统并用exec转到真正的/sbin/init, 这样也导致一个更为干净漂亮的设携并计。
现在一般提到的initrd都是指 initramfs 。
Initrd 的英文是 initial ram disk,initi指linux的初始阶段,ram disk指RAM 盘。initrd文件中包含各种可执行程序和驱动程序。在嵌入式Linux系统中,initrd 就是最终的根文件系统。initramfs:init ram filesystem,它是一个cpio格式的内存文件系统。现在的 initramfs 是一个 gzip 压缩的 cpio 文件系统打包。遇到特殊情况时,可建立一个临时目录,解压initramfs,再直接解压 cpio -idv,改之后再冲陪用 cpio 和 gzip 封上。其工作方式更为简单直接,启动时加载内核和 initramfs 到内存执行,内核初始化之后肆胡,切换到用户态执行 initramfs
的程序/脚本,加载需要的驱动模块、必要配置等,然后加载 rootfs 切换到真正的 rootfs 上去执行后续的 init 过程。
现在所说的initrd都指的是 initramfs 。因为initrd 是2.4 及更早的用法,运行过程大概是内核启动,执行一些 initrd 的内容,加载模块啥的,然后交回控制权给内核,最后再切散雹蠢到用户态去运行用户态的启动流程。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)