首页 > 代码库 > CentOS 系统启动流程
CentOS 系统启动流程
CentOS 系统启动流程
一、Linux系统的组成部分:内核+根文件系统
1.内核:
进程管理:进程之间的通信为:IPC(Inter Process Communication)机制,有消息队列、semerphor、shm、socket(跨主机之间的通信)
内存管理;
网络管理;
文件系统;
驱动程序;
安全功能;
2.运行中的系统环境可分为两层:内核空间、用户空间
用户空间:应用程序(表现为进程或线程)
内核空间 :内核代码(系统调用)
3.内核设计流派:
单内核设计:把所有功能集成与同一程序;
Linux
微内核设计:每种功能使用一个单独的子系统实现;
Windows,Solaris
4.Linux内核特点:
内核模块化:.ko(kernel object)如:文件系统,硬件驱动,网络协议等
支持模块运行时动态装载或卸载;
5.Linux内核组成部分:
1)核心文件:/boot/vmlinuz-VERSION-release
内核官方站点:https://www.kernel.org
2)ramdisk:辅助的伪根文件系统 ;作用:加载驱动(非必要的)
CentOS 5: /boot/initrd-VERSION-release.img
CentOS6,7: /boot/initramfs-VERSION-release.img
3)模块文件:/lib/modules/VERSION-release
CentOS 系统的启动流程
(注:以下讲解仅适用于PC架构的主机和MBR类型的架构)
Linux系统启动过程大致按照如下步骤进行(简述):
1)加电自检,BIOS启动引导阶段;
在该过程中实现硬件的初始化以及查找启动介质;
从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理;
2)GRUB启动引导阶段;
装载stage1
装载stage1.5
装载stage2
读取/boot/grub.conf文件并显示启动菜单;
装载所选的kernel和initrd文件到内存中
3)内核阶段:
运行内核启动参数;
解压initrd文件并挂载initd文件系统,装载必须的驱动;
挂载根文件系统
4)init用户空间初始化阶段:
启动/sbin/init程序;
运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统;
读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本;
打开字符终端1-6号控制台/打开图形显示管理,设置登录
如图所示:
一、内核空间详细过程如下:
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;
1)bootloader: 引导加载器,引导程序
windows: ntloader,仅是启动OS;
Linux:
LILO:LInux LOader
GRUB: GRand Unified Bootloader
GRUB 0.X: Grub Legacy,
GRUB 1.X: Grub2
grub功能:功能丰富,提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间RAM中,解压、展开,并把系统控制权移交给内核;
2)bootloader装在MBR中:Master Boot Record(主引导记录)
512bytes :
446bytes: bootloader,
64bytes: 分区表
2bytes: 55AA(有效标识)
3)GRUB(2各阶段)
bootloader : 1st stage
Partitioon :1.5 stage filesystem driver
Partitioon :2nd stage 分区文件在/boot/grub上
3.Kernel:加载系统内核,执行系统初始化信息
1)自身初始化:
·探测可识别到的所有硬件设备
·加载硬件驱动程序(可能借助于ramdisk加载驱动)
·以只读方式挂载根文件系统
·运行用户空间的第一个应用程序:/sbin/init
2)ramdisk:
内核中的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问
·ramdisk--> ramfs 提高速度(完成对真正根文件系统的驱动加载)
CentOS 5: initrd, 工具程序:mkinitrd
CentOS 6: initramfs,工具程序:mkinitrd,dracut
一旦启动了init,内核就不管了,所有的后续操作都是由init去加载运行用户空间的应用程序来完成各种各样的工作,只有当这些应用程序完成系统调用或者系统发生中断时需要特权操作时,内核才会参与;剩余的其他过程都不在参与,而是由用户空间的程序来完成。
4.启动用户空间的第一个执行程序/sbin/init,完成系统初始化
在内核、硬件及驱动信息加载完毕后,内核会呼叫用户空间中的第一个执行程序/sbin/init,init程序主要功能是准备软件运行环境,包括系统的主机名称、网络配置、文件系统各式等其他服务的启动管理。而这些所有的操作都是通过init的配置文件来定义。
1)init功能:
设定默认运行级别;
指定系统运行的初始化脚本;
启动指定级别下要启动的服务,并关系需要停止的服务;
定义[ctrl][alt][del]组合键的功能;
初始化字符(mingetty6)终端;
启动图形终端
2)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
3)详见用户空间启动流程
总结:系统初始化流程(内核级别):
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: 系统初始化脚本
(1) 设置主机名;
(2) 设置欢迎信息;
(3) 激活udev和selinux;
(4) 挂载/etc/fstab文件中定义的文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统;
(6) 设置系统时钟;
(7) 激活swap设备;
(8) 根据/etc/sysctl.conf文件设置内核参数;
(9) 激活lvm及软raid设备;
(10) 加载额外设备的驱动程序;
(11) 清理操作。
5.CentOS 5 的配置文件/etc/inittab
1)每一行定义一种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
2)示例启动如下:
id:3:initdefault:
默认的运行级别为3
si::sysinit:/etc/rc.d/rc.sysinit
无论运行哪个级别都会运行此脚本,系统初始化
l0:0:wait:/etc/rc.d/rc 0
...
l6:0:wait:/etc/rc.d/rc 6
6.启动或关闭所对应的服务
意味着去启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制的服务;
K*:要停止的服务;K##,优先级,数字越小越优先关闭,依赖的服务先关闭 ,而后关闭被依赖的
S*要启动的服务; S##,优先级,数字越小越是优先启动,被依赖的服务先启动,而依赖的服务后启动
rc脚本:接受一个运行级别数字为参数,如下:
[root@CentOS6 ~]# ls /etc/rc.d/ init.d rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.local rc.sysinit [root@CentOS6 ~]# ls /etc/rc.d/rc3.d/ K01smartd K30spice-vdagentd K73winbind K84ospfd K89rdisc S08iptables S13rpcbind S25netfs S55sshd S99local K05wdaemon K50dnsmasq K74ntpd K84ripd K92pppoe-server S10network S15mdmonitor S26acpid S80postfix K10psacct K50snmpd K75ntpdate K84ripngd K95rdma S11auditd S22messagebus S26haldaemon S82abrt-ccpp K10saslauthd K50snmptrapd K75quota_nld K84wpa_supplicant K99rngd S11portreserve S24nfslock S26udev-post S82abrtd K15htcacheclean K60nfs K84bgpd K85zebra S01sysstat S12rsyslog S24rpcgssd S28autofs S90crond K15httpd K61nfs-rdma K84NetworkManager K87restorecond S02lvm2-monitor S13cpuspeed S25blk-availability S50bluetooth S95atd K15svnserve K69rpcsvcgssd K84ospf6d K89netconsole S08ip6tables S13irqbalance S25cups S50kdump S99firstboot
脚本框架:
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
===========================================================================================
chkconfig 命令:
SysV的服务脚本放置于/etc/rc.d/init.d(/etc/init.d)
管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态:
查看:
chkconfig [--list] [name]
添加:
chkconfig --add name
能被添加的脚本定义格式:
#!/bin/bash
#LLLL 表示初始在哪个级别下启动,-表示都不启动
# chkconfig: LLLL nnnn
删除:
chkconfig --del name
修改指定的链接类型
chkconfig [--level levels] name <on|off|reset>
--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
总结:CentOS 5用户空间的启动流程:/sbin/init(/etc/inittab)
/sbin/init--> (/etc/inittab) --> 设置默认运行级别--> 运行系统初始脚本、完成系统初始化--> (关闭对应下需要关闭的服务)启动需要启动服务--> 设置登录终端
CentOS 6
init程序为: upstart, 但依然为/sbin/init;
其配置文件:/etc/inittab(仅用于定义默认级别), /etc/init/*.conf;
配置文件的语法遵循upstart配置文件语法格式,和CentOS5不同
文件如下:
/etc/init/*.conf rcS.conf,rc.conf,tty.conf
[root@CentOS6 ~]# cd /etc/init [root@CentOS6 init]# ls 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
CentOS 6启动流程
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]
文件如下:
[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 getty@.service 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系统的启动流程包括:内核空间的启动流程和用户空间的启动流程
如下图所示:
CentOS 系统启动流程