在讲linux系统启动流程之前,来讲讲linux的组成,这样能能帮助我们深入了解系统的启动流程,废话不多说直接上系统启动流程图
linux组成
linux:kernel+rootfs
kenrel的作用:进程管理、内存管理、网络管理、驱动程序、文件系统、安全管理等
rootfs:程序和glibc
库:函数结合,function,调用接口(头文件负责传输)
过程调用:procedure,无返回值
函数调用:function
程序:二进制执行文件
内核设计流派
单内核:把所有功能集成与一个程序
如:linux
微内核:每种功能使用一个单独的子系统实现
如:windows,Solaris
内核
linux内核特点
支持模块化:.ko(内核对象)
如:文件系统,硬件驱动,网络协议等,支持内核模块的动态加载和卸载
组成部分
核心文件/boot/vmlinuz-VERSION-release
ramdisk:辅助的伪根系统
CentOS5:/boot/initrf-VERSION-release.img
CentOS6.7:/boot/initramfs-VERSION-release.img
模块文件:/lib/modules/VERSION-release
CentOS6的启动流程
加载BIOS的硬件信息,获取第一个启动设备
读取第一个启动设备MBR的阴引导载程序grub的启动信息
加载核心操作系统的黑信息,核心开始解压缩,并尝试驱动硬件设备
核心执行init程序并获取运行信息
INIT执行/etc/rc.d/rc.sysinit文件
启动核心的外挂模块(/etc/modprobe.conf)
INIT执行各个批处理文件
INIt执行/etc/rc.d/rc.local
执行/bin/login程序,等待用户登录
登录之后打开开始以shell控制主机
系统整体的启动流程可以分为以下几个过程
1、 加电自检:power on system test(POST)
自检主要检测一下硬件设备是否存在并能正常运行,如:CPU,内存,硬盘是否存在并能正常运行;CPU风扇是否能够正常运转散热;以及一些外围的输入输出设备是否存在。有些设备存在与否都不影响系统地正常启动,如鼠标,键盘等
这些自检的功能是由一个软件程序来实现的,这个软件程序叫做:BIOS(Basic Inout Output System)它装载与一个硬件芯片CMOS之上,加电过程是给CMOS通电,然后启动其上的BIOS程序,BIOS根据CMOS上的信息读取其他硬件信息并检测是否存在并能正常运行,之后进行硬件设备的初始化
2、 选择启动 顺序,加载MBR
硬件设备初始化之后,BIOS会列出一些可以启动的装置顺序,读取第一个启动设备中操作系统的核心文件,而这个核心文件是由Boot Loader(引导加载器)的管理程序来管理的,Boot Loader主要去识别、加载操作系统中的核心文件,并提交到内存中运行,进而来启动操作系统
3、 加载系统内核kernel,执行系统初始化信息
在Boot Loader开始读取操作系统内核文件后,接下来就会将内核文件解压缩后装载到内存当中,内核文件通常存放在/boot目录下有一个vmlinuz打头的文件,但是此时内核程序还没有加载到磁盘,是不能读取系统上的内核文件的,linux中采用了一种叫虚拟文件系统,它跟内核文件放在同一个目录下名为init打头的文件,接下来Boot Loader程序将其加载到内存中,虚拟文件系统被解压缩并且放入内存模拟一个根文件系统,它会提供一个程序,可以加载启动过程中所需要的核心模块,加载完成,会协助内核呼叫/sbin/init来执行后续的正常启动。
4、 启动用户空间第一个执行程序/sbin/init
在内核、硬件及驱动信息加载完毕后,内核会呼叫用户空间的第一个执行程序/sbin/init,init程序主要功能时准备软件运行环境,包括系统的主机名,网络配置,文件系统格式等其他服务的启动管理,而这些所有的操作都是通过init的配置文件来定义。
init程序的类型
Sysv:init,Centos5之前
配置文件/etc/inittab
Upstart:init,CentOS6
配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd,CentOS 7
配置文件:/usr/lib/system/system
/etc/system/system
ramdisk
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
ramdisk-->ramfs提高速度
CentOS5:initrd,工具程序:mkinitrd
CentOS6:initramfs,工具程序:mkinitrd,dracut
系统初始化
POST-->BootSequence(BIOS)-->Bootloader(MBR)-->kenel(ramdisk)-->rootfs(只读)-->init(systemd)
运行级别
为系统运行或维护等目的而设定 0-6,共7个级别
0:halt关机
1:single user mode 直接以管理员的身份切入
2:multi user mode,no NFS多用户模式,启动网络功能,但不会启动NFS,维护模式
3:multi user mod ,text mode,正常模式,文本界面
4:reserved 预留级别,同三级别一样
5:multi user mode graphic mode,多用户模式,正常模式,图形界面
6:reboot 重启
默认级别:3,5
切换级别:init #
查看级别:runlevel; who -r
init初始化
init读取其初始化文件/etc/inittab
inittab完成如下任务
1、设定默认运行界别
2、运行系统初始化脚本
3、运行指定级别目录下的脚本
4、ctrlaltdel组合件操作
5、定义UPS电源在电源故障/恢复时的操作
6、启动虚拟终端(2345级别)
7、启动图形终端(5级别)
CentOS5的inittab文件
每一行定义一种action以及与之对应的process
#
# 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:3:initdefault:
# System initialization.
si::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
# 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"
# If power was restored before the shutdown kicked in, cancel it.
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
# 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发
id:runlevels:action:process 设定默认运行级别
id:标识
runlevel:在那个级别运行慈航
action在什么情况下执行慈航
process:要运行的程序
si::sysinit:/etc/rc.d/rc.sysinit 系统初始化脚本
action
initdefault:设定默认运行几倍
sysinit:系统初始化
wait:等待级别奇幻至此级别时执行
respawn:一旦程序终止,会重新启动
/etc/rc.d/rc.sysinit 系统初始化
该脚本完成如下工作
- 激活udev和selinux
- 根据/etc/sysctl.conf文件来设定内核参数
- 设定始终
- 装载键盘映射
- 启用交换分区
- 设置主机名
- 根文件系统检测,并以读写方重新挂载
- 激活RAID和lvm设备
- 启用磁盘配额
- 根据/etc/fstab检查并挂载其他文件系统
- 清理过期的锁文件的pid文件
/etc/rc.d/rc
说明:rc N –>意味着读取/etc/rc.d/rcN.d/
K*:K##*;##运行次序,数字越小,越先运行,数字越小的服务,依赖的服务先关闭,而后关闭被依赖的服务
S*:S##*;##运行次序;数字越小,越先运行,;数字越小的服务,被依赖的服务先启动,而启动依赖的服务后
for I in /etc/rc3.d/K*;do
$I stop
done
for I in /etc/rc3.d/S* ;do
$i start
done
关闭或启动的优先次序,数据越小越优先被选定,先关闭以K开头的服务然后启动以S开头的服务
服务类脚本/etc/rc.d/init.d /etc/init.d(链接文件内容跟/etc/rc.d/init.d内容太完全一样)
SysV: /etc/rc.d/init.d
服务名 {start | stop | restart |status |reload |configtest }
chkconfig命令
chkconfig runlevels ss(启动次序) kk(关闭次序)
当chkconfig命令来为此脚本在rc#.d目录创建链接时,runlevel表示默认创建为S*开头的链接,除此之外的级别默认创建为K*开头的链接,S后面的启动优先级为SS所表示的数字,K后面关闭次序KK所表示的数字,“—”表示设有默认为S*开头的链接
description:用于说明此脚本的简单功能:“\”续行
chkconfig --list:查看所有独立守护服务的启动设定
chkconfig –list service_name
chkconfig –add service_name
chkconfig –del service_name
chkconfig –35 service off
chkconfig –level service_name {on|off}
如果省略级别指定,默认为2345级别
/etc/rc.d/rc.local:系统最后启动的一个服务,准确的说应该执行的一个脚本
守护进程的类别(像第三方的应用程序)
独立守护进程
xinetd:超级独立守护进程 (代理人)
瞬时守护进程:不需要关联至运行级别,被xinetd进程所管理
进入的请求首先被xinetd代理
配置文件:/etc/xinetd.conf /etc/xinetd.d/serviername
与libwrap.so文件链接
用chkconfig控制的符
chkconfig tftp on
service命令:手动管理服务
service 服务 start | stop |restart
service --status-all 显示所有服务的状态