- 开机启过程
- POST—>BOOT
SEQUENCE—> BOOTLOADER—>KERNEL +
INITRAMFS(INITRD)—>ROOTFS—>/sbin/init - POST:加电自检
- 当开机按下电源按钮后,计算机开始加电,主板上的BIOS或UEFI基本输入输出程序开始对硬件进行检查,检查内存,CPU等等吧,当检测到错误的时候机器会中断或者启动不了,这个做过电脑维护的人都知道,内存氧化可导至开不了机,还有的机器如果没插鼠标键盘自检也不会通过卡在那里了,不会继续往下走。
- Boot
sequence:选择引导顺序- 当自检通过后,接着就要选择引导介质或方式,是通过光盘启动,硬盘启动,网络启动,还是U盘启动,这些也是在BIOS中设定的,所以设定的第一启动项是哪个就从那个开始引导,这个装过WINDOWS的都很熟悉了。
- Bootloader:引导加载器
- 确定引导介质后便开始从介质中装载引导程序如grub2,这个是一个微小程序,我们知道MBR引导记录大小为512字节,其中前446个字节就是Bootloader,主要用来引导用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中的特定空间中,解压,展开,而后把系统控制权移交给内核。
- grub2就是Linux中Bootloader程序,由于MBR记录限制,所以grub2分为两个部分:
- 1.在MBR引导记录中,大小为446字节,主要功能是引导启动介质的grub主体文件
- 2.partition,/boot/grub[2],此为grub的主体。
- KERNEL +
INITRAMFS(INITRD)—>ROOTFS :加载内核- 这时候kernel开始初始化,探测可识别的硬件设备,加载硬件启动程序。以只读方式加载根文件系统
- kernel在内存中加载时,为了模拟系统环境,会生成一个ramdisk文件,来进行下一步操作,等到加载到真正的根文件系统时,就会退出ramdisk,切换到真正的根文件系统中去。
- ramdisk:内存上临时虚拟的系统
- ramdisk(虚拟磁盘,双缓冲,双缓存)---->
ramfs(虚拟文件系统) - centos5:initrd
- 工具程序:mkinitrd
- centos6,7:initramfs
- 工具程序:dracut,mkinitrd
- /sbin/init:运行用户空间的第一个应用程序
- init:
- Centos 5: SysV init 配置文件:/etc/inittab
- Centos 6: Upstart
配置文件:/etc/inittab;/etc/init/*.conf(主要) - Centos 7: systemd
配置文件:/etc/systemd/system;/usr/lib/systemd/system
- 至此,内核空间就已经启动完毕,内核启动完成接着开始启动用户态启动过程。systemd是个守护进程,pid号为1,后面所有启动的服务或进程都是systemd的子进程及子进程的子进程。
- 那么用户态的启动顺序又是什么样的呢?
- 设置默认允许级别—>初始化脚本,完成系统初始化--->关闭及启动对应级别下的服务----->设置登录终端----->[启动图形终端]
- Systemd新特性:
- 系统引导时实现服务并行启动,没有顺序之分
- 按需激活进程
- 支持系统状态快照
- 基于依赖关系定义服务控制逻辑
- 关键特性:
- 基于socket的激活机制:socket与服务程序分离;按需激活程序或服务,可并行启动
- 基于bus的激活机制:
- 基于device的激活机制:当某个硬件设备变得可用时就可激活某设备
- 基于path的激活机制
- 系统快照:保存各unit的当前状态信息于持久存储设备中
- 向后兼容sysv
init脚本
- 不兼容:
- systemctl命令固定不变,非由systemd启动的服务,systemctl无法与之通信
- 核心概念:unit
- 配置文件进行标识和配置,文件中主要包含了系统服务,监听socket,保存的系统快照以及其它与init相关的信息,保存至:
- /usr/lib/systemd/system
- /run/systemd/system
- /etc/systemd/system
- unit的类型
- Service
unit:文件扩展名为.service 无需执行权限,用于定义系统服务 - Target
unit:文件扩展名为.target,用于模拟实现“运行级别” - Device
unit:文件扩展名为.device,用于定义内核识别的设备 - Mount
unit:文件扩展名为.mount,定义文件系统挂载点 - Socket
unit:文件扩展名为.socket,用于标识进程间通信用的socket文件 - Snapshot
unit:文件扩展名为.snapshot,管理系统快照 - Swap
unit:文件扩展名为.swap,用于标识swap设备 - Automount
unit:文件扩展名为.automount,文件系统的自动挂载点 - Path
unit:文件扩展名为.path,用于定义文件系统中的一个文件或目录
- Service
- 管理系统服务
- 启动:systemctl
start name.service - 停止:systemctl
stop name .service - 重启:systemctl
restart name.service - 重载:systemctl
reload name.service - 条件式重启:systemctl
try-restart name.service - 查看某服务当前是否运行:systemctl
is-active name.service - 查看所有已经激活的服务:systemctl
list-units –type service systemctl list-units –type service –-all - 开机自启动:systemctl
enable name.service - 开机不启动:systemctl
disable name.service - 查看所有服务开机自启动状态:systemctl
list-unit-files –-type service - 查看服务是否开机自启:systemctl
is-enabled name.service - 查看服务的依赖关系:systemctl
list-dependencies name.service - 禁止设定为开机自启:systemctl
mask name.service - 取消禁止设定为开机自启:systemctl
unmask name.service
- 启动:systemctl
- Target
units:(模拟运行级别)- unit配置文件,以.target后辍名结尾
- 关机:runlevel0.target,poweroff.target
- 救援:runlevel1.target,rescue.target
- 多用户:multi-user.target
- 图形:graphical.target
- 重启:reboot.target
- 级别切换:systemctl
isolate name.target - 查看级别:systemctl
list-units –-type target systemctl
get-default - 设置级别:systemctl
set-default name.target - 切换至紧急救援模式:systemctl
rescue - 切换至emergency模式:systemctl
emergency(服务不加载不启动,驱动不加载,更彻底)
- 其它常命令
- 关机:systemctl
halt,systemctl poweroff - 重启:systemctl
reboot - 挂起:systemctl
suspend - 快照:systemctl
hibernate - 快照并挂起:systemctl
hybrid-sleep
- 关机:systemctl
- 常规启动流程
用粗体下划线标识的目标单元经常被用作启动目标。有两种方法可以指定启动目标:
(1)使用 systemd.unit= 内核命令行参数(参见systemd手册);
(2)使用
default.target 软连接。
因为 timers.target 以异步方式包含在 basic.target 中,所以 timer 单元可以依赖于在 basic.target
之后才启动的服务。
local-fs-pre.target
|
v
(各个 mounts 与 (各个 swap (各个加密块设备
fsck services) devices) devices) (各个底层服务 (各个底层API虚拟
| | | services: udevd, 文件系统 mounts:
v v v tmpfiles, random mqueue, configfs,
local-fs.target swap.target cryptsetup.target seed, sysctl ...) debugfs ...)
| | | | |
\__________________|_________________
| ___________________|____________________/
\|/
v
sysinit.target
|
____________________________________/|\________________________________________
/ | | | \
| | | | |
v v | v v
(各个 timers) (各个 paths) | (各个 sockets) rescue.service
| | | | |
v v | v v
timers.target paths.target | sockets.target rescue.target
| | | |
v \_________________ |
___________________/
.
\|/
. . . . . . . . . . . . . .
. . . . . v
basic.target
|
____________________________________/|
emergency.service
/ | |
|
| | |
v
v v v emergency.target
display- (图形界面所必须 (各个系统服务)
manager.service 的各个系统服务) |
| | v
| | multi-user.target
| | |
\_________________ | _________________/
\|/
v
graphical.target
- initrd 启动流程
basic.target
|
emergency.service
______________________/|
|
/ |
v
| sysroot.mount
emergency.target
| |
| v
| initrd-root-fs.target
| |
| v
v initrd-parse-etc.service
(各个自定义的 |
initrd services) v
| (sysroot-usr.mount 以及
| fstab 中带有 x-initrd.mount
| 标记的各个挂载点)
| |
| v
| initrd-fs.target
\______________________ |
\|
v
initrd.target
|
v
initrd-cleanup.service
(使用
isolates 启动 initrd-switch-root.target)
|
v
______________________/|
/ v
|
initrd-udevadm-cleanup-db.service
v |
(各个自定义的 |
initrd services) |
\______________________ |
\|
v
initrd-switch-root.target
|
v
initrd-switch-root.service
|
v
切换到主机上的操作系统
- 关机流程
systemd
系统在关机时同样遵循固定的流程,具体如下图
(与所有系统服务互斥)
(与所有文件系统 mounts, swaps, cryptsetup devices 互斥)
|
|
v
v
shutdown.target
umount.target
| |
\______________________
_____________/
\ /
v
(各个底层 services)
|
v
final.target
|
_____________________________________/
\_________________________________
/ | | \
| | | |
v v v v
systemd-reboot.service systemd-poweroff.service systemd-halt.service systemd-kexec.service
| | | |
v v v v
reboot.target poweroff.target halt.target kexec.target
用粗体下划线标识的目标单元经常被用作关机目标。