linux开机流程:
按下电源键->执行BIOS-->将主硬盘的第一个扇区(MBR)载入内存,并把权利交给MBR中的程序(即boot loader,因为它安装在MBR中)-->boot loader载入 Linux 的核心 (kernel) ,即vmlinuz,并将权利交给它,至此,linux开始启动此文中的boot loader 指的是grub具体步骤如下:
整个主机在开机的时候,第一个被读取的地方, 就是 BIOS ( Basic Input Output System ) 啦,
这个 BIOS 里面记录了主机板的晶片组与相关的设定, 例如 CPU 与周边设备的沟通时脉啊、开机装置的搜寻顺序啊、硬碟的大小与类型啊、 系统时间啊、各周边汇流排的是否启动 Plug and Play (PnP, 随插即用装置) 啊、 各周边设备的 I/O 位址啊、以及与 CPU 沟通的 IRQ 岔断等等的资讯都记录在此读取了 BIOS 设定值之后,系统会根据 BIOS 的资料,进行开机自我测试 (power on self test, POST),
然后开始执行硬体侦测的初始化,并设定 PnP 装置,之后再定义出可开机的装置,之后就会开始进行开机装置的资料读取了 (MBR 相关的任务开始)。读完了 BIOS 并且了解了主要的主机硬体相关资讯后,主机便会开始尝试由储存媒体载入作业系统了。
我们刚刚提到 BIOS 会记录『可用来开机的装置搜寻顺序』对吧!所以,系统会开始去第一个开机装置上面进行开机程序。以硬碟来看,那么开机流程读到硬碟的过程中,第一个要读取的就是该硬碟的主要开机磁区 (Master Boot Record, MBR,即硬盘的第一个sector(扇区),大小为512字节) 了,而系统可以由主要开机区所安装的开机管理程式 (boot loader) 开始执行核心辨识的工作。此boot loader 程序安装在 MBR中。当我们藉由 boot loader 的管理而开始读取核心档案后,接下来, Linux 就会将核心解压缩到主记忆体当中,
并且利用核心的功能,开始测试与驱动各个周边装置,包括储存装置、CPU、网路卡、音效卡等等。那么linux核心档案在哪里啊?一般来说,他会被放置到 /boot 里面, 并且取名为 /boot/vmlinuz总之,在这个过程当中, boot loader 可以找到 Linux 的核心档案并且将他载入到主记忆体当中,
同时可能可以藉由 initrd 建立起虚拟硬碟 (RAM Disk) 辅助开机的进行, 最后,将读自 BIOS 的主机硬体资料交由 Linux 核心来进行侦测并且载入适当的驱动程式 (driver) ,就让整个主机硬体准备系统的要求了。在核心完整的载入后,您的主机应该就开始正确的运作了,接下来,就是要开始执行系统的第一支程式∶ init。
由于MBR只有512字节,则MBR不能完全装下boot loader程序,为了解决这个问题,
我们将 boot loader 分成两个阶段来执行 (stage)∶Stage 1∶第一阶段为 boot loader 的主程式,这个主程式必须要被安装在开机区, 亦即是 MBR 或者是 Super block (first sector)。但如前所述,因为 MBR 实在太小了, 所以,这个 stage 1 通常仅安装 boot loader 的最小主程式, 并没有安装 loader 的相关设定档;Stage 2∶第二阶段为载入 boot loader 的所有设定档与相关的环境参数档案。 一般来说,设定档都在 /boot 底下。
boot loader 可以做到∶boot loader 可以直接指定并取用 kernel 档案,来载入到主记忆体当中; 也可以将 loader 的控制权移交给下一个 loader !换句话说, boot loader 除了可以直接指定核心档案来开机之外,也可以指定某个 分区中的BS(boot sector)当中的 boot loader 接管开机的核心载入流程啊!我们来假设几个条件好了。 假设我在 MBR 安装了 grub 这个同时认识 Windows 与 Linux 的档案系统的 boot loader , 同时假设我的 /dev/hda2 当中的 super block 也安装了 Linux 的 grub , 且 /dev/hda1 的 super block 则是安装 Windows 的 boot loader 。此外,我的 Linux 的 核心档案放置在 /dev/hda2 里面的 /boot/vmlinuz ,那么我的 MBR 的 grub 至少可以做到这样∶ 直接指定核心 (在 /dev/hda2 的 /boot/vmlinux ) 来进行开机; 将控制权交给 /dev/hda2 super block 当中的 grub 进行管理; 将控制权交给 /dev/hda1 super block 当中的 Windows 的 loader 来管理。
1. 直接指定核心开机
1. 先指定核心档案放置的 partition,再读取档案 (目录树), 最后才加入档案的实际档名与路径 (kernel 与 initrd); 假设仅有一颗硬碟,且仅划分出 /dev/hda1 (亦即根目录为 /dev/hda1)而已∶ root (hd0,0) <==代表核心档案放在那个 partition 当中? kernel /boot/vmlinuz ro root=/dev/hda1 vga=771 initrd /boot/initrd# root ∶代表的是『核心档案放置的那个 partition 而不是根目录』喔!不要搞错了!# kernel ∶至于 kernel 后面接的则是核心的档名,而在档名后面接的则是核心的参数,# 在 kernel 后面接的 root 才是『根目录所在的 partition 』,# 另外,核心还可以外加很多的参数喔,例如 vga 即是一个解析度参数!# initrd ∶就是前面提到的 initrd 制作出 RAM Disk 的档案档名啦!2. 直接指定 partition 与档名,不需要外接 root !
kernel (hd0,0)/boot/vmlinuz ro root=/dev/hda1 vga=771 initrd (hd0,0)/boot/initrd2.利用 chain loader 的方式∶所谓的 chain loader 仅是在将控制权交给下一个 boot loader 而已, 所以 grub 并不需要认识与找出 kernel file , 『 他只是将 boot 的控制权交给下一个 super block 或者是 MBR 内的 boot loader 而已 』 所以通常他也不需要去查验下一个 boot loader 的开机磁区啊! 一般来说, chain loader 的设定只要两个就够了, 一个是指定开机区的 root partition,另一个则是设定 chainloader 在那个磁区上! 所以说,假设我的 Windows 磁区在 /dev/hda1 ,且我又只有一颗硬碟, 那么要 grub 将控制权交给 windows 的 loader 只要这样就够了∶
title Windows partition
root (hd0,0) chainloader +1那个 root 代表的就是 Windows 的 C 槽啦!而 chainloader 则是载入
boot loader 的定义值, 那个 +1 代表的是C 槽的『第一个 sector 』,即BS(boot sector)
grub shell 安装grub到MBR 或BS中
这里仅介绍几个有用的指令而已。用『 root (hdx,x) 』选择含有 /boot 目录的那个 partition 代号;
用『 find /boot/grub/stage1 』看看能否找到安装资讯档案; 用『 find /boot/vmlinuz 』看看能否找到 kernel file (不一定要成功!); 用『 setup (hdx,x) 』或『 setup (hdx) 』将 grub 安装在 super block 或 MBR; 用『 quit 』来离开 grub shell !所以,请用 grub 来进入 grub shell 吧!进入 grub 后,会出现一个『 grub> 』的提示字元啊!
[root@linux ~]# grub1. 先设定一下含有 /boot 目录的那个 partition 啊!
grub> root (hd0,0) Filesystem type is ext2fs, partition type 0x83# 瞧!找到啦!有这个 partition 的存在,且 grub 认识他为 ext2 的 filesystem。2. 搜寻一下,是否存在 stage1 这个资讯档案?
grub> find /boot/grub/stage1 (hd0,0) (hd1,0)# 呵呵!竟然找到两个?因为刚刚我们也安装一个在 /dev/hdb1 嘛!3. 搜寻一下是否可以找到核心? /boot/vmlinuz ?
grub> find /boot/vmlinuzError 15: File not foundgrub> find /boot/vmlinuz-2.6.12-1.1456_FC4 (hd0,0)# 没办法,FC4 没有连结档,所以需要填写完整的 kernel 档案名称!4. 给他安装上去吧!安装到 MBR 看看!
grub> setup (hd0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 15 sectors are embedded.succeeded Running "install /boot/grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/boot/grub/stage2 /boot/grub/grub.conf"... succeededDone.# 很好!确实有装起来~这样 grub 就在 MBR 当中了!5. 那么重复安装到我的 /dev/hda1 呢?亦即是 super block 当中?
grub> setup (hd0,0) Checking if "/boot/grub/stage1" exists... yes Checking if "/boot/grub/stage2" exists... yes Checking if "/boot/grub/e2fs_stage1_5" exists... yes Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal) Running "embed /boot/grub/e2fs_stage1_5 (hd0,0)"... failed (this is not fatal) Running "install /boot/grub/stage1 (hd0,0) /boot/grub/stage2 p /boot/grub/grub.conf "... succeededDone.# 虽然无法将 stage1_5 安装到 super block 去,不过,还不会有问题,# 重点是最后面那个 stage1 要安装后,显示 succeeded 字样就可以了!grub> quit