systemd-min.jpg

systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序。功能包括:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。systemd 支持 SysV 和 LSB 初始脚本,可以替代 SysVinit。除此之外,功能还包括日志进程、控制基础系统配置,维护登陆用户列表以及系统账户、运行时目录和设置,可以运行容器和虚拟机,可以简单的管理网络配置、网络时间同步、日志转发和名称解析等

Upstart-min.jpg

Upstart 由 Ubuntu 所开发,它基于事件驱动模型(event-based),能够在监听到事件发生后以异步的方式响应事件,从而实现并行启动服务进程(引导过程更快)。同时可以按需启动服务,比如在系统运行期间插入 USB 设备后,会触发相应的事件,此时 Upstart 才启动对应的服务

SysVinit-min.jpg

SysVinit 是 System V 风格的 init 系统,它源于 System V 系列的 UNIX,比 BSD 风格的 init 更灵活,CentOS 5 的初始化程序就采用了它。SysVinit 采用脚本的方式来串行启动服务(速度较慢),一般设置了 6 个运行级别(runlevel),它的默认配置文件 /etc/inittab 中指明了系统启动的默认运行级别,通常是 3 或者 5,以及每个运行级别需要到哪些目录下执行哪些脚本,比如切换到 runlevel 3 时,就会到 /etc/rc3.d/ 目录下先依次停止以 K 开头的服务脚本,再依次启动以 S 开头的服务脚本

Linux boot process-min.png

只有深入了解 Linux 如何启动的,才能在启动出现故障时迅速排查问题原因。POST 加电自检、根据启动顺序(Boot Sequence)去查找 MBR 引导扇区,从而读取到 bootloader(比如 GRUB) 的第一阶段引导代码,这一部分跟操作系统关系不大(通用的流程)。然后 GRUB 会借助它的 1.5 阶段代码(比如 xfs_stage1_5)识别到存放它的第二阶段代的分区,从而开始执行第二阶段代码,并显示引导菜单。当选择了要启动的操作系统后,加载内核并执行,可能需要借助于 initial RAM disk 去识别硬件(比如 rootfs 所在硬盘),最后由内核执行第一个用户空间程序 init,主流的 init 系统包括 SysVinit、Upstart、systemd

作者头像
Madman

CentOS 7.3 从内核 3.10.0 升级到 4.14.40 后,重启不了,原因是 Linux 内核 4.4.x 版本之后,dracut 命令生成的 initramfs 默认不会自动加载 mpt3sas 驱动模块。因为没有对应的驱动程序,所以识别不了系统盘(两块 SAS 系统盘接在 LSI 2308 HBA 卡上,创建 RAID 1),从而导致内核 vmlinuz 无法加载它的 rootfs(根文件系统)