Linux 操作系统启动流程以及trouble shooting思路
上一篇 / 下一篇 2010-01-13 09:52:10 / 个人分类:Debian configure
Linux系统启动的基本过程和步骤:51Testing软件测试网-j%atrME*w
#|eftBb0最近在某个版块看到有人讨论GRUB的问题,这里是我个人的一些理解。
)pN4UNkPrtp0我想大部分还是正确的,但肯定也有理解错误的地方,在这里抛砖引玉了!
/kd_a,?1o(t,S@9g051Testing软件测试网 Ma\~ iT*t
Linux系统启动过程大致按照如下步骤进行(这是一个简述):
Sc7NDQ@XG9\0第一阶段:BIOS启动引导阶段;51Testing软件测试网1XG n{:A_
在该过程中实现硬件的初始化以及查找启动介质;51Testing软件测试网O*v `-UyO~
从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理
X%r6o4sT0第二阶段:GRUB启动引导阶段;
,A%NM5?0U oJmQd^0 装载stage151Testing软件测试网(vP2g;F:gt+Z
装载stage1.5
(tN.n6d?B?eD0 装载stage251Testing软件测试网$D~Q&V#Lw g/d
读取/boot/grub.conf文件并显示启动菜单;51Testing软件测试网D D)L D Cd-v
装载所选的kernel和initrd文件到内存中51Testing软件测试网e6jKhk]
第三阶段:内核阶段:
#AC8G-C Q0 运行内核启动参数;
p+v!fSVpe0 解压initrd文件并挂载initd文件系统,装载必须的驱动;51Testing软件测试网p4oFX i;P2s~8m
挂载根文件系统
'Q3D8_:f7N0第四阶段:Sys V init初始化阶段:51Testing软件测试网Jcc_Q3wd
启动/sbin/init程序;
3J4|m/uR"T3Q@0 运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统;51Testing软件测试网u}%m;V/T N
读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;
:yM'lt[,f0 打开字符终端1-6号控制台/打开图形显示管理的7号控制台51Testing软件测试网H0huH5X?3a
3n:o\4K6b:W0同时在上述过程中各阶段所需要读取的文件和操作的对象:51Testing软件测试网m2gPXn*z R j4m
BIOS启动引导阶段 GRUB启动引导阶段 内核阶段 /init/sysinit阶段51Testing软件测试网3i(`!{;C5JjX?
==================================================================================================51Testing软件测试网4B#SY9D4ZgGVej
None /boot/grub/grub.conf /boot/vmlinuz-<version> /etc/rc.d/rc.sysinit
oueH'Kdi? Va0 /boot/grub/stage1_5 /boot/initrd-<version> /etc/inittab51Testing软件测试网1~${,Z Le_
/boot/grub/stage2 /etc/rc.d/rc<#>.d
4OxnG FH n/l$|0 /etc/rc.d/init.d/*51Testing软件测试网%bwL8[o[ ycL
tEa,OG0
*dk$Z h&A*T@[0
Kf6e E#}A y051Testing软件测试网'I%p5oK.}$A8X+c
(下面是详细的过程) 51Testing软件测试网~i!Wh#D*_Vq!Rg"F
第一阶段:51Testing软件测试网 VH)iJJ(W)b bI5q
系统上电开机后,主板BIOS(Basic Input / Output System)运行POST(Power on self test)代码,检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS( Complementary Metal Oxide Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后,信息不会丢失。
)T)VF{"}0执行POST代码对系统外围关键设备检测通过后,系统启动自举程序, 根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择合适的启动器,比如通常情况下的硬盘设备,BIOS会读取硬盘设备的第一个扇区(MBR,512字节),并执行其中的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。51Testing软件测试网$^G!s4M!hV.y
注: 在我们的现行系统中,大多关键设备都是连在主板上的。因此主板BIOS提供了一个操作系统(软件)和系统外围关键设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否“准备好”,以供操作系统使用。51Testing软件测试网`4Czv [hTDs6R
51Testing软件测试网o;G7qS}q[{)QP.C
第二阶段:51Testing软件测试网i3NDAh3T1B`
BIOS通过下面两种方法之一来传递引导记录:51Testing软件测试网fxMM*a1Vm
第一, 将控制权传递给initial program loader(IPL),该程序安装在磁盘主引导记录(MBR)中51Testing软件测试网n0q(]h5I#O
第二, 将控制权传递给initial program loader(IPL),该程序安装在磁盘分区的启动引导扇区中51Testing软件测试网]{7X]0f^'\
无论上面的哪种情况中,IPL都是MBR的一部分并应该存储于一个不大于446字节的磁盘空间中,因为MBR是一个不大于512字节的空间。51Testing软件测试网&X'f![f+fS
因此IPL仅仅是GRUB的第一个部分(stage1),他的作用就是定位和装载GRUB的第二个部分(stage2);stage2对启动系统起关键作用,该部分提供了GRUB启动菜单和交互式的GRUB的shell。启动菜单在启动时候通过/boot/grub/grub.conf文件所定义的内容生成。在启动菜单中选择了kernel之后,GRUB会负责解压和装载kernel image并且将initrd装载到内存中。最后GRUB初始化kernel启动代码。51Testing软件测试网7m'\3FiK;a[~
完成之后后续的引导权被移交给kernel。
q6C6o|9h8Cl0
*[t+U^\a0假设Boot Loader为grub (grub-0.97),其引导系统的过程如下:51Testing软件测试网0I*i6X(hh;dnu*e
grub分为stage1 (stage1_5) 和stage2两个阶段。stage1可以看成是initial program loaderI(IPL),而stage2则实现了grub的主要功能,包括对特定文件系统的支持(如ext2,ext3,reiserfs等),grub自己的shell,以及内部程序(如:kernrl,initrd,root)等。51Testing软件测试网m^9M0j1YkQ-o.w x'J
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的入口。
kz!N0|i)Q+]Y$J}*|I0注:此时stage1是没有能力识别文件系统的,其定位硬盘0头0道2扇区过程如下:
]3K W#wni^(E0BIOS将stage1载入内存0x7c00处并执行,然后调用BIOS INIT13中断,将硬盘0头0道2扇区内容载入内存0x7000处,然后调用copy_buffer将其转移到内存0x8000处。定位0头0道2扇区有两种寻址方式:LBA、CHS。
(apY&a"x'V3wC-?Y0start.S的主要功能是将stage2或stage1_5从硬盘载入内存,如果是stage2,则载入0x820处;如果是 stage1_5,则载入0x2200处。
]Q0Sj9K8JA}0注:这里的stage2或者stage1_5不是/boot分区/boot/grub目录下的文件,这个时候grub还没有能力识别任何文件系统。分以下两种情况:
"s ^+T/lj5}0(1)假如start.S读取的是stage1_5,它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中间的桥梁,stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行。51Testing软件测试网'rk ^;`Er"y2a
(2)假如start.S读取的是stage2,同样,这个stage2也不是/boot分区/boot/grub目录下的stage2,这个时候start.S读取的是存放在/boot分区Boot Sector的stage2。这种情况下就有一个限制:因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,限制在8GB以内。因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前。
;b ?.DG2Q{/W `.B0假如是情形(2),我们将/boot/grub目录下的内容清空,依然能成功启动grub;假如是情形(1),将/boot/grub目录下stage2删除后,则系统启动过程中grub会启动失败。
%e.Xp3nq|g oKA0这个地方经常要进行的操作:51Testing软件测试网8by"Kkn!wZ|(Y5ne#r
是关于grub常用的几个指令对应的函数:
3UsnT-vtGhmd0grub>root (hd0,0) --root指令为grub指定了一个根分区
5d&|&\Tv?)B9r9_PL0grub>kernel /xen.gz-2.6.18-37.el5 --kernel指令将操作系统内核载入内存51Testing软件测试网Xs#J e9i(O
grub>module /vmlinuz-2.6.18-37.el5xen ro root=/dev/sda2 --module指令加载指定的模块51Testing软件测试网?+I[7wETjf
grub>module /initrd-2.6.18-37.el5xen.img --指定initrd文件51Testing软件测试网2ZR NY`9m'b }
grub>boot --boot 指令调用相应的启动函数启动OS内核
%x^fD8e7_ GG_.X051Testing软件测试网1o:p'[*tI](K
51Testing软件测试网9ER G7Td!ewg)O s9O
第三阶段:51Testing软件测试网J} Q!{&lcP,x\ U
如阶段2所述,grub>boot指令后,系统启动的控制权移交给kernel。Kernel会立即初始化系统中各设备并做相关配置工作,其中包括CPU、I/O、存储设备等。
7]j^/MfF[%Wn%b0关于设备驱动加载,有两部分:一部分设备驱动编入Linux Kernel中,Kernel会调用这部分驱动初始化相关设备,同时将日志输出到kernel message buffer,系统启动后dmesg可以查看到这部分输出信息。另外有一部分设备驱动并没有编入Kernel,而是作为模块形式放在initrd(ramdisk)中。51Testing软件测试网hV^z*is8].E
在2.6内核中,支持两种格式的initrd,一种是2.4内核的文件系统镜像image-initrd,一种是cpio格式。以 cpio 格式为例,内核判断initrd为cpio的文件格式后,会将initrd中的内容释放到rootfs中。
cQ`9x-nq/J [*M0initrd是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统/时,会先访问initrd文件系统。将initrd中的内容打开来看,会发现有bin、devetc、lib、procsys、sysroot、init等文件(包含目录)。其中包含了一些设备的驱动模块,比如scsi ata等设备驱动模块,同时还有几个基本的可执行程序 insmod, modprobe, lvm,nash。主要目的是加载一些存储介质的驱动模块,如上面所说的scsi ideusb等设备驱动模块,初始化LVM,把/根文件系统以只读方式挂载。51Testing软件测试网 o*Z9s/d k[)E9a
initrd中的内容释放到rootfs中后,Kernel会执行其中的init文件,这里的init是一个脚本,由nash解释器执行。这个时候内核的控制权移交给init文件处理,我们查看init文件的内容,主要也是加载各种存储介质相关的设备驱动。51Testing软件测试网3b2SO"ma"N^
驱动加载后,会创建一个根设备,然后将根文件系统/以只读的方式挂载。这步结束后释放未使用内存并执行switchroot,转换到真正的根/上面去,同时运行/sbin/init程序,开启系统的1号进程,此后系统启动的控制权移交给 init 进程。关于switchroot是在nash中定义的程序。51Testing软件测试网-Wk9|u(mDwu
Linux Kernel需要适应多种不同的硬件架构,但是将所有的硬件驱动编入Kernel又是不实际的,而且Kernel也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。实际上Linux Kernel仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入 initrd 。这样在以后启动系统时,一部分设备驱动就放在initrd中来加载。51Testing软件测试网%iUD+sP*krM
&H;X_2^0r ~;`0第四阶段:51Testing软件测试网 tb3_%`s9Q,jO
init进程起来后,系统启动的控制权移交给init进程。
,|S,h1z5?Sr0/sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作:
0O f$B&j\tF01)执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要进行运行级别的确定及相应服务的启动;
}a9UrbZ;U6N02)确定启动后进入的运行级别;
@G8PD QB03) 执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有的文件均链接至/etc/init.d下的相应文件。51Testing软件测试网&}e Q!vl
4)有关key sequence的设置51Testing软件测试网 XNh`(V\&q/gzi
5) 有关UPS的脚本定义51Testing软件测试网s#Uk#s.b`4Ay$s(h
6)启动虚拟终端/sbin/mingetty
ll mu7v6fU07)在运行级别5上运行X51Testing软件测试网9LRv$|$K b@:F,Ln
这时呈现给用户的就是最终的登录界面。51Testing软件测试网%y6JPJ6bt)Sh*uO
至此,系统启动过程完毕:)
8[7v,u7d"yA \0说明:
/} Y#Qf3V7ho Z01)/etc/rc.d/rc.sysint -- System Initialization Tasks51Testing软件测试网CoL7VCq3]z
它的主要工作有:51Testing软件测试网!k4{~h*G
配置selinux,51Testing软件测试网"b,ux1Vb*X8v&hHj^
系统时钟,
-iS:|+j$?hX0内核参数(/etc/sysctl.conf),51Testing软件测试网 o x| _+TF6b0T
hostname,
a9kW/yI0启用swap分区,51Testing软件测试网rC*gua&m
根文件系统的检查和二次挂载(读写),51Testing软件测试网!Hw0l |2I b
激活RAID和LVM设备,51Testing软件测试网kkS-up:A i@k
启用磁盘quota
5r'~ tT2z5{9p}g:n0检查并挂载其它文件系统
9J7]*XUn$]7t0等等。51Testing软件测试网"z^r^Bq
51Testing软件测试网i [l+AKeT4}-o\/E,~
GRUB的基本原理以及对GRUB的操作控制方法:51Testing软件测试网 h4n6D.HP6uG%m9[)F
GRUB全称为Grand Unified Boot Loader,是Linux操作系统主流的启动引导管理器。主要作用是启动和装载Linux操作系统。系统启动过程中一旦完成了BIOS自检,GRUB会被立刻装载。在GRUB里面包含了可以载入操作系统的代码以及将操作系统引导权传递给其他启动引导管理器的代码。GRUB可以允许用户选择使用不同的kernel启动系统,或者在启动系统的过程中设置不同的启动参数。51Testing软件测试网(a4L#X$L$Q
而通常BIOS会以下面两种方法之一来调用启动引导管理器:
zP5mtR0\I0将控制权移交给于驱动器主引导记录的initial program loader(IPL);
B#r/Nin!p0将控制权移交给其他启动引导管理器,再由他们将控制权移交给安装在分区引导扇区的IPL
#MrR1T jG R0通常情况下启动引导管理器GRUB由两部分组成(stage1和stage2):
2v\i&\#`0stage1比较小,通常可以驻留在MBR或者各个磁盘分区的启动扇区中,主要作用是装载stage2。
Li h R~ [0stage2比较大,从磁盘的启动引导分区读取51Testing软件测试网&zhQbfd%v O~
至于在stage1和stage2之间存在一个stage1.5,是因为starge1.5具有识别文件系统的能力。
]z#|Q}0Jl0在Linux系统中对GRUB的配置有两种方法:
c QX-X URJ0主要引导管理器:51Testing软件测试网0p-D"h)g!BHQwY
会将启动引导管理器的stage1安装在MBR上,这时启动引导管理器必须被配置为可以传递控制权到其他操作系统;51Testing软件测试网v EY1l"XOr
次要引导管理器:51Testing软件测试网NGaV\#np I
会将启动引导管理器的stage1安装在一些分区的引导扇区上,而其他的启动引导管理器会被安装在MBR上,由他们来向Linux启动引导管理器传递控制权。
#g)r/a&w_C D0GRUB在启动过程中可以提供命令行交互界面,可以从ext系列,reiserfs,fat等多种文件系统引导系统,并且可以提供密码加密功能,其内容在/boot分区下,系统启动过程中由配置文件/boot/grub/grub.conf来定义启动方式,对该配置文件的更改会立即生效。
#|eftBb0最近在某个版块看到有人讨论GRUB的问题,这里是我个人的一些理解。
)pN4UNkPrtp0我想大部分还是正确的,但肯定也有理解错误的地方,在这里抛砖引玉了!
/kd_a,?1o(t,S@9g051Testing软件测试网 Ma\~ iT*t
Linux系统启动过程大致按照如下步骤进行(这是一个简述):
Sc7NDQ@XG9\0第一阶段:BIOS启动引导阶段;51Testing软件测试网1XG n{:A_
在该过程中实现硬件的初始化以及查找启动介质;51Testing软件测试网O*v `-UyO~
从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理
X%r6o4sT0第二阶段:GRUB启动引导阶段;
,A%NM5?0U oJmQd^0 装载stage151Testing软件测试网(vP2g;F:gt+Z
装载stage1.5
(tN.n6d?B?eD0 装载stage251Testing软件测试网$D~Q&V#Lw g/d
读取/boot/grub.conf文件并显示启动菜单;51Testing软件测试网D D)L D Cd-v
装载所选的kernel和initrd文件到内存中51Testing软件测试网e6jKhk]
第三阶段:内核阶段:
#AC8G-C Q0 运行内核启动参数;
p+v!fSVpe0 解压initrd文件并挂载initd文件系统,装载必须的驱动;51Testing软件测试网p4oFX i;P2s~8m
挂载根文件系统
'Q3D8_:f7N0第四阶段:Sys V init初始化阶段:51Testing软件测试网Jcc_Q3wd
启动/sbin/init程序;
3J4|m/uR"T3Q@0 运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统;51Testing软件测试网u}%m;V/T N
读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;
:yM'lt[,f0 打开字符终端1-6号控制台/打开图形显示管理的7号控制台51Testing软件测试网H0huH5X?3a
3n:o\4K6b:W0同时在上述过程中各阶段所需要读取的文件和操作的对象:51Testing软件测试网m2gPXn*z R j4m
BIOS启动引导阶段 GRUB启动引导阶段 内核阶段 /init/sysinit阶段51Testing软件测试网3i(`!{;C5JjX?
==================================================================================================51Testing软件测试网4B#SY9D4ZgGVej
None /boot/grub/grub.conf /boot/vmlinuz-<version> /etc/rc.d/rc.sysinit
oueH'Kdi? Va0 /boot/grub/stage1_5 /boot/initrd-<version> /etc/inittab51Testing软件测试网1~${,Z Le_
/boot/grub/stage2 /etc/rc.d/rc<#>.d
4OxnG FH n/l$|0 /etc/rc.d/init.d/*51Testing软件测试网%bwL8[o[ ycL
tEa,OG0
*dk$Z h&A*T@[0
Kf6e E#}A y051Testing软件测试网'I%p5oK.}$A8X+c
(下面是详细的过程) 51Testing软件测试网~i!Wh#D*_Vq!Rg"F
第一阶段:51Testing软件测试网 VH)iJJ(W)b bI5q
系统上电开机后,主板BIOS(Basic Input / Output System)运行POST(Power on self test)代码,检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS( Complementary Metal Oxide Semiconductor)上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后,信息不会丢失。
)T)VF{"}0执行POST代码对系统外围关键设备检测通过后,系统启动自举程序, 根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择合适的启动器,比如通常情况下的硬盘设备,BIOS会读取硬盘设备的第一个扇区(MBR,512字节),并执行其中的代码。实际上这里BIOS并不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR部分的代码。51Testing软件测试网$^G!s4M!hV.y
注: 在我们的现行系统中,大多关键设备都是连在主板上的。因此主板BIOS提供了一个操作系统(软件)和系统外围关键设备(硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否“准备好”,以供操作系统使用。51Testing软件测试网`4Czv [hTDs6R
51Testing软件测试网o;G7qS}q[{)QP.C
第二阶段:51Testing软件测试网i3NDAh3T1B`
BIOS通过下面两种方法之一来传递引导记录:51Testing软件测试网fxMM*a1Vm
第一, 将控制权传递给initial program loader(IPL),该程序安装在磁盘主引导记录(MBR)中51Testing软件测试网n0q(]h5I#O
第二, 将控制权传递给initial program loader(IPL),该程序安装在磁盘分区的启动引导扇区中51Testing软件测试网]{7X]0f^'\
无论上面的哪种情况中,IPL都是MBR的一部分并应该存储于一个不大于446字节的磁盘空间中,因为MBR是一个不大于512字节的空间。51Testing软件测试网&X'f![f+fS
因此IPL仅仅是GRUB的第一个部分(stage1),他的作用就是定位和装载GRUB的第二个部分(stage2);stage2对启动系统起关键作用,该部分提供了GRUB启动菜单和交互式的GRUB的shell。启动菜单在启动时候通过/boot/grub/grub.conf文件所定义的内容生成。在启动菜单中选择了kernel之后,GRUB会负责解压和装载kernel image并且将initrd装载到内存中。最后GRUB初始化kernel启动代码。51Testing软件测试网7m'\3FiK;a[~
完成之后后续的引导权被移交给kernel。
q6C6o|9h8Cl0
*[t+U^\a0假设Boot Loader为grub (grub-0.97),其引导系统的过程如下:51Testing软件测试网0I*i6X(hh;dnu*e
grub分为stage1 (stage1_5) 和stage2两个阶段。stage1可以看成是initial program loaderI(IPL),而stage2则实现了grub的主要功能,包括对特定文件系统的支持(如ext2,ext3,reiserfs等),grub自己的shell,以及内部程序(如:kernrl,initrd,root)等。51Testing软件测试网m^9M0j1YkQ-o.w x'J
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的入口。
kz!N0|i)Q+]Y$J}*|I0注:此时stage1是没有能力识别文件系统的,其定位硬盘0头0道2扇区过程如下:
]3K W#wni^(E0BIOS将stage1载入内存0x7c00处并执行,然后调用BIOS INIT13中断,将硬盘0头0道2扇区内容载入内存0x7000处,然后调用copy_buffer将其转移到内存0x8000处。定位0头0道2扇区有两种寻址方式:LBA、CHS。
(apY&a"x'V3wC-?Y0start.S的主要功能是将stage2或stage1_5从硬盘载入内存,如果是stage2,则载入0x820处;如果是 stage1_5,则载入0x2200处。
]Q0Sj9K8JA}0注:这里的stage2或者stage1_5不是/boot分区/boot/grub目录下的文件,这个时候grub还没有能力识别任何文件系统。分以下两种情况:
"s ^+T/lj5}0(1)假如start.S读取的是stage1_5,它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中间的桥梁,stage1_5有识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行。51Testing软件测试网'rk ^;`Er"y2a
(2)假如start.S读取的是stage2,同样,这个stage2也不是/boot分区/boot/grub目录下的stage2,这个时候start.S读取的是存放在/boot分区Boot Sector的stage2。这种情况下就有一个限制:因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系统),其寻址范围有限,限制在8GB以内。因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前。
;b ?.DG2Q{/W `.B0假如是情形(2),我们将/boot/grub目录下的内容清空,依然能成功启动grub;假如是情形(1),将/boot/grub目录下stage2删除后,则系统启动过程中grub会启动失败。
%e.Xp3nq|g oKA0这个地方经常要进行的操作:51Testing软件测试网8by"Kkn!wZ|(Y5ne#r
是关于grub常用的几个指令对应的函数:
3UsnT-vtGhmd0grub>root (hd0,0) --root指令为grub指定了一个根分区
5d&|&\Tv?)B9r9_PL0grub>kernel /xen.gz-2.6.18-37.el5 --kernel指令将操作系统内核载入内存51Testing软件测试网Xs#J e9i(O
grub>module /vmlinuz-2.6.18-37.el5xen ro root=/dev/sda2 --module指令加载指定的模块51Testing软件测试网?+I[7wETjf
grub>module /initrd-2.6.18-37.el5xen.img --指定initrd文件51Testing软件测试网2ZR NY`9m'b }
grub>boot --boot 指令调用相应的启动函数启动OS内核
%x^fD8e7_ GG_.X051Testing软件测试网1o:p'[*tI](K
51Testing软件测试网9ER G7Td!ewg)O s9O
第三阶段:51Testing软件测试网J} Q!{&lcP,x\ U
如阶段2所述,grub>boot指令后,系统启动的控制权移交给kernel。Kernel会立即初始化系统中各设备并做相关配置工作,其中包括CPU、I/O、存储设备等。
7]j^/MfF[%Wn%b0关于设备驱动加载,有两部分:一部分设备驱动编入Linux Kernel中,Kernel会调用这部分驱动初始化相关设备,同时将日志输出到kernel message buffer,系统启动后dmesg可以查看到这部分输出信息。另外有一部分设备驱动并没有编入Kernel,而是作为模块形式放在initrd(ramdisk)中。51Testing软件测试网hV^z*is8].E
在2.6内核中,支持两种格式的initrd,一种是2.4内核的文件系统镜像image-initrd,一种是cpio格式。以 cpio 格式为例,内核判断initrd为cpio的文件格式后,会将initrd中的内容释放到rootfs中。
cQ`9x-nq/J [*M0initrd是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统/时,会先访问initrd文件系统。将initrd中的内容打开来看,会发现有bin、devetc、lib、procsys、sysroot、init等文件(包含目录)。其中包含了一些设备的驱动模块,比如scsi ata等设备驱动模块,同时还有几个基本的可执行程序 insmod, modprobe, lvm,nash。主要目的是加载一些存储介质的驱动模块,如上面所说的scsi ideusb等设备驱动模块,初始化LVM,把/根文件系统以只读方式挂载。51Testing软件测试网 o*Z9s/d k[)E9a
initrd中的内容释放到rootfs中后,Kernel会执行其中的init文件,这里的init是一个脚本,由nash解释器执行。这个时候内核的控制权移交给init文件处理,我们查看init文件的内容,主要也是加载各种存储介质相关的设备驱动。51Testing软件测试网3b2SO"ma"N^
驱动加载后,会创建一个根设备,然后将根文件系统/以只读的方式挂载。这步结束后释放未使用内存并执行switchroot,转换到真正的根/上面去,同时运行/sbin/init程序,开启系统的1号进程,此后系统启动的控制权移交给 init 进程。关于switchroot是在nash中定义的程序。51Testing软件测试网-Wk9|u(mDwu
Linux Kernel需要适应多种不同的硬件架构,但是将所有的硬件驱动编入Kernel又是不实际的,而且Kernel也不可能每新出一种硬件结构,就将该硬件的设备驱动写入内核。实际上Linux Kernel仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息和系统硬件信息将一部分设备驱动写入 initrd 。这样在以后启动系统时,一部分设备驱动就放在initrd中来加载。51Testing软件测试网%iUD+sP*krM
&H;X_2^0r ~;`0第四阶段:51Testing软件测试网 tb3_%`s9Q,jO
init进程起来后,系统启动的控制权移交给init进程。
,|S,h1z5?Sr0/sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作:
0O f$B&j\tF01)执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要进行运行级别的确定及相应服务的启动;
}a9UrbZ;U6N02)确定启动后进入的运行级别;
@G8PD QB03) 执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有的文件均链接至/etc/init.d下的相应文件。51Testing软件测试网&}e Q!vl
4)有关key sequence的设置51Testing软件测试网 XNh`(V\&q/gzi
5) 有关UPS的脚本定义51Testing软件测试网s#Uk#s.b`4Ay$s(h
6)启动虚拟终端/sbin/mingetty
ll mu7v6fU07)在运行级别5上运行X51Testing软件测试网9LRv$|$K b@:F,Ln
这时呈现给用户的就是最终的登录界面。51Testing软件测试网%y6JPJ6bt)Sh*uO
至此,系统启动过程完毕:)
8[7v,u7d"yA \0说明:
/} Y#Qf3V7ho Z01)/etc/rc.d/rc.sysint -- System Initialization Tasks51Testing软件测试网CoL7VCq3]z
它的主要工作有:51Testing软件测试网!k4{~h*G
配置selinux,51Testing软件测试网"b,ux1Vb*X8v&hHj^
系统时钟,
-iS:|+j$?hX0内核参数(/etc/sysctl.conf),51Testing软件测试网 o x| _+TF6b0T
hostname,
a9kW/yI0启用swap分区,51Testing软件测试网rC*gua&m
根文件系统的检查和二次挂载(读写),51Testing软件测试网!Hw0l |2I b
激活RAID和LVM设备,51Testing软件测试网kkS-up:A i@k
启用磁盘quota
5r'~ tT2z5{9p}g:n0检查并挂载其它文件系统
9J7]*XUn$]7t0等等。51Testing软件测试网"z^r^Bq
51Testing软件测试网i [l+AKeT4}-o\/E,~
GRUB的基本原理以及对GRUB的操作控制方法:51Testing软件测试网 h4n6D.HP6uG%m9[)F
GRUB全称为Grand Unified Boot Loader,是Linux操作系统主流的启动引导管理器。主要作用是启动和装载Linux操作系统。系统启动过程中一旦完成了BIOS自检,GRUB会被立刻装载。在GRUB里面包含了可以载入操作系统的代码以及将操作系统引导权传递给其他启动引导管理器的代码。GRUB可以允许用户选择使用不同的kernel启动系统,或者在启动系统的过程中设置不同的启动参数。51Testing软件测试网(a4L#X$L$Q
而通常BIOS会以下面两种方法之一来调用启动引导管理器:
zP5mtR0\I0将控制权移交给于驱动器主引导记录的initial program loader(IPL);
B#r/Nin!p0将控制权移交给其他启动引导管理器,再由他们将控制权移交给安装在分区引导扇区的IPL
#MrR1T jG R0通常情况下启动引导管理器GRUB由两部分组成(stage1和stage2):
2v\i&\#`0stage1比较小,通常可以驻留在MBR或者各个磁盘分区的启动扇区中,主要作用是装载stage2。
Li h R~ [0stage2比较大,从磁盘的启动引导分区读取51Testing软件测试网&zhQbfd%v O~
至于在stage1和stage2之间存在一个stage1.5,是因为starge1.5具有识别文件系统的能力。
]z#|Q}0Jl0在Linux系统中对GRUB的配置有两种方法:
c QX-X URJ0主要引导管理器:51Testing软件测试网0p-D"h)g!BHQwY
会将启动引导管理器的stage1安装在MBR上,这时启动引导管理器必须被配置为可以传递控制权到其他操作系统;51Testing软件测试网v EY1l"XOr
次要引导管理器:51Testing软件测试网NGaV\#np I
会将启动引导管理器的stage1安装在一些分区的引导扇区上,而其他的启动引导管理器会被安装在MBR上,由他们来向Linux启动引导管理器传递控制权。
#g)r/a&w_C D0GRUB在启动过程中可以提供命令行交互界面,可以从ext系列,reiserfs,fat等多种文件系统引导系统,并且可以提供密码加密功能,其内容在/boot分区下,系统启动过程中由配置文件/boot/grub/grub.conf来定义启动方式,对该配置文件的更改会立即生效。