Linux 操作系统启动流程以及trouble shooting思路
上一篇 / 下一篇 2010-01-13 09:52:10 / 个人分类:Debian configure
Linux系统启动的基本过程和步骤:
T.aA0c i LEw051Testing软件测试网,^9|9PIp G,[E@#Z|0_
最近在某个版块看到有人讨论GRUB的问题,这里是我个人的一些理解。51Testing软件测试网T8| ^Bg
我想大部分还是正确的,但肯定也有理解错误的地方,在这里抛砖引玉了!51Testing软件测试网G3du?'m;|q:[
#D&m$K-M"hmh:^0Linux系统启动过程大致按照如下步骤进行(这是一个简述):51Testing软件测试网H/Kem^^6wo
第一阶段:BIOS启动引导阶段;
/{/N$\5SU B0 在该过程中实现硬件的初始化以及查找启动介质;51Testing软件测试网{;h!mU2zu$Ql
从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理51Testing软件测试网x!q.l9kis)y%O
第二阶段:GRUB启动引导阶段;
k{,JA#d0N@MXl0 装载stage151Testing软件测试网B.O7X7Y;Pu-X:k@k$R(Y
装载stage1.5
;x mpGiX ?hL|i0 装载stage2
IelHda0 读取/boot/grub.conf文件并显示启动菜单;51Testing软件测试网c4MmK0@0M6N j/gN
装载所选的kernel和initrd文件到内存中51Testing软件测试网$L]d{.e)u [v
第三阶段:内核阶段:51Testing软件测试网z`6xBmz
运行内核启动参数;51Testing软件测试网 xc$F9O i4e?uq
解压initrd文件并挂载initd文件系统,装载必须的驱动;
8~| v#\ U6[?0 挂载根文件系统51Testing软件测试网x4B!u9S0EL
第四阶段:Sys V init初始化阶段:
k@"p1M w(V0 启动/sbin/init程序;51Testing软件测试网1n*]*p"O1uC O5Q:L t
运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统;
.sI.n nC7a2U Ft0 读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;51Testing软件测试网3C|Z6Z-P*Y-Cq
打开字符终端1-6号控制台/打开图形显示管理的7号控制台51Testing软件测试网/`9x_3IH@s
7p-b+oNL0qvm0E0同时在上述过程中各阶段所需要读取的文件和操作的对象:
8[-_)t7{8w5\b,},VE0BIOS启动引导阶段 GRUB启动引导阶段 内核阶段 /init/sysinit阶段51Testing软件测试网+^._/W N-{$~2CV
==================================================================================================51Testing软件测试网rHBOp:h
None /boot/grub/grub.conf /boot/vmlinuz-<version> /etc/rc.d/rc.sysinit
5QS4Mz;I4LQ F0 /boot/grub/stage1_5 /boot/initrd-<version> /etc/inittab
/x.u2r"D_0 /boot/grub/stage2 /etc/rc.d/rc<#>.d51Testing软件测试网2B ^/^8K(C:XJ/z
/etc/rc.d/init.d/*51Testing软件测试网U C1zfgrIGM
[6_N|Ft LK051Testing软件测试网NlG*?}
&A*?Yl%j2N0
V`D#J!h*PT O3t0(下面是详细的过程) 51Testing软件测试网6`VW YXr*LUh
第一阶段:
0w:]|!Y:Z}0系统上电开机后,主板BIOS(Basic Input / Output System)运行POST(Power on self test)代码,检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS( Complementary Metal Oxide Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后,信息不会丢失。
|FL Mj.bh0执行POST代码对系统外围关键设备检测通过后,系统启动自举程序, 根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择合适的启动器,比如通常情况下的硬盘设备,BIOS会读取硬盘设备的第一个扇区(MBR,512字节),并执行其中的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。51Testing软件测试网LN:ol!C4@n0eY
注: 在我们的现行系统中,大多关键设备都是连在主板上的。因此主板BIOS提供了一个操作系统(软件)和系统外围关键设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否“准备好”,以供操作系统使用。
v%G,|@(Xi+N051Testing软件测试网}D/D F k'w
第二阶段:51Testing软件测试网'm2|o Xa YL3L V
BIOS通过下面两种方法之一来传递引导记录:51Testing软件测试网6BsC/|6h@TAh
第一, 将控制权传递给initial program loader(IPL),该程序安装在磁盘主引导记录(MBR)中51Testing软件测试网C%@8@r#q
第二, 将控制权传递给initial program loader(IPL),该程序安装在磁盘分区的启动引导扇区中
;{M(P0I:~+lK8d8{0无论上面的哪种情况中,IPL都是MBR的一部分并应该存储于一个不大于446字节的磁盘空间中,因为MBR是一个不大于512字节的空间。51Testing软件测试网(y4qQ!YZI*c)o
因此IPL仅仅是GRUB的第一个部分(stage1),他的作用就是定位和装载GRUB的第二个部分(stage2);stage2对启动系统起关键作用,该部分提供了GRUB启动菜单和交互式的GRUB的shell。启动菜单在启动时候通过/boot/grub/grub.conf文件所定义的内容生成。在启动菜单中选择了kernel之后,GRUB会负责解压和装载kernel image并且将initrd装载到内存中。最后GRUB初始化kernel启动代码。51Testing软件测试网qtP]l@5N\}
完成之后后续的引导权被移交给kernel。
a J0j5_Zud051Testing软件测试网1\.l"r3v5L~
假设Boot Loader为grub (grub-0.97),其引导系统的过程如下:51Testing软件测试网:Y"A&~fB
grub分为stage1 (stage1_5) 和stage2两个阶段。stage1可以看成是initial program loaderI(IPL),而stage2则实现了grub的主要功能,包括对特定文件系统的支持(如ext2,ext3,reiserfs等),grub自己的shell,以及内部程序(如:kernrl,initrd,root)等。51Testing软件测试网n-k7CP s b)b'V0I
stage 1:MBR(512 字节,0头0道1扇区),前446字节存放的是 stage1,后面存放硬盘分区表信息,BIOS将stag1载入内存中0x7c00处并跳转执行。stage1(/stage1/start.S)的任务非常单纯,仅仅是将硬盘0头0道2扇区读入内存。0头0道2扇区内容是源代码中的/stage2/start.S,编译后512字节,它是stage2或者stage1_5的入口。51Testing软件测试网7o*C6Oc+M(V/~ t-W
注:此时stage1是没有能力识别文件系统的,其定位硬盘0头0道2扇区过程如下:51Testing软件测试网d)}&t4viL3x
BIOS将stage1载入内存0x7c00处并执行,然后调用BIOS INIT13中断,将硬盘0头0道2扇区内容载入内存0x7000处,然后调用copy_buffer将其转移到内存0x8000处。定位0头0道2扇区有两种寻址方式:LBA、CHS。
#h7K b%E4p m-RCD0start.S的主要功能是将stage2或stage1_5从硬盘载入内存,如果是stage2,则载入0x820处;如果是 stage1_5,则载入0x2200处。
,S G+t0f%l}0注:这里的stage2或者stage1_5不是/boot分区/boot/grub目录下的文件,这个时候grub还没有能力识别任何文件系统。分以下两种情况:
4GZZ7VK$mH?4H0(1)假如start.S读取的是stage1_5,它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中间的桥梁,stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行。51Testing软件测试网 f-_'L:H Ble
(2)假如start.S读取的是stage2,同样,这个stage2也不是/boot分区/boot/grub目录下的stage2,这个时候start.S读取的是存放在/boot分区Boot Sector的stage2。这种情况下就有一个限制:因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,限制在8GB以内。因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前。
[;hY.a;F.w}/N0假如是情形(2),我们将/boot/grub目录下的内容清空,依然能成功启动grub;假如是情形(1),将/boot/grub目录下stage2删除后,则系统启动过程中grub会启动失败。
L'z TSGr#}1Z6d0这个地方经常要进行的操作:51Testing软件测试网WF5_3U"i}i:e
是关于grub常用的几个指令对应的函数:51Testing软件测试网I8Xqqg:\
grub>root (hd0,0) --root指令为grub指定了一个根分区
T.aA0c i LEw051Testing软件测试网,^9|9PIp G,[E@#Z|0_
最近在某个版块看到有人讨论GRUB的问题,这里是我个人的一些理解。51Testing软件测试网T8| ^Bg
我想大部分还是正确的,但肯定也有理解错误的地方,在这里抛砖引玉了!51Testing软件测试网G3du?'m;|q:[
#D&m$K-M"hmh:^0Linux系统启动过程大致按照如下步骤进行(这是一个简述):51Testing软件测试网H/Kem^^6wo
第一阶段:BIOS启动引导阶段;
/{/N$\5SU B0 在该过程中实现硬件的初始化以及查找启动介质;51Testing软件测试网{;h!mU2zu$Ql
从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理51Testing软件测试网x!q.l9kis)y%O
第二阶段:GRUB启动引导阶段;
k{,JA#d0N@MXl0 装载stage151Testing软件测试网B.O7X7Y;Pu-X:k@k$R(Y
装载stage1.5
;x mpGiX ?hL|i0 装载stage2
IelHda0 读取/boot/grub.conf文件并显示启动菜单;51Testing软件测试网c4MmK0@0M6N j/gN
装载所选的kernel和initrd文件到内存中51Testing软件测试网$L]d{.e)u [v
第三阶段:内核阶段:51Testing软件测试网z`6xBmz
运行内核启动参数;51Testing软件测试网 xc$F9O i4e?uq
解压initrd文件并挂载initd文件系统,装载必须的驱动;
8~| v#\ U6[?0 挂载根文件系统51Testing软件测试网x4B!u9S0EL
第四阶段:Sys V init初始化阶段:
k@"p1M w(V0 启动/sbin/init程序;51Testing软件测试网1n*]*p"O1uC O5Q:L t
运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统;
.sI.n nC7a2U Ft0 读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;51Testing软件测试网3C|Z6Z-P*Y-Cq
打开字符终端1-6号控制台/打开图形显示管理的7号控制台51Testing软件测试网/`9x_3IH@s
7p-b+oNL0qvm0E0同时在上述过程中各阶段所需要读取的文件和操作的对象:
8[-_)t7{8w5\b,},VE0BIOS启动引导阶段 GRUB启动引导阶段 内核阶段 /init/sysinit阶段51Testing软件测试网+^._/W N-{$~2CV
==================================================================================================51Testing软件测试网rHBOp:h
None /boot/grub/grub.conf /boot/vmlinuz-<version> /etc/rc.d/rc.sysinit
5QS4Mz;I4LQ F0 /boot/grub/stage1_5 /boot/initrd-<version> /etc/inittab
/x.u2r"D_0 /boot/grub/stage2 /etc/rc.d/rc<#>.d51Testing软件测试网2B ^/^8K(C:XJ/z
/etc/rc.d/init.d/*51Testing软件测试网U C1zfgrIGM
[6_N|Ft LK051Testing软件测试网NlG*?}
&A*?Yl%j2N0
V`D#J!h*PT O3t0(下面是详细的过程) 51Testing软件测试网6`VW YXr*LUh
第一阶段:
0w:]|!Y:Z}0系统上电开机后,主板BIOS(Basic Input / Output System)运行POST(Power on self test)代码,检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS( Complementary Metal Oxide Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后,信息不会丢失。
|FL Mj.bh0执行POST代码对系统外围关键设备检测通过后,系统启动自举程序, 根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择合适的启动器,比如通常情况下的硬盘设备,BIOS会读取硬盘设备的第一个扇区(MBR,512字节),并执行其中的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。51Testing软件测试网LN:ol!C4@n0eY
注: 在我们的现行系统中,大多关键设备都是连在主板上的。因此主板BIOS提供了一个操作系统(软件)和系统外围关键设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否“准备好”,以供操作系统使用。
v%G,|@(Xi+N051Testing软件测试网}D/D F k'w
第二阶段:51Testing软件测试网'm2|o Xa YL3L V
BIOS通过下面两种方法之一来传递引导记录:51Testing软件测试网6BsC/|6h@TAh
第一, 将控制权传递给initial program loader(IPL),该程序安装在磁盘主引导记录(MBR)中51Testing软件测试网C%@8@r#q
第二, 将控制权传递给initial program loader(IPL),该程序安装在磁盘分区的启动引导扇区中
;{M(P0I:~+lK8d8{0无论上面的哪种情况中,IPL都是MBR的一部分并应该存储于一个不大于446字节的磁盘空间中,因为MBR是一个不大于512字节的空间。51Testing软件测试网(y4qQ!YZI*c)o
因此IPL仅仅是GRUB的第一个部分(stage1),他的作用就是定位和装载GRUB的第二个部分(stage2);stage2对启动系统起关键作用,该部分提供了GRUB启动菜单和交互式的GRUB的shell。启动菜单在启动时候通过/boot/grub/grub.conf文件所定义的内容生成。在启动菜单中选择了kernel之后,GRUB会负责解压和装载kernel image并且将initrd装载到内存中。最后GRUB初始化kernel启动代码。51Testing软件测试网qtP]l@5N\}
完成之后后续的引导权被移交给kernel。
a J0j5_Zud051Testing软件测试网1\.l"r3v5L~
假设Boot Loader为grub (grub-0.97),其引导系统的过程如下:51Testing软件测试网:Y"A&~fB
grub分为stage1 (stage1_5) 和stage2两个阶段。stage1可以看成是initial program loaderI(IPL),而stage2则实现了grub的主要功能,包括对特定文件系统的支持(如ext2,ext3,reiserfs等),grub自己的shell,以及内部程序(如:kernrl,initrd,root)等。51Testing软件测试网n-k7CP s b)b'V0I
stage 1:MBR(512 字节,0头0道1扇区),前446字节存放的是 stage1,后面存放硬盘分区表信息,BIOS将stag1载入内存中0x7c00处并跳转执行。stage1(/stage1/start.S)的任务非常单纯,仅仅是将硬盘0头0道2扇区读入内存。0头0道2扇区内容是源代码中的/stage2/start.S,编译后512字节,它是stage2或者stage1_5的入口。51Testing软件测试网7o*C6Oc+M(V/~ t-W
注:此时stage1是没有能力识别文件系统的,其定位硬盘0头0道2扇区过程如下:51Testing软件测试网d)}&t4viL3x
BIOS将stage1载入内存0x7c00处并执行,然后调用BIOS INIT13中断,将硬盘0头0道2扇区内容载入内存0x7000处,然后调用copy_buffer将其转移到内存0x8000处。定位0头0道2扇区有两种寻址方式:LBA、CHS。
#h7K b%E4p m-RCD0start.S的主要功能是将stage2或stage1_5从硬盘载入内存,如果是stage2,则载入0x820处;如果是 stage1_5,则载入0x2200处。
,S G+t0f%l}0注:这里的stage2或者stage1_5不是/boot分区/boot/grub目录下的文件,这个时候grub还没有能力识别任何文件系统。分以下两种情况:
4GZZ7VK$mH?4H0(1)假如start.S读取的是stage1_5,它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中间的桥梁,stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行。51Testing软件测试网 f-_'L:H Ble
(2)假如start.S读取的是stage2,同样,这个stage2也不是/boot分区/boot/grub目录下的stage2,这个时候start.S读取的是存放在/boot分区Boot Sector的stage2。这种情况下就有一个限制:因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,限制在8GB以内。因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前。
[;hY.a;F.w}/N0假如是情形(2),我们将/boot/grub目录下的内容清空,依然能成功启动grub;假如是情形(1),将/boot/grub目录下stage2删除后,则系统启动过程中grub会启动失败。
L'z TSGr#}1Z6d0这个地方经常要进行的操作:51Testing软件测试网WF5_3U"i}i:e
是关于grub常用的几个指令对应的函数:51Testing软件测试网I8Xqqg:\
grub>root (hd0,0) --root指令为grub指定了一个根分区