CentOS系统启动流程
Linux系统的组成部分:内核+根文件系统
内核:进程管理、内存管理、网络协议栈、文件系统、驱动程序、安全功能
IPC:Inter Process Communication
消息队列、semerphor、shm(共享内存)
socket(跨主机的通讯,套接字。)
运行中的系统环境分两层:内核空间,用户空间。
用户空间:运行应用程序(进程或线程)
内核空间:运行内核代码(系统调用)---文件系统运行在内核空间。
内核设计流派:
单内核设计:把所有功能集成于同一个程序;
Linux使用单内核。
微内核设计:每种功能使用一个单独的子系统实现;
Windows, Solaris
Linux内核特点:
支持模块化:可以把其中重要的和不重要的,必须的和不必须的功能,划分为一个个模块。一般叫 .ko(kernel object)
动态装、卸载:
模块里面是一些驱动程序。
内核组成部分:内核我文件、模块文件。
核心文件:/boot/vmlinuz-VERSION-release -----使用 uname -r 查看。
ramdisk:
CentOS 5:/boot/initrd-VERSION-release.img----当做磁盘
CentOS 6,7:/boot/initramfs-VERSION-release.img---当做文件系统(避免双缓存,避免双缓冲,提高效率)
模块文件:/lib/modules/VERSION-release ------使用 ls /lib/modules 查看。
内核要驱动根文件系统,则要先加载根文件系统的驱动,这个驱动根文件系统的驱动叫,临时根文件系统ramdisk。
CentOS系统启动流程:
第一步 POST :加电自检---开机时自动检查计算机的各种硬件是否存在。
第二步 Boot Sequence:
按次序查找各引导设备,第一个有引导程序的设备即为本次启动要用到的设备 叫 bootloader。
bootloader:引导加载器,程序。
对于Linux的bootloader叫grub。
GRUB 0.X:Grub Legacy CentOS 5
GRUB 1.X:Grub2 CentOS 6、7
grub功能:提供一个菜单,允许用户选择要启动的系统或不同的内核版本; 把用户选定的内核装载到RAM中的特定空间中,解压、展开,而后把系统控制权移交给内核;
MBR:Master Boot Record
512bytes:
446bytes:bootloader
64bytes:fat ---分区表
2bytes:55AA
GRUB:
bootloader:1st stage
Partition:filesystem driver, 1.5 stage
Partition:/boot/grub, 2nd stage
Kernel:
第三部:加载内核
自身初始化:
1、探测可识别到的所有硬件设备;
2、加载硬件驱动程序;(有可能会借助ramdisk加载驱动)
3、以之读方式挂载跟文件系统;
4、运行用户空间的第一个应用程序:/sbin/init
init程序的类型:
CentOS 5 :SysV init 在/etc/inittab
CentOS 6 :Upstart 在/etc/init/*.conf
CentOS 7 :Systemd 在/usr/lib/systemd/system/, /etc/systemd/system/
ramdisk的解释,以及运行级别
ramdisk:在装系统完成后,探测当前硬件设备机制动态创建的。
ramdisk:把内存内的某一段空间当磁盘用,创建一个临时的跟文件系统来 启动跟文件系统。
Linux内核的特性之一:使用缓冲和缓存来加速对磁盘上的文件访问。
ramdisk--->ramfs(换成文件系统,这是一种提速机制)。
ramdisk对于CentOS 5 、6 、7 的区别:
CentOS 5:/boot/initrd-VERSION-release.img
initrd此文件是由工具创建的--mkinitrd
CentOS 6 、7:/boot/initramfs-VERSION-release.img
initramfs此文件是由工具创建的---dracut
CentOS 5 : SysV init
运行级别---为系统的运行级别说维护等目的而设置的机制。
0-6:7个级别
0:关机
1:单用户模式(single user)指的是root用户,无需认证,维护模式
2:多用户模式(multi user)会启动网络功能,但不会启动NFS,维护模式
3:多用户模式(multi user)完全功能模式,只会文本界面,不会激活桌面系统。
4:预留模式,目前无使用目的,但习惯以同3级别功能使用
5:多用户模式(multi user)完全功能模式,启动图形界面(桌面系统)
6:重启,reboot
默认级别:3 5 (服务器用3,个人有5)
级别切换:init#
级别查看:who -r
runlevel
总结:系统初始化流程(内核级别):POST-->Boot Sequence-->bootloader(MBR)-->Kernel(ramdisk来完成跟文件系统的启动)-->rootfs(readonly)-->/bin/init
init要运行通过 配置文件:/etc/inittab
(CentOS 5 )每一行定义一种action(操作)以及与之对应的process
id:runlevels:action:process
id:一个任务的标识符
runlevels:在哪些级别启动此任务,#,###也可为空,表示所有级别
action:在什么条件下启动此任务
process:任务
action:
wait:等待切换至此任务所在的级别时执行一次
respawn:此任务终止时,就自定重新启动
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
意味着去启动或关闭/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}
chkconfig命令:管控/etc/init.d/每个服务脚本在各级别下的启动或关闭状态;
chkonfig --list 查看级别的开启关闭状态。
chkonfig --add name:添加
能被添加的脚本格式:
chkonfig:LLL NN NN
LLL:正在运行的级别
NN:启动优先级
NN:关闭优先级
chkonfig --del name:删除
修改指定的连接类型:
chkconfig [--level LEVELS] name <on|off|reset>
--level LEVELS:指定要控制的级别;默认为2345;
注意:正常级别下,最后启动的一个服务S99local没有链接至/etc/init.d下的某脚本,而是链接至了/etc/rc.d/rc.local (/etc/rc.local)脚本;因此,不便或不需写为服务脚本的程序期望能开机自动运行时,直接放置于此脚本文件中即可。
系统初始化脚本:/etc/rc.d/rc.sysinit
(1) 设置主机名;
(2) 设置欢迎信息;
(3) 激活udev和selinux;
(4) 挂载/etc/fstab文件中定义的所有文件系统;
(5) 检测根文件系统,并以读写方式重新挂载根文件系统;
(6) 设置系统时钟;
(7) 根据/etc/sysctl.conf文件来设置内核参数;
(8) 激活lvm及软raid设备;
(9) 激活swap设备;
(10) 加载额外设备的驱动程序;
(11) 清理操作;
总结(用户空间的启动流程):/sbin/init(/etc/inittab)
设置默认运行级别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务--> 设置登录终端 [--> 启动图形终端]
CentOS 6:
init程序:upstart,但依然为/sbin/init,其配置文件:
/etc/init/*.conf, /etc/inittab(仅用于定义默认运行级别)
注意:*.conf为upstart风格的配置文件;
rcS.conf:系统初始化脚本
rc.conf:启动或关闭服务
start-tty.cof:
CentOS 7:
init程序:systemd,配置文件:/usr/lib/systemd/system/*, /etc/systemd/system/*
完全兼容SysV脚本机制;因此,service命令依然可用;不过,建议使用systemctl命令来控制服务;
# systemctl {start|stop|restart|status} name[.service]
CentOS启动流程:POST --> Bootloader(BIOS, MBR) --> Kernel(initrd) --> rootfs --> switch_root --> /sbin/init-->设置默认运行级别 --> 运行系统初始化脚本,完成系统初始化 --> 关闭对应级别下需要停止的服务,启动对应级别下需要开启的服务--> 设置登录终端 [--> 启动图形终端]
内核文件:/boot/vmlinuz
内核模块(磁盘的加载驱动程序):/lib/modules
虚拟文件系统(ramdisk):一般使用的文件名为/boot/initrd
执行等级(runlevel):/etc/inittab
运行用户空间的第一个应用程序:/sbin/init
自定义开机启动程序:/etc/rc.d/rc.local
每个服务脚本在各级别下的启动或关闭状态:/etc/init.d/(chkconfig来查看)
系统初始化脚本:/etc/rc.d/rc.sysinit