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/initrd

 


2.利用 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 ~]# grub

1. 先设定一下含有 /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/vmlinuz
Error 15: File not found
grub> 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"... succeeded
Done.
# 很好!确实有装起来~这样 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 "... succeeded
Done.
# 虽然无法将 stage1_5 安装到 super block 去,不过,还不会有问题,
# 重点是最后面那个 stage1 要安装后,显示 succeeded 字样就可以了!

grub> quit

posted on 2013-06-03 21:01  征征的美丽心情  阅读(406)  评论(0编辑  收藏  举报