您的位置:首页 > 运维架构 > Linux

Linux启动 grub 虚拟文件系统initrd详解(二)

2016-12-30 18:10 190 查看
上文我们分析了启动和grub的一些东西,这节让我们讨论一些linux内核加载启动和虚拟文件系统initrd的问题。

首先还是grub的menu.lst



其中关于default 和timeout的讲解网上都有说明

这里的root(hd0,0) 代表的以下的kernel和initrd文件系统所在的位置是第一块硬盘的第一个分区,这个可以根据自己内核存放位置设置,但是要注意grub的文件系统类型。

kernel /vmlinuz..... ro root=.......


内核文件后面跟着的参数就是内核参数,他会在进入系统后保留在/proc/cmdline里面



grub读取到内核文件之后,接着内核会自解压到内存当中, 并利用内核功能去测试和驱动各硬件,重新检查一次硬件。

由于部分的驱动程序位于硬盘的根分区下,这样启动过程中就要挂载根分区,实现动态加载内核模块。

So 问题来了,内核怎样能认出你的硬盘并读取你的硬盘呢? 之前是、BIOS中断实现读取硬盘MBR,内核并不会,但是内核还要加载硬盘中部分的驱动程序如/lib/modules下面的模块。

这就是initrd这个虚拟文件系统的存在的目的。

来让我们看一下这个initrd文件到底是一个什么东东:



由上图可以看出这个initrd是一个cpio 格式文件并gzip压缩过,我们把它解压后可以看到其实就类似我们的根分区了,对,他就是一个仿真的根目录。我们进入lib里面看看:

lib/modules/内核版本/kernel/


目录里面有很多的模块及相关驱动程序。

那么这个文件系统是怎样执行的呢? initrd 被加载到内存,然后由内核解压 解压之后,会执行init脚本,看 它是一个可执行文件一个shell脚本。

关于它的分析详细请看http://blog.csdn.net/oldlinux/article/details/43243103

其实就是建立必要的挂载目录,加载必要的模块,试着去挂载真正的根分区,找到/sbin/init 从而开启第一个进程。

其实这里如果你想在系统挂载根分区之前对硬盘操作都可以放到init脚本里面操作,也可以在initrd里面加入自己的binary,所有的操作都是在内存中。

好的,接下来谈一下/sbin/init之后的一些系统初始化操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 文件系统 kernel