CentOS系统启动流程
linux系统的组成部分:内核+根文件系统、网络协议栈,文件系统、驱动程序、安全功能
内核:进程管理、内存管理,
IPC:Inte Process Communication:
消息度列、semerphor、shm、socket;
运行中的系统环境可分为两层:内核空间、用户空间
用户空间:应用程序(进程或线程)
内核空间:内核代码(系统调用)
内核设计流派
单内核设计:把所有功能集成于同一个程序;
微内核设计:每种功能通过一个单独的子系统实现;
Centos系统的启动流程(PC架构):
1、POST:自动检查各种硬件设备是否完善
通过芯片ROM:CMOS
BIOS:Basic input and output system
2、Boot Sequence(BIOS硬件上):按次序查找各个引导设备,第一个有引导程序的设备即为很次启动要用到的设备
bootloader:引导加载器,是一个安装在硬盘上或者光盘上甚至优盘上的一个引导程序
windows的引导加载器:ntloader;
Linux:
LILO:Linux LOader(早期)(手机上用的很多)
GRUB:Grand Uniform Bootloader
版本:GRUB 0.X:又叫做Grub Legacy
GRUB 1.X:又叫做:Grub2
功能:提供一个界面,允许用户选择要启动的系统或不同的内核版本;把选定的内核装载到内存中的特定空间,解压,展开,然后把系统控制权移交给内核
MBR:Master Boot Record
共512字节:
446bytes:bootloader
64bytes:fat
2bytes:
GRUB:
bootloader:第一阶段
Partition:文件系统驱动,filesysterm driver,第一点五阶段
Partition:/boot/grub,第二阶段
加载内核Kernel:
- 自身初始化:
- 探测可识别到的所有硬件设备;
- 加载硬件驱动程序(有可能会借助于randisk加载驱动);
- 以只读方式挂载根文件系统(只读方式防止内核存在问题将文件系统破坏);
- 运行用户空间第一个应用程序/sbin/init
init程序的类型
CentOS 5:SysV init
配置文件:/etc/inittab/
CentOS 6:Upstart
配置文件:/etc/inittab,/etc/init/*.conf
CentOS 7:Systemd
配置文件:/usr/liib//systemd/system/,etc/systemd/system/
ramdisk:帮助内核挂载文件系统(把内存当作硬盘)
linux内核的特性之一:使用缓冲和缓存来加速对磁盘上文件的访问;
为了防止在内存上进行二次缓存
ramdisk-->ramfs
CentOS 5:initrd
工具程序:mkinitrd
CentOS 6,7:initramfs
工具程序:dracut,mkinitrd
系统初始化流程(内核级别):
POST-->BootSequence(BIOS)-->Booloader(MBR)-->Kerenl(ramdisk)-->rootfs(readonly)-->/sbin/init()
CentOS 5(启动流程):SysV init
运行级别:系统的运行或维护等目的而设定的一种机制;
0-6:七个级别
0:关机(shutdown)
1:单用户模式(single user),root用户,无需认证;维护模式;
2:多用户模式(multi user);会启动网络功能,但不会启动NFS;仍然是维护模式
3:多用户模式(multi user)完全功能模式;文本界面
4:预留级别:目前无特别使用目的,但习惯以同三级别功能使用
5:多用户模式(mulit user)完全功能模式,图形界面;
6: 重启模式(reboot);
默认级别:3,5
级别切换:init 级别号
级别查看:
who -r
runlevel
关机:init 0
配置文件(CentOS 5):etc/inittab
每行定义一种操作(action)以及与之对应的process
每行的格式如下:
id:runlevels:action:process
-
id:一个任务的标识符;
-
runlevels:在哪儿些级别下启动此任务;可以是几个数字,也可以是连续几个数字,也可以为空(表示所有级别)
-
action:在什么条件下启动此任务
wait:等待切换至此任务所在的级别时执行一次; respawn:一旦此任务终止时,就自动重启 initdefault:设定默认运行级别;此时process会省略; sysinit:系统初始化,设定初始化方式,此处一般为指定为运行/etc/rc.d/rc.sysint脚本
-
process:具体任务;
eg:
id:3:initdefault:
默认级别为3
si::sysinit:/etc/rc.d/rc.sysinit
所有级别都会运行这个脚本
l0:0:wait:/etc/rc.d/rc 0
意味着去启动或关闭/etc/rc.d/rc3.d/目录下的服务脚本所控制服务;
K*:要停止的服务:K##*,数字越小越优先关闭,依赖别的服务的服务先关闭
S*:要启动的服务;S##*,数字越小越先启动,被依赖的服务先启动
rc脚本:接受一个运行级别数字为参数;
脚本框架:
for srv in /etc/rc.d/rc#.d/K*;
&srv stop
/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命令:
查看:chkconfig --list 【name】
添加:chkconfig --add name
#!/bin/bash
#
#chkconfig:LLL NN NN
#description:
删除:chkconfig --del name
修改制定的链接类型:
chkconfig 【--level LEVELS】 name < on|off|reset
--level LEVELS:指定要控制的级别 默认为2345
注意:正常级别下,最后启动的一个服务S99local没有链接至etc/init.d下的某脚本,而是连接到了/etc/rc.d/rc.local(etc/rc.local)脚本;因此不便或者不需要谢为服务脚本的程序期望能开机自行运行时,直接放至此脚本文件中即可,
系统初始化脚本:/etcrc.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,为了兼容centos5依然会读取/etc/inittab,但/etc/inittab/仅用于默认运行级别
注意:*.conf为upstart风格的配置文件;
rcS.conf:系统初始化脚本
rc.conf:启动或关闭服务
start-ttys.conf:启动哪儿些终端
CentOS 7:与之前版本的服务风格改变很大
init程序:systemd,配置文件:/etc/user/lib/systemd/system/,/etcsystemd/system/*
完全兼容SysV脚本机制;因此service命令依然可用
#systemctl {start|stop|restart|stauts} name[.service]