浅谈linux启动流程(共7个阶段)
linux启动的第一阶段:POWER-ON
用户按下电源开关的那一瞬间,叫Power On阶段 。在这个阶段,BIOS检查电脑上一些硬件的状态及存储在CMOS中的设置。CMOS是南桥里面的一个特殊区块,用来让BIOS存储用户设置(进BIOS中看到的选项)。北桥,南桥是主板上的芯片组,AMD的cpu不使用此种架构,北桥控制CPU和内存,南桥负责PCI,USB,VGA等外围设备。
linux启动的第二阶段:BIOS加电自检
Power On阶段一开始,会进入BIOS的激活流程,BIOS是进本输入/输出系统的缩写,是在电脑没有访问磁盘前决定机器基本功能的软件,包含了控制键盘,显示屏,驱动器的代码。接着BIOS会在Flash Memory中执行,然后将自己和之前用户存储在CMOS中的资料解压到内存中。BIOS作用主要是:1>自检和初始化,检测主板硬件并通知开始执行。2>设置中断。3>加载操作系统,由BIOS转交给引导扇区,再有引导扇区跳到各分区激活相应操作系统。
linux启动的第三阶段:读取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。
linux启动的第四阶段:加载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激活系统所需要加载的文件系统
linux启动的第五阶段:内核初始化
根据/boot/grub/grub.conf配置文件中,根据内核路径,将内核解压至内存,至此,内核获得系统控制权,BootLoader退出。内核接管以后,会执行以下几个过程:
1>设备探测
2>驱动初始化
3>以只读方式挂载根文件系统(为了安全起见)
4>装在第一个进程init(PID:1)
linux启动的第六阶段:执行第一个进程/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, <miquels@drinkel.nl.mugnet.org>
- # 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启动的第七阶段:登录
启动虚拟终端以后便进入用户登录界面了,可以使用用户名和密码登录Linux系统了,如果忘记了账号、密码的话,可以参与路由器网的相关文章,里面会告诉你解决方案。