另外我看书上写,安装windows操作系统的时候,windows会主动复制一份自己的loader到MBR中的boot loader中,这种操作在linux下不会。所以我们安装多重操作系统的时候要求先安装windows,然后再安装Linux;我们假设先安装Linux,再安装windows的时候就会自动把windows的loader复制到MBR中的boot loader,这样一来就会默认优先启动windows。然而先安装windows,自动复制windows的loader到boot loader,再安装Linux的时候,我们可以设置把Linux的loader复制到boot loader中,把原先windows的覆盖掉,这样才能设置Linux默认启动。
2.2 Linux的GRUB
Linux的loader使用的是GRUB,我们常说的Linux中的loader就是grub,我认为这种说法是不准确的,我们知道MBR的boot loader是446字节,而grub呢,不仅仅446字节。
那MBR的boot loader和grub到底是什么关系呢,在这里说明,GRUB是一个启动管理器,和Linux没有强制的关系,当然也可以用GRUB启动Windows。首先我们可以通过rpm -qi grub命令查看grub的版本。
进入/boot/grub目录下,我们可以看到很多文件,其实Linux的loader为stage1那个文件(如下图,刚好512字节),我们在安装Linux的时候,系统会把stage1文件安装到所在分区的boot sector中,同时默认Linux启动的话,也需要把stage1中的引导代码安装到MBR中的boot loader中。该文件太小,能完成的功能有限,因此Linux的loader只是简单的引导作用。
MBR完成了主程序的引导后,会把控制权交给GRUB,主引导程序开始加载配置文件了,但是加载这些配置文件之前需要有文件系统的支持,可是现在还没有文件系统呢,在网上查阅资料说的“GRUB内置文件系统访问支持,虽然是极度精简的,但已经具备根据路径读取相应文件的二进制流。换句话说,GRUB在不依赖Linux内核的情况下具有读取配置文件与内核映像的能力”。GRUB的内置文件系统其实是依靠stage1_5那些文件定义的,而且有不同文件系统的stage1_5。我们在安装Linux的时候会把stage1_5相关文件放到0磁道1-62扇区中(一个磁道63个扇区,划分分区是从1磁道开始的,除了MBR外,所以会有62个扇区作为保留扇区),用于定义grub的文件系统。
而后开始读取stage2开始真正地读取配置文件grub.conf。解析/boot/grub/grub.conf文件
default=0# 默认启动第一个系统内核,即后面的title部分,1代表第二个,依次类推,
timeout=5# 设置系统留给用户选择系统内核的时间为5s。
splashimage=(hd0,0)/grub/splash.xpm.gz
# 用户选择内核时候的背景图片文件,这里的hd0,0是第一个硬盘的第一个分区,没有/dev/sdaX的概念
hiddenmenu # 是否显示选单画面
title CentOS 6 (2.6.32-696.el6.x86_64) # 第一个选单的名字,可以自定义
root (hd0,0) # 内核文件放置的分区
kernel ... ro root= ... rhgb quiet
# 内核文件;读取内核文件之后要挂载/目录,只读,root后跟真正的/目录挂载的分区
# rhgb 表示默认图形显示,把启动过程覆盖掉
# quit表示系统启动时将模块启动的详细信息屏蔽,只显示模块启动时候成功(ok or failed)
initrd ...# 内核镜像文件
总之,MBR就是加载内核文件的。
三、启动内核
3.1 加载内核文件
MBR将内核文件(代码)载入物理内存中执行,内核就是/boot/vmlinuz-2.6.32-696.el6.x86_64,观察该文件,发现这是一个压缩镜像文件。