一、简述
CentOS启动流程
二、使用
1.POST(Power On Self Test)
计算机接通电源后,系统进行的一个自我检查的例行程序,这个程序通常称为POST(加电自检),此过程会对系统几乎所有硬件进行检测。此时系统的控制权就交由BIOS来完成
POST大致检测过程为:加电-CPU-ROM-BIOS-System Clock-DMA-64KB RAM-IRQ-显卡等。
( 此过程详细参考:http://blog.sina.com.cn/s/blog_61746be701017x3g.html )
2.BOOT Sequence
BIOS按次序查找各个引导设备,找到的第一个有引导程序的设备即为本次启动用到的设备。
查找引导实际上是在磁盘的MBR中查找引导加载器/引导程序(bootloader)。
2.1)MBR(Master Boot Record)
硬盘的0柱面、0磁头、1扇区称为主引导扇区、MBR(主引导记录),其总共大小为512字节,由三部分组成。
组成部分 | 大小(字节) |
bootloader(主引导程序) | 最大为446 |
DPT(硬盘分区表) | 64 |
55AA(分区有效标志) | 2 |
此阶段的过程是:BIOS将找到MBR,然后将找到MBR中的bootloader加载到内存中,此阶段也被称之为GRUB的第一阶段(stage1)。
2.2)bootloader
bootloader就是一段小程序,通过这段小程序可以初始化硬件设备,建立内存空间的映射图,将系统的软硬件环境带到一个合适的状态,为后期调用操作系统内核做准备。
bootloader分类
系统 | 类别 |
Windows | ntloader |
Linux | LILO(LInux LOader) GRUB(GRand Uniform Bootloader) |
此处仅简单介绍GRUB,GRUB功用如下:
提供一个菜单,允许用户选择要启动系统或不同的内核版本,把用户选定的内核装在到内核中特定的空间中,解压、展开,并把系统控制权交给内核。 |
此阶段的过程对于GRUB来说,有两个阶段:
stage1.5:加载MBR之后的扇区,识别stage2所在分区上的文件系统。
stage2:读取/boot/grub/grub.conf或等配置文件,为用户显示GRUB选项、信息,确定内核启动参数等。
3.Kernel(ramdisk)
通过上一阶段,kernel已经被读到,其内存上的环境也已经准备好了,此时kernel开始解压缩,并将解压后的内核放置在内存中,调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。Linux内核建立后,基于Linux的程序则可以正常运行。
此阶段中也被称之为kernel的自身初始化,其主要操作有:
探测可识别到的所有硬件设备。
加载硬件驱动程序(因为内核解压缩装载在内存中,所以内核要足够小,驱动就未被封装在内核中,此文件称为核心文件,其核心文件一般路径及格式:/boot/vmlinuz-VERSION-release),有可能会借助于ramdisk(ramdisk,即虚拟内存盘,用于通过软件将一部分内存(RAM)模拟为硬盘来使用的一种技术)来加载驱动。
以只读方式挂载根文件系统。
运行用户空间的第一个应用程序:/sbin/init 。
4.Init/Systemd
init程序是Linux系统不可获取的程序之一,init进程是由内核启动的用户级进程,其路径在/sbin/init或/bin/sh。内核通过启动第一个init程序(init进程编号为1)的方式来完成其它进程的引导。
systmed 是一个用户空间的程序,属于应用程序,不属于 Linux 内核范畴。Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 SysV init 固有的缺点,提高系统的启动速度。
4.1)进程编号为“1”的程序分类
系统 | 类型 | 第一个程序 | 配置文件 |
CentOS 5 | SysV | init | /etc/inittab |
CentOS 6 | Upstart | init | /etc/inittab,/etc/init/*.conf |
CentOS 7 | Systemd | systemd | /usr/lib/systemd/system,/etc/systemd/system |
SysV、Upstart、Systemd三者比较(Systemd加速启动原理)
4.2)此阶段涉及流程
4.2.1)CentOS 5 、CentOS 6
CentOS 5 init程序为:SysV 配置文件为 /etc/inittab
读取/etc/inittab文件( inittab文件里面定义了系统默认运行级别 )
# 读取/etc/inittab文件的功用
初始运行级别(RUN LEVEL)
系统初始化脚本
对应运行级别的脚本目录
定义UPS电源终端/恢复脚本
在虚拟控制台生成getty,以生成终端
在运行级别5初始化X
运行级别:为了系统的运行或维护等应用目的而设定
0-6(7个级别)
级别 | 功用 |
0 | 关机 |
1 | 单用户模式(root,无须登录),single,维护模式 |
2 | 多用户模式,会启动网络功能,但不会启动NFS,维护模式 |
3 | 多用户模式,正常模式,文本界面 |
4 | 预留级别,可同级别3 |
5 | 多用户模式,正常模式,图形界面 |
6 | 重启 |
级别查看
默认级别 :3,5
切换级别:
~]# init #
查看级别:
~]# runlevel
~]# who -r
配置文件
# 文件位置:/etc/inittab
# 文件格式
每一行定义一种action 以及与之对应的process
id:runlevel:action:process
action
wait:切换至此级别时执行一次
respawn:此process终止,就重新启动之
initdefault:设定默认运行级别,process省略(“:”不可省)
sysinit设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
...
案例
id:3:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
...
l6:6:wait:/etc/rc.d/rc.6
# 说明
rc 0 --> 意味着读取/etc/rc.d/rc0.d/
K*:K##*:##运行次序,数字越小,越先运行,数字越小的服务,通常为依赖到别的服务
S*:S##*:##运行次序,数字越小,越先运行,数字越小的服务,通常为被依赖到的服务
# K*与S*通常是脚本应用的方式,例如
for srv in /etc/rc.d/rc0.d/K*;do
$srv stop
done
for srv in /etc/rc.d/rc0.d/S*;do
$srv start
done
chkconfig命令
查看服务在所有级别的启动或关闭设定情况
# 格式
chkconfig [--list] [name]
# 添加(SysV 的服务脚本放置于/etc/rc.d/init.d (/etc/init.d))
chkconfig --add name
#!/bin/bash
#
# chkconfig:LLLL nn nn
# 删除
chkconfig --del name
# 修改指定的链接类型
chkconfig [--level levels] name <on|off|reset>
--level LLLL:指定需要设置的级别,省略时表示2345
系统初始化
系统初始化脚本,完成系统初始化
/etc/rc.d/rc.sysinit :系统初始化脚本
# 功用
设置主机名
设置欢迎信息
激活udev和selinux(可以在grub.conf中的kernel行添加selinux=0,以此来关闭selinux)
挂载/etc/fstab文件中定义的文件系统
检测根文件系统,并以读写方式重新挂载根文件系统
设置系统时钟
激活swap设备
根据/etc/sysctl.conf文件设置内核参数
激活lvm及software raid设备
加载额外设备的驱动程序
清理操作
启动对应服务
各种服务存在的位置/etc/rc#.d/文件,其中名称为“S”开头代表开机启动的服务,名称为“K”开头的是关机要执行的任务。#代表数字,一个数字代表一个运行级别,即上述的级别0-6(7个运行级别)。
CentOS 6 init程序为:upstart 配置文件为 /etc/inittab,/etc/init/*.conf
注意:/etc/init/*.conf文件语法遵循upstart配置文件的语法格式。
4.2.2)CentOS 7
基本上可以参考CentOS 5与CentOS 6系统进行对比。
执行initrd.target
包括挂载/etc/fstab文件中的系统,此时挂载后,就可以切换到根目录了
从initramfs根文件系统切换到磁盘根目录
systemd执行默认target配置
centos7表面是有“运行级别”这个概念,实际上是为了兼容以前的系统,每个所谓的“运行级别”都有对应的软链接指向,默认的启动级别时/etc/systemd/system/default.target,根据它的指向可以找到系统要进入哪个模式。
模式:
0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
systemd执行sysinit.target
在CentOS6上是被叫做rc.sysint程序,初始化系统及basic.target准备操作系统
systemd启动multi-user.target下的本机与服务器服务
systemd执行multi-user.target下的/etc/rc.d/rc.local
Systemd执行multi-user.target下的getty.target及登录服务
getty.target是启动终端的systemd对象
如果到此步骤,系统没有被指定启动图形桌面,到此就可以结束了,如果要启动图形界面,需要在此基础上启动桌面程序。
5.执行/bin/login
执行/bin/login程序,等待用户登录
三、补充
正常级别下,最后启动的一个服务(S99local)没有链接至 /etc/rc.d/init.d/ 的一个服务脚本,而是指向了 /etc/rc.d/rc.local 脚本,因此,不便于或不需要将服务脚本放置于 /etc/rc.d/init.d/ 目录,且又想开机时自动运行的命令,则可直接放置于 /etc/rc.d/rc.local 文件中。
登录程序案例
tty1:2345:respawn:/usr/sbin/mingetty tty1
tty2:2345:respawn:/usr/sbin/mingetty tty2
tty3:2345:respawn:/usr/sbin/mingetty tty3
tty4:2345:respawn:/usr/sbin/mingetty tty4
tty5:2345:respawn:/usr/sbin/mingetty tty5
tty6:2345:respawn:/usr/sbin/mingetty tty6
# mingetty 会调用login程序
系统启动时的操作,其运行级别应该设置为1。