CentOS 系统启动流程
===============================================================================
概述:
===============================================================================
Linux系统的组成部分:内核+根文件系统
★内核的功能:
进程管理:进程之间的通信为:IPC(Inter Process Communication)机制,有消息队列、semerphor、shm、socket(跨主机之间的通信)
内存管理;
网络管理;
文件系统;
驱动程序;
安全功能;
★运行中的系统环境可分为两层:内核空间、用户空间:
用户空间:应用程序(表现为进程或线程)
内核空间 :内核代码(系统调用)
★内核的设计流派:
☉单内核设计:
把所有功能集成在同一程序;Linux
☉微内核设计:
每种功能使用一个单独的子系统实现:Windowns
★Linux内核的特点
内核模块化:.ko(kernel object) 如:文件系统,硬件驱动,网络协议等
支持模块运行时动态装载或卸载;
★Linux内核的组成部分:
☉核心文件:
/boot/vmlinuz-VERSION-release
内核官方站点:https://www.kernel.org
☉ramdisk:辅助的伪根文件系统
◆作用:加载驱动(非必要的):
CentOS 5:/boot/initrd-VERSION-release.img
CentOS6,7:/boot/initramfs-VERSION-release.img
☉模块文件:
/lib/modules/VERSION-release
演示:
[root@centos7 ~]# ll /boot 总用量 107024 -rw-r--r--. 1 root root 126426 11月 20 2015 config-3.10.0-327.el7.x86_64 drwxr-xr-x. 2 root root 26 11月 6 18:35 grub drwx------. 6 root root 104 11月 6 20:01 grub2 -rw-r--r--. 1 root root 57647694 11月 6 19:55 initramfs-0-rescue-1f994a0be331417fbd2b30aef742752e.img -rw-r--r--. 1 root root 28088280 11月 6 20:01 initramfs-3.10.0-327.el7.x86_64.img # ramdisk 文件,加载驱动 -rw-r--r--. 1 root root 10189916 11月 6 19:46 initrd-plymouth.img -rw-r--r--. 1 root root 252612 11月 20 2015 symvers-3.10.0-327.el7.x86_64.gz -rw-------. 1 root root 2963044 11月 20 2015 System.map-3.10.0-327.el7.x86_64 -rwxr-xr-x. 1 root root 5156528 11月 6 19:56 vmlinuz-0-rescue-1f994a0be331417fbd2b30aef742752e -rwxr-xr-x. 1 root root 5156528 11月 20 2015 vmlinuz-3.10.0-327.el7.x86_64 # 核心文件 [root@centos7 ~]# ls /lib/modules/3.10.0-327.el7.x86_64/kernel/ arch crypto drivers fs kernel lib mm net sound
CentOS系统启动流程概述:
注:以下讲解仅适用于PC架构的主机和MBR类型的架构
★Linux系统启动过程大致按照如下步骤进行(简述):
附图:
内核空间详细启动过程如下:
1.POST(power on system test)加电自检
★功用:
负责完成对CPU、主板、内存、硬盘子系统、显示子系统、串并行接口、键盘、CD-ROM光驱等硬件情况的检测。
ROM:BIOS(Basic Input and Output System),即基本输入输出系统,它是装载ZA在一个硬件芯片CMOS之上,加电过程就是给CMOS通电,然后启动其上的BIOS程序,BIOS程序会根据CMOS上面的一些配置信息去读取其他硬件设备信息并检测其是否存在并能正常运行,之后进行硬件设备的初始化。
CMOS:互补金属氧化物半导体,保存各项参数的设定;
ROM+RAM
2.Boot Sequnence
★功用:
按次序查找引导设备,第一个有引导程序的设备为本次启动设备,即:bootloader;
☉bootloader:引导加载器,引导程序
◆windows:
ntloader,仅是启动OS;
◆Linux的引导加载器:
LILO:LInux LOader (早期)
GRUB:GRand Unified Bootloader (现在)
GRUB 0.X(较早系列版本):Grub Legacy,
GRUB 1.X(现在使用版本):Grub2
◆grub功能:
功能丰富,提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间RAM中,解压、展开,并把系统控制权移交给内核;
☉bootloader 装在MBR中:Master Boot Record(主引导记录)
512bytes :
446bytes:bootloader,
64bytes:分区表
2bytes:55AA(有效标识)
☉GRUB(2个阶段)
bootloader : 1st stage
Partitioon :1.5 stage filesystem driver
Partitioon :2nd stage 分区文件在/boot/grub上
3.Kernel:加载系统内核,执行系统初始化信息
★自身初始化:
探测可识别到的所有硬件设备;
加载硬件驱动程序(可能借助于ramdisk加载驱动)
以只读方式挂载根文件系统;
运行用户空间的第一个应用程序:/sbin/init
☉ramdisk:
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问;
ramdisk--> ramfs 提高速度(完成对真正根文件系统的驱动加载)
CentOS 5:initrd, 创建工具程序:mkinitrd
CentOS 6:initramfs,创建工具程序:mkinitrd,dracut
一旦启动了init,内核就不管了,所有的后续操作都是由init去加载运行用户空间的应用程序来完成各种各样的工作,只有当这些应用程序完成系统调用或者系统发生中断时需要特权操作时,内核才会参与;剩余的其他过程都不在参与,而是由用户空间的程序来完成。
4.启动用户空间的第一个执行程序/sbin/init,完成系统初始化
★作用:
在内核、硬件及驱动信息加载完毕后,内核会呼叫用户空间中的第一个执行程序/sbin/init,init程序主要功能是准备软件运行环境,包括系统的主机名称、网络配置、文件系统各式等其他服务的启动管理。而这些所有的操作都是通过init的配置文件来定义。
☉init功能:
设定默认运行级别;
指定系统运行的初始化脚本;
启动指定级别下要启动的服务,并关系需要停止的服务;
定义[ctrl][alt][del]组合键的功能;
初始化字符(mingetty6)终端;
启动图形终端;
☉init程序的类型:
◆SysV:init, CentOS 5之前
配置文件:/etc/inittab
◆Upstart:init,CentOS6
配置文件:/etc/inittab, /etc/init/*.conf
◆Systemd:systemd, CentOS 7
配置文件:/usr/lib/systemd/system,/etc/systemd/system
总结:
系统初始化流程(内核级别):
POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> /sbin/init(systemd)
用户空间启动流程:第一执行程序:/sbin/init
1.init配置文件类别:
★CentOS 5:
由于centos5采用的是SysV init方式,其特点是启动用户空间的服务程序,通常通过脚本进行,有依赖关系的服务将被串行启动;这也就导致了centos5的系统启动过程非常缓慢。
其配置文件为:/etc/inittab;
★CentOS 6:
采用Upstart的方式,其特点是守护进程间的通信依赖于D-Bus进行,因此,可基本实现类似并行启动;
配置文件:/etc/inittab,/etc/init/*.conf
★CentOS 7:
采用Systemd方式,其特点是服务只有在第一次被访问时才会真正启动起来;因此centos 7系统的启动过程会非常之快;
其配置文件为:/usr/lib/systemd/*.
2.运行级别:
★运行级别:为系统运行或维护等目的而设定;0-6:7个级别
0:关机,shutdown
1:单用户模式(single user),root用户,无需认证,维护模式;
2:多用户模式(multi user),会启动网络功能,但不会启动NFS,维护模式;
3:多用户模式(multi user),完全功能模式;文本界面;
4:预留级别;目前无特别使用目的,但习惯以同3级别功能使用;
5:多用户模式(multi user),完全功能模式;图形界面
6:重启,reboot
默认级别:3, 5
切换级别:init #
查看级别:runlevel; who -r
演示:
[root@centos7 ~]# runlevel 3 5 [root@centos7 ~]# init 3 PolicyKit daemon disconnected from the bus. We are no longer a registered authentication agent. [root@centos7 ~]# runlevel 5 3 [root@centos7 ~]# who -r run-level 3 2016-09-12 19:59 last=5
3.init的处理流程:
★处理流程如下:
1)init读取其初始化文件:/etc/inittab;
2)初始运行级别(RUN LEVEL),默认的级别为3;
3)使用 /etc/rc.d/rc.sysinit 进行系统初始化;
4)对应运行级别的脚本目录,由于采用的是3级别,因此只进行 l3:wite:/etc/rc.d/rc.3
5)配置好[ctrl][alt][del]组合的功能;
6)配置不断电系统pf、pr两种机制;
7)启动mingetty 6个终端;
8)如果是5级别,则会以/etc/Xll/启动图形化界面;
4.系统初始化脚本
★/etc/rc.d/rc.sysinit:系统初始化脚本
5.CentOS 5 的配置文件/etc/inittab
★每一行定义一种action以及与之对应的process
☉语法格式:id:runlevel:action:process
id:一个任务的标识符;
runlevels:在哪些级别启动此任务;#,###,也可以为空,表示所有级别
action:在什么条件下启动此任务;
process:任务;
◆action:
wait:等待切换至此级别时运行一次;
respawn:一但此任务终止,就重新启动之
initdefault:设定默认运行级别;process省略
sysinit:设定系统初始化方式,此处一般为指定/etc/rc.d/rc.sysinit
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
示例:
id:3:initdefault:默认的运行级别为3
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 表示级别切换,开机要启动的服务等
演示:
centos 6 兼容 centos 5 [root@CentOS6 ~]# cat /etc/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) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id:3:initdefault: # 默认运行级别为 3
6.rc脚本及如何启动或关闭所对应的服务
★l0:0:wait:/etc/rc.d/rc 3 意味着去启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制的服务;
K*:要停止的服务;K##,优先级,数字越小越优先关闭,依赖的服务先关闭 ,而后关闭被依赖的
S*:要启动的服务; S##,优先级,数字越小越是优先启动,被依赖的服务先启动,而依赖的服务后启动
☉rc脚本:
接受一个运行级别数字为参数,如下:
◆rc脚本框架:
for srv in /etc/rc.d/rc#.d/K*;do $srv stop done for srv in /etc/rc.d/rc#.d/S*;do $srv start done◆/etc/init.d/*(/etc/rc.d/init.d/*)服务脚本执行方式:
# /etc/init.d/SRV_SCRIPT {start|stop|restart|status}
# service SRV_SCRIPT {start|stop|restart|status}
注意:
正常级别下,最后启动一个服务S99local没有链接至/etc/init.d下某脚本,而是指向了/etc/rc.d/rc.local(/etc/rc.local)脚本;因此,不便或不需写为服务脚本,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中。
7.启动6个终端及调用login程序
1:2345:respawn:/usr/sbin/mingettytty1
2:2345:respawn:/usr/sbin/mingettytty2
......
6:2345:respawn:/usr/sbin/mingettytty6
☉mingetty会自动调用login程序
x:5:respawn:/etc/X11/prefdm -nodaemon
8.chkconfig 命令
★chkconfig命令:
SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态:
☉用法:
◆查看:
chkconfig [--list] [name]
◆添加:
chkconfig --add name
能被添加的脚本定义格式:
#!/bin/bash # #chkconfig:LLL NN NN 表示初始在哪个级别下启动,-表示都不启动 #describtion◆删除:
chkconfig --del name
◆修改指定的链接类型
chkconfig [--level levels] name
--level LLLL: 指定要设置的级别;省略级别时表示2345
演示:
[root@CentOS6 ~]# chkconfig --list NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off abrt-ccpp 0:off 1:off 2:off 3:on 4:off 5:on 6:off abrtd 0:off 1:off 2:off 3:on 4:off 5:on 6:off acpid 0:off 1:off 2:on 3:on 4:on 5:on 6:off atd 0:off 1:off 2:off 3:on 4:on 5:on 6:off auditd 0:off 1:off 2:on 3:on 4:on 5:on 6:off autofs 0:off 1:off 2:off 3:on 4:on 5:on 6:off bgpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off blk-availability 0:off 1:on 2:on 3:on 4:on 5:on 6:off
[root@CentOS6 ~]# chkconfig --list NetworkManager NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off [root@CentOS6 ~]# chkconfig --level 35 NetworkManager on [root@CentOS6 ~]# chkconfig --list NetworkManager NetworkManager 0:off 1:off 2:off 3:on 4:off 5:on 6:off [root@CentOS6 ~]# chkconfig --level 35 NetworkManager off [root@CentOS6 ~]# chkconfig NetworkManager on [root@CentOS6 ~]# chkconfig --list NetworkManager NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off [root@CentOS6 ~]# chkconfig NetworkManager off [root@CentOS6 ~]# chkconfig --list NetworkManager NetworkManager 0:off 1:off 2:off 3:off 4:off 5:off 6:off
==============================================================================
总结:
CentOS 5用户空间的启动流程:/sbin/init(/etc/inittab)
/sbin/init--> (/etc/inittab) --> 设置默认运行级别--> 运行系统初始脚本、完成系统初始化--> (关闭对应下需要关闭的服务)启动需要启动服务--> 设置登录终端[启动图形终端]
CentOS 6 和CentOS 7 用户空间的启动流程:
★CentOS 6
init程序为:upstart, 但依然为/sbin/init;
其配置文件:/etc/inittab(仅用于定义默认级别), /etc/init/*.conf;
☉.conf 配置文件的语法遵循upstart配置文件语法格式,和CentOS 5不同,文件如下:
/etc/init/*.conf rcS.conf,rc.conf,tty.conf
☉启动流程
POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs--> switchroot--> /sbin/init-->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别--> 系统初始化脚本rc.sysinit--> 关闭或启动对应级别的服务--> 启动终端(图形终端)
★CentOS 7
init程序:systemd
配置文件:/usr/lib/systemd/system/*,/etc/systemd/system/*
完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl来控制服务;
运行命令:# systemctl {start|stop|status|resport} name.[service]
centos 6 配置文件
[root@CentOS6 ~]# ls /etc/init ck-log-system-restart.conf init-system-dbus.conf quit-plymouth.conf rcS-sulogin.conf serial.conf ck-log-system-start.conf kexec-disable.conf rc.conf readahead-collector.conf splash-manager.conf ck-log-system-stop.conf plymouth-shutdown.conf rcS.conf readahead.conf start-ttys.conf control-alt-delete.conf prefdm.conf rcS-emergency.conf readahead-disable-services.conf tty.conf
centos7 配置文件
[root@centos7 ~]# ls /usr/lib/systemd/system abrt-ccpp.service gdm.service ntpdate.service sys-fs-fuse-connections.mount abrtd.service geoclue.service oddjobd.service sysinit.target abrt-oops.service [email protected] paths.target sysinit.target.wants abrt-pstoreoops.service getty.target plymouth-halt.service sys-kernel-config.mount abrt-vmcore.service graphical.target plymouth-kexec.service sys-kernel-debug.mount abrt-xorg.service graphical.target.wants plymouth-poweroff.service syslog.socket accounts-daemon.service gssproxy.service plymouth-quit.service syslog.target.wants alsa-restore.service halt-local.service plymouth-quit-wait.service sysstat.service alsa-state.service halt.target plymouth-read-write.service systemd-ask-password-console.path alsa-store.service halt.target.wants plymouth-reboot.service systemd-ask-password-console.service anaconda-direct.service hibernate.target plymouth-start.service systemd-ask-password-plymouth.path anaconda-nm-config.service htcacheclean.service plymouth-switch-root.service systemd-ask-password-plymouth.service anaconda-noshell.service httpd.service polkit.service systemd-ask-password-wall.path
==============================================================================
如上:
CentOS系统的启动流程包括:内核空间的启动流程和用户空间的启动流程
如下图所示:
参考启动流程图(一)
参考启动流程图(二)