浅谈linux启动流程

第一阶段:POWER-ON

       用户按下电源开关的那一瞬间,叫Power On阶段 。在这个阶段,BIOS检查电脑上一些硬件的状态及存储在CMOS中的设置。CMOS是南桥里面的一个特殊区块,用来让BIOS存储用户设置(进BIOS中看到的选项)。北桥,南桥是主板上的芯片组,AMD的cpu不使用此种架构,北桥控制CPU和内存,南桥负责PCI,USB,VGA等外围设备。


第二阶段:BIOS加电自检

       Power On阶段一开始,会进入BIOS的激活流程,BIOS是进本输入/输出系统的缩写,是在电脑没有访问磁盘前决定机器基本功能的软件,包含了控制键盘,显示屏,驱动器的代码。接着BIOS会在Flash Memory中执行,然后将自己和之前用户存储在CMOS中的资料解压到内存中。BIOS作用主要是:1>自检和初始化,检测主板硬件并通知开始执行。2>设置中断。3>加载操作系统,由BIOS转交给引导扇区,再有引导扇区跳到各分区激活相应操作系统。


第三阶段:读取MBR

       MBR(Master Boot Record,主引导记录),在硬盘的第一个扇区,上一阶段BIOS将MBR加载到内存中执行。MBR共512Byte,分成三个部分BootLoader,Partition table和Magic Number。BootLoader是MBR用来存储开机管理程序的地方(grub,lilo等)。BootLoader执行加载扇区和志向kernel的功能。Magic Number永远填入"55AA",让BootLoader中的开机管理程序确认这个地方就是MBR。


第四阶段:加载BootLoader

     当BIOS找到硬盘上的MBR后,控制权就交由BootLoader。GRUB是一个强悍的开机管理程序,支持多重开机管理。/boot/gurb目录可看到几个系统文件,主要是stage1,stage1_5,stage2这三种类型。stage1负责BIOS交给BootLoader时,载入开机管理程序,linux中是GRUB。stage1.5识别不同类型的文件系统,比如加载e2fs_stage1_5以后,就可以识别ext2格式。当stage1.5加载后,就赋予GRUB访问文件系统目录的权力,也就是说在开始找不到stage2,可以从文件系统中找到stage2的位置。stage2是GRUB最核心程序,操作系统的加载,新增参数,修改选项都由stage2负责。因此stage2不会太小,不可能放进MBR,只能放到文件系统中。而stage1.5提供识别不同文件系统的能力,真是巧妙的设计。当stage2执行时,会从现有文件系统中加载设置文件,/boot/grub/grub.conf配置文件。如下:

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)    
 #内核文件所在的设备,对grub而言,所有硬盘一律为hd#,#表示第几个磁盘,后面那个表示对应磁盘分区
# kernel /vmlinuz-version ro root=/dev/sda2
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0    
#设置默认启动的title编号,从0开始。
timeout=5  
 #等待用户选择的超时时常,单位是秒
。
splashimage=(hd0,0)/grub/splash.xpm.gz 
 #启动背景图片
hiddenmenu     
#隐藏菜单
title Red Hat Enterprise Linux 6 (2.6.32-504.el6.i686)  
#内核标题,或操作系统名称,可自由修改
root (hd0,0) 
 #内核文件所在的设备
kernel /vmlinuz-2.6.32-504.el6.i686 ro root=UUID=77085801-d743-4704-b454-46954507f798 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-504.el6.i686.img  
#initial ramdisk激活系统所需要加载的文件系统


第五阶段:内核初始化


       根据/boot/grub/grub.conf配置文件中,根据内核路径,将内核解压至内存,至此,内核获得系统控制权,BootLoader退出。内核接管以后,会执行以下几个过程:

        1>设备探测

        2>驱动初始化

        3>以只读方式挂载根文件系统(为了安全起见)

        4>装在第一个进程init(PID:1)


第六阶段:执行第一个进程/sbin/init

       /sbin/init 最主要的功能就是准备软件执行的环境,包括系统的主机名、网络设定、语言、文件系统格式及其他服务的启动。所有动作都依据/etc/inittab来规划。RHEL6版本这个文件和RHEL5区别很大,只能设置运行级别,其他相关配置配置文件中说明很清楚,理解RHEL5的inittab文件对理解RHEL6的启动机制有很大帮助。


RHEL5的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)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
# 
#id:runlevels:action:process #id:标识符;runlevel:在哪个级别执行;action:在什么情况下执行;process:要运行的程序
id:3:initdefault:  #默认运行级别3
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit 
#表示所有级别,系统初始化执行/etc/rc.d/rc.sysinit
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
l6:6:wait:/etc/rc.d/rc 6
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now  #Ctrl+alt+del组合键的功能
# 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电源故障时的操作
# Run gettys in standard runlevels
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
 
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon 
#启动图形终端


/etc/rc.d/rc.sysinit是系统初始化脚本,完成以下任务:

1>激活udev和selinux

2>根据/etc/sysctl.conf文件,设定内核参数

3>设定时钟

4>装载键盘映射

5>启动交换分区

6>设置主机名

7>根文件系统检测,并以读写方式重新挂载

8>激活RAID和LVM设备

9>启动磁盘配额

10>根据/etc/fstab,检查并挂载其他文件系统

11>清除过期的锁和PID文件


l3:3:wait:/etc/rc.d/rc 3 #进入级别3,执行/etc/rc.d/rc,/etc/rc.d/rc3.d文件夹中,K开头的服务将被关闭,S开头的将被开启,数据越小越优先被选定,最后执行rc.local,rc.local可以放入用户想要开机执行的的任务


RHEL6的inittab文件

# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
#
 System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used 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 #图形
# 6 - reboot (Do NOT set initdefault to this) #重启
# 
id:3:initdefault:

RHEL6的inittab文件只设置了默认运行级别。


第七阶段:登录


     启动虚拟终端以后便进入用户登录界面了,可以使用用户名和密码登录。


本文出自 “linux” 博客,请务必保留此出处http://yaoyaoquqi.blog.51cto.com/8124243/1619596

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。