概述
顺带说一句,比如grub的menu.lst,/initramfs是从根开始的,而不是/boot/initramfs。希望能帮您重新理解Linux启动流程。
-------------------------------------------
你可以看看grub的代码。 grub实现引导的功能最多代码实现其实是加载/boot,也就是加载内核。 主要原理是MBR(GRUB 实现的MBR部分, 是一段400多字节的程序加主分区表)加载大约64KB大小/boot文件系统支持(大小不是很清楚,就是不属于任何分区一小块磁盘空间,大约在主分区开始前,在安装GRUB引导器写入,有时装好的GRUB重新调整分区表没影响到MBR 就会删除这一块空间内容,导致GRUB出错提示stage xxx加载不了)
GRUB 加载menu.lst 或grub.conf后(这个路径不能变的,不支持配置,除非你去改GRUB代码),然后根据menu.lst 配置加载,grub-0.97 每个操作系统加载第一行都是root (xxx), 这一行, 其他就可能用到/boot/grub/里面其他各种文件系统的支持了。 vmlinuz和initramfs了,放那里都没有关系,关键是grub支持的文件系统和磁盘,你可以放/boot/initramfs,也可以/boot/usr/bin/initramfs都可以 都没有关系(我习惯是/boot 跟/不同分区)
------------------------------------------------
------------------------------------
vmlinuz读取/etc中的modules文件,决定载入哪个模块(这里一般放置网络模块等,例如vbox虚拟机驱动vboxdrv,我的网卡
brcmsmac,b43等),模块大概是放在/lib/modules*。此时要求vmlinuz编译了可以读取 / 的文件系统。
--------------------------------------
这个并不是vmlinuz的功能,或者说不是直接功能。
vmlinuz功能就是初始化内核及加载启动init进程, 内核模块不是内核vmlinuz主动加载的,init进程启动后,调用其他程序加载的
什么内核模块,网卡配置,通常都是/etc/init.d下面一堆脚本做的(脚本运行在/sbin/init准备好的shell环境中),运维人员应该经常跟这些打交道 。这些init脚本或叫应用层系统初始化及配置功能,事实标准应该是叫sysvinit,不过每个发行版实现起来都有差异。很多时间一段驱动的安装失败就是因不同版本的启动脚本接口不一致,如redhat系和debian系就有较大差异。
现在gentoo的实现是openrc及systemd可选其中之一, ubuntu使用的叫upstar。systemd把过去脚本化串行的启动功能改用elf二进制+配置文件来做了,因为可以并行启动以及二进制的效率运行方式提高等,所以启动速度提高了很多。开机一般4~5秒就完成grub->X了。关机一般是1~2秒(我的是固态硬盘),但是对于一些linux的老鸟来说,可能没有以前shell脚本直观简单。
自从自己成功编译内核后,就再也没有用过initramfs了,生成这个也挺复杂(懒得动手). initramfs并不是什么必须东西。 众多发行版喜欢带这个因为这个灵活。如果内核有磁盘和文件系统了,直接加载启动init进程,其他就不行initramfs了。
initramfs就是一段精简的linux系统,刚性目的就是灵活加载init。 如果不要initramfs, 想想一个发行版的内核如可要支持各式各样的硬盘(以前ATA, SATA, SCSI, USB),还有数十种文件系统,然后可能还要支持NFS(网络协议,地址配置),这样的内核会彭涨得很大, 一些加载器如lilo对加的内核大小是有限制的。所以不能把内核做得很大,就有initramfs。就是GRUB预加载一个小型文件系统到内存,里面包含init进程和shell脚本,需要的内核模块,还可以有一些花哨的东西像bootsplash, 有兴趣的同学可以找找教程解压initramfs出来看看。
最后
以上就是真实啤酒为你收集整理的initramfs下启动linux_Linux的启动过程中,满足什么条件可以不用initramfs而直接挂载/?...的全部内容,希望文章能够帮你解决initramfs下启动linux_Linux的启动过程中,满足什么条件可以不用initramfs而直接挂载/?...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复