目录
一、启动流程
1.内核设计流派
2.Linux内核特点
3.CentOS 系统启动流程
二、CentOS 5和CentOS 6的启动流程
1.CentOS 5
总结
2.CentOS 6
回顾
参考资料
Linux:kernel+rootfs
kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能
rootfs:根文件系统
glibc:系统调用的再封装
库:函数集合, function, 调用接口
过程调用:procedure,没返回值
函数调用:function,有返回值
P.S. 库也是二进制文件,但没有独立的执行入口
程序
单内核设计:Linux
把所有功能集成于同一个程序
微内核设计:Windows, Solaris
每种功能使用一个单独子系统实现
支持模块化:.ko 内核对象
支持模块的动态装载和卸载,e.g.由硬件厂商自行设计的驱动、文件系统模块化、TCP/IP协议栈
组成部分:
核心文件:/boot/vmlinuz-VERSION-release
ramdisk:
CentOS 5:/boot/initrd-VERSION-release.img
CentOS 6:/boot/initramfs-VERSION-release.img
模块文件:/lib/modules/VERSION-release
BIOS:Basic Input and Output System基本输入输出系统 固化在ROM或NvRAM里的程序,(P.S. 计算机整个地址空间由ROM+RAM组成)其执行的功能有
①加载并读取位于主板南桥芯片组里的CMOS里的电脑配置信息
②接着进行POST(Power-On Self Test):加电自检
③然后根据BOOT Sequence:系统引导加载次序(按次序查找各引导设备,第一个有引导程序的设备即为本次启动用到设备)从启动设备中读取MBR(主引导记录)
在MBR中存储了bootloader、分区表、BRID
bootloader:引导加载器,程序,占用446个字节
windows:ntloader
Linux:
LILO:LInux LOader
GRUB:GRand Uniform Bootloader 统一引导加载器
GRUB 0.X:GRUB Legacy
GRUB 1.x:GRUB2
分区表:占用64个字节,每个主分区或扩展分区占用16个字节,如果16个字节中的第一个字节为0x80,则表示该分区为激活的分区(活动分区),且只允许有一个激活的分区
BRID(boot record ID):MBR最后的2个字节,它固定为0x55AA,用于标识该存储设备的MBR是否是合理有效的MBR,如果bios读取MBR发现最后两个字节不是0x55AA,就会读取下一个启动设备
功能:提供一个菜单,允许用户选择要启动系统或不同的内核版本;把用户选定的内核装载到内存中的特定空间中,解压、展开,并把系统控制权移交给内核
MBR:
446:bootloader
64:fat 磁盘分区表
2:55AA 有效标志
GRUB:
bootloader:1st stage
1.5阶段的代码位于MBR随后的一段空间,这样就可以找到所在分区所需的驱动
disk:2nd stage
kernel:
自身初始化:
探测可识别到的所有硬件设备
加载硬件驱动程序;(有可能会借助于ramdisk加载驱动)
以只读方式挂载根文件系统
运行用户空间的第一个应用程序:/sbin/init
init程序的类型:
SysV:init, CentOS 5
配置文件:/etc/inittab
Upstart:init, CentOS 6
配置文件:/etc/inittab, /etc/init/*.conf
Systemd:systemd, CentOS 7
配置文件: /usr/lib/systemd/system,/etc/systemd/system
ramdisk:
内核要装载根文件系统,内核本身可能无法驱动根文件系统所要用到的设备(因为驱动程序在根文件系统/lib/modules之上),借助ramdisk,可完成对所需要的驱动程序的加载,加载完驱动程序后即可装载真正的根文件系统,之后做根切换
内核中的特性之一:使用缓冲和缓存来回事对磁盘上的文件访问
ramdisk --> ramfs
CentOS 5:initrd, 由工具程序:mkinitrd生成
CentOS 6:initramfs,由工具程序:mkinitrd, dracut生成
系统初始化:
POST --> BootSequence (BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(只读) --> init
/sbin/init
运行级别:为了系统的运行或维护等应用目的而设定
0-6:7个级别
0:关机
1:单用户模式(root, 无须登录), single, 维护模式
2:多用户模式,会启动网络功能,但不会启动NFS;维护模式
3:多用户模式,正常模式;文本界面
4:预留级别;可同3级别
5:多用户模式,正常模式;图形界面
6:重启
默认级别:
3或5
切换级别:
init #
查看级别:
runlevel
who -r
配置文件:/etc/inittab
每一行定义一种action以及与之对应的process
id:runlevel:action:process
action:
wait:切换至此级别运行一次;
respawn:此process终止,就重新启动之;
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
P.S. rc 0 --> 意味着读取/etc/rc.d/rc0.d/
K*:K##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为依赖到别的服务
S*:S##*:##运行次序;数字越小,越先运行;数字越小的服务,通常为被依赖到的服务
for srv in /etc/rc.d/rc0.d/K*; do
$srv stop
done
for srv in /etc/rc.d/rc0.d/S*; do
$srv start
done
chkconfig命令
查看服务在所有级别的启动或关闭设定情形:
chkconfig [--list] [name]
添加:chkconfig --add name
SysV的服务脚本放置于/etc/rc.d/init.d (/etc/init.d)
#!/bin/bash
#
# chkconfig:LLLL nn nn
删除:chkconfig --del name
修改指定的链接类型:chkconfig [--level levels] name
--level LLLL:指定要设置的级别;省略时表示2345
P.S. 正常级别下,最后启动一个服务S99local没有链接至/etc/rc.d/init.d一个服务脚本,而是指向了/etc/rc.d/rc.local脚本;因此,不便或不需写为服务脚本放置于/etc/rc.d/init.d/目录,且又想开机时自动运行的命令,可直接放置于/etc/rc.d/rc.local文件中
tty1:2345:respawn:/usr/sbin/mingetty tty1
tty2:2345:respawn:/usr/sbin/mingetty tty2
...
tty6:2345:respawn:/usr/sbin/mingetty tty6
mingetty会调用login程序
/etc/rc.d/rc.sysinit:系统初始化脚本
①设置主机名
②设置欢迎信息
③激活udev和selinux
④挂载/etc/fstab文件中定义的文件系统
⑤检测根文件系统,并以读写方式重新挂载根文件系统
⑥设置系统时钟
⑦激活swap设备
⑧根据/etc/sysctl.conf文件设置内核参数
⑨激活lvm及software raid设备
⑩加载额外设备的驱动程序
清理操作
/sbin/init --> (/etc/inittab) --> 设置默认运行级别 --> 运行系统初始脚本、完成系统初始化 --> 关闭对应级别下需要关闭的服务,启动需要启动服务 --> 设置登录终端
init程序为:upstart, 其配置文件:
/etc/inittab, /etc/init/*.conf
注意:/etc/init/*.conf文件语法 遵循 upstart配置文件语法格式;
启动系统时,设置其运行级别1:
博客作业:系统启动流程
CentOS 6启动流程
POST --> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别 --> 系统初始化脚本 --> 关闭或启动对应级别下的服务 --> 启动终端
①马哥随堂笔记
②《鸟哥的Linux私房菜-基础篇》
注:诚恳欢迎读者对本文提出批评意见,若发现存在错误,我定第一时间修改。如果读者觉得文章对您有帮助,欢迎点赞鼓励一下哟٩(๑❛ᴗ❛๑)۶。