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