g4d启动linux时加initrd和不加的区别是什么

g4d启动linux时加initrd和不加的区别是什么,第1张

Initrd 的英文全称是 initial ram disk,从字面意思来看,initi指linux的初始阶段,ram disk指RAM 盘。ram disk是一个基于ram的块设备,同其他存储设备一样,它不仅占据了一块固定的内存(只是它占用的RAM内存,而普通从此设备是ROM内存),而且其上也需要文件系统。initrd文件中包含了各种可执行程序和驱动程序。它在桌面linux系统中和嵌入式linux系统中稍有不同。在桌面linux中,可以用来挂载真正的根文件系统,然后再将这个 initrd RAM磁盘卸载,并释放内存。在嵌入式Linux系统中,initrd 就是最终的根文件系统。

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 。

首先来说,很多驱动程序并没有被编译进内核,而是作为一个LKM存在,这样减轻了内核的负担也增加了驱动加载的灵活性。

再来,对于initrd---全名init ram disk,它确切的来说使用一个文件模拟的一个磁盘分区,这个文件里面就放了一些必要的程序库,以及驱动程序模块。

在linux驱动过程中,它最终要去挂载真正的根分区(物理分区),那么首先就要在内存中加载内核镜像和initrd文件,解压initrd文件以后,然后挂载这个模拟的文件系统,这个时候,就相当于用内存模拟了硬盘,而还没有真正接触到物理硬盘。所以,ram disk由此而来。然后,内核在ramdisk下,加载硬盘驱动,如scsi的,然后才能控制硬盘,挂载分区,并切换到真正的根分区之上……

所以,initrd起到一个中间转换的作用,但据我所知,initrd也并非必须,比如ide的硬盘驱动直接编译进内核……

你想,假如硬盘驱动没有被编译进内核,那么在启动 *** 作的系统的过程中,需要驱动,但是驱动程序又存放在了硬盘之上,但是你又没有加载硬盘驱动不能访问硬盘,则不是陷入了一个矛盾的问题嘛,所以,用内存模拟硬盘来存放驱动,然后加载就可以访问硬盘了……不能说不佩服这些大神

说了个大概,可以多多交流一下 。不明白可以high我

(1)vmlinuz指的是内核,作用:进程管理、内存管理、文件管理、驱动管理、网络管理。

(2)initrd.img是一个小的映象, 放的是和启动相关的驱动模块。通常的步骤是先启动内核,然后内核挂载initrd.img,并执行里面的脚本来进一步挂载各种各样的模块。其中最重要的就是根文件系统驱动模块,有了它才能挂载根文件系统,继而运行用户空间的第一个应用程序init或者systemd,完成系统后续的启动


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11413482.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存