MBR结构+linux系统启动过程

MBR,全称为Master Boot Record,即硬盘的主引导记录
 446Byte
  16x4Byte
2 
  boot loade
  Partition table
 结束标志55AA
PT:包含以下三个部分
1)、Partition ID  (5:延申  82:Swap   83:Linux   8e:LVM     fd:RAID)
2)、Partition起始磁柱          3)、Partition的磁柱数量
综述:Linux在初始时通过Partition table的信息识别硬碟设备。
 
一般MBR从物理层面来分析包含整个扇区(引导程序、分区表及分隔标识),也就是主引导记录;假单的理解MBR仅指引导程序。
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR)。它由三个部分组成,主引导程序、 硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。在总共512字节的主引导扇区主引导程序(boot loader)占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magic number,占2个字节,固定为55AA。
 
 
之所以先介绍MBR,是因为MBR是物理介质,大家只能看图去理解他,不能亲眼所见。好了不多谈这块了,下面我说一下linux的启动过程。
BIOS --- MBR(stage1) --- stage2(/boot) --- /etc/grub.conf --- title --- kernel ---root---init---/etc/inittab---/etc/rc.d/rc.sysinit---/etc/ra.d/rc---/etc/rc.d/rc?.d/---/etc/rc.d/rc.local
BIOS检测硬件(如内存、CPU、硬盘),然后交给GRUB引导,在这里GRUB引导分为stage1和stage2两个部分。GRUB安装于MBR当中,stage1直接写入了MBR,这样机器一启动检测完硬件后,就将控制权交给了GRUB的代码(由上面流程可见);接下来的步骤是stage1找到stage2并将控制权交给stage2,在这里可能会有一个疑问,stage1在MBR中,那stage2在哪呢?一般stage2会有boot的分区,这是因为由于stage2很大,没有办法存放在MBR中。
[east@localhost ~]$ du -b /boot/grub/stage1
512     /boot/grub/stage1
[east@localhost ~]$ du -b /boot/grub/stage2
104988  /boot/grub/stage2

 接着系统从stage2中调启gurb.conf配置文件,在这里grub.conf里面选择一个title来启动相应该的kernel,这时内核启动,将kernel加载到内存,同时对根(root)进行加载,部分设备驱动就放在initrd中来加载;这样系统启动起来了,等init进程起来后,系统启动的控制权移交给init进程,init它首先会读取初始化文件/etc/inittab ;init初如化进行以下工作:
1)执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行起来了,后面需要进行运行级别的确定及相应服务的启动;
2)确定启动后进入的运行级别;
3) 执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有的文件均链接至/etc/init.d下的相应文件。
4)捕获某个关键字顺序
5) 有关UPS的脚本定义
6)在虚拟终端生成getty,并启动/sbin/mingetty
7)在运行级别5上运行X
这时呈现给用户的就是最终的登录界面。
至此,系统启动过程完毕:)

 [root@localhost ~]# cat /etc/inittab
#
# inittab       This file describes how the INIT process should set up
#               the system in a certain run-level.
#
# Author:       Miquel van Smoorenburg, <[email protected]>
#               Modified for RHS Linux by Marc Ewing and Donnie Barnes
#

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)                           #系统停止
#   1 - Single user mode                                                        #单用户模式
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)     #本地多用户,没有远程网络(例如NFS)
#   3 - Full multiuser mode                                                 #多用户,有网络
#   4 - unused                                                                       #未使用
#   5 - X11                                                                             #X windows(多用户,有网络)
#   6 - reboot (Do NOT set initdefault to this)                #重新启动
#
id:5:initdefault:                     #如果缺少该init默认行,引导进程将暂停。在继续之前,控制台会提示请求输入要定义的运行等级,该inittdefault行一般定义运行等级3或者5。

# System initialization.                                   
si::sysinit:/etc/rc.d/rc.sysinit       

#引导脚本/etc/rc.d/rc.sysinit说明:
激活udev和selinux;
设定系统时钟;
装载按键设置;
启动swap分区;
设置主机名,hostname;
根文件系统的检查和二次挂载(读写);
激活RAID和LVM设备;
启用磁盘配额quota;
检查并挂载其它文件系统;
清理过时的锁和PID。

 

l0:0:wait:/etc/rc.d/rc 0                    
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5              #0~6个运行等级当运行级别为5时,以5为参数运行 /etc/rc.d/rc5 脚本,init将等待其返回(wait)

l6:6:wait:/etc/rc.d/rc 6

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now    #在启动过程中允许按 CTRL-ALT-DELETE 重启系统

# When our UPS tells us power has failed, assume we have a few minutes
# of power left.  Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly. 
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

#当UPS马上供电不足时,UPS电源会发送一条命令给服务器,要求服务器在2分钟内自动关机并告知所有用户 "Power Failure; System Shutting Down"

# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

#当在关机过程中,市电马上又恢复了,这时UPS会马上给服务器发送一条停止关机的命令,并告诉所有的用户 "Power Restored; Shutdown Cancelled"


# Run gettys in standard runlevels             #在虚拟控制台生成getty
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

###在2、3、4、5级别上以tty X为参数执行 /sbin/mingetty 程序,打开 tty X终端用于用户登录,
如果进程退出则再次运行mingetty程序(respawn)

 

# Run xdm in runlevel 5                  
x:5:respawn:/etc/X11/prefdm -nodaemon            #表示启动后在x window模式下执行一次prefdm -nodaemon
[root@localhost ~]#

以下内容来源于网络,具体是哪位的没来的急记录,不好意思 

各字段解释如下:
  id:runlevels:action:process
  id:是一个任意指定的四个字符以内的序列标号,在本文件内必须唯一;使用老版本的libc5(低于5.2.18)或a.out库编译出来的sysvinit限制为2字符。注意:像getty之类的登陆进程必须使id字段与tty编号一致,如tty1需要id=1,许多老版本的登陆进程都遵循这种规则。
  runlevels:表示这一行适用于运行那个/些级别(这里是2,可以有多个,表示在相应的运行级均需要运行);另外sysinit、boot、bootwait这三个进程会忽略这个设置值。
  action:表示进入对应的runlevels时,init应该运行process字段的命令的方式,常用的字段值及解释在附录内。例子中的wait表示需要运行这个进程一次并等待其结束。
  process:具体应该执行的命令。例子中的/etc/init.d/rc命令启动运行级别2中应该运行的进程/命令,并负责在退出运行级时将其终止(当然在进入的runlevel中仍要运行的程序除外。)
当运行级别改变,并且正在运行的程序并没有在新的运行级别中指定需要运行,那么init会先发送一个SIGTERM 信号终止,然后是SIGKILL。

有效的action值如下:
  respawn:表示init应该监视这个进程,即使其结束后也应该被重新启动。
  wait:   init应该运行这个进程一次,并等待其结束后再进行下一步操作。
  once:   init需要运行这个进程一次。
  boot:   随系统启动运行,所以runlevel值对其无效。
  bootwait:随系统启动运行,并且init应该等待其结束。
  off:     没有任何意义。
  initdefault:系统启动后的默认运行级别;由于进入相应的运行级别会激活对应级别的进程,所以对其指定process字段没有任何意义。如果inittab文件内不存在这一条记录,系统启动时在控制台上询问进入的运行级。
  sysinit:  系统启动时准备运行的命令。比如说,这个命令将清除/tmp。可以查看/etc/rc.d/rc.sysinit脚本了解其运行了那些操作。
  powerwait:允许init在电源被切断时,关闭系统。当然前提是有U P S和监视U P S并通知init电源已被切断的软件。RH linux默认没有列出该选项。
  powerfail:  同powerwait,但init不会等待正在运行的进程结束。RH linux默认没有列出该选项。
  powerokwait:当电源监视软件报告“电源恢复”时,init要执行的操作。
  powerfailnow:检测到ups电源即将耗尽时,init要执行的操作,和powerwait/powerfail不同的哟。
  ctrlaltdel:允许init在用户于控制台键盘上按下C t r l + A l t + D e l组合键时,重新启动系统。注意,如果该系统放在一个公共场所,系统管理员可将C t r l + A l t + D e l组合键配置为别的行为,比如忽略等。我是设置成打印一句骂人的话了^o^。
  kbrequest:监视到特定的键盘组合键被按下时采取的动作,现在还不完善。
  ondemand:A process marked with an ondemand runlevel will be executed whenever the specified ondemand runlevel is called.  However, no runlevel change will occur (ondemand runlevels are ‘a’, ‘b’,and ‘c’), (英语太菜,那个however不知道该怎么翻译才好。惭愧!) 


     补充:
   1、关于进入单用户模式,一般都是采用设置initdefault为1或者在grub/lilo中指定一个“single”或“emergency” 命令行参数来实现。其实另外还有一个更干净的方法,编辑:
kernel /vmlinuz-2.6.9-22.EL ro root=[color=Red][font=黑体]/bin/sh[/font][/color],这样init就直接启动一个shell,其他任何进程都没有启动哦,够干净吧!
   2、系统正在运行时,telinit命令可更改运行级别。运行级别发生变化时, init 就会从/etc/inittab运行相应的命令。 

 

 以上就是启动过程,其实理解起来不难,主要是要记住一些东西,有点费神

本文出自 “RCHE” 博客,转载请与作者联系!

你可能感兴趣的:(linux,职场,休闲,linux系统启动过程,MBR结构)