传统 Linux SysV init 启动过程
- 按下计算机电源按钮开机
- CPU查找系统的BIOS设置知道第一个引导设备,一般为硬盘
- 查找到硬盘的主引导记录(MBR),将其加载到内存并将控制权移交给MBR
- 主引导记录初始化引导程序(GRUB或LILO)
- GRUB引导程序加载内核模块
- 内核模块马上查找sbin下的init程序并执行她
- init的进程id为1,成为后续linux系统的父进程
- init进程读取/etc/inittab文件,查找分区表信息,然后分别挂载
- init启动/etc/init.d文件夹里指定的默认启动级别的所有服务和脚本,所有服务都由init进程一个一个初始化,整个过程中init进程每次只启动一个服务
更先进的 Systemd 启动过程
开发Systemd的主要目的就是减少系统引导时间和计算开销。Systemd(系统管理守护进程),最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,它是如今讨论最热烈的引导和服务管理程序。如果你的Linux系统配置为使用Systemd引导程序,它取替传统的SysV init,启动过程将交给systemd处理。Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。
Systemd引入了并行启动的概念,它会为每个需要启动的守护进程建立一个套接字,这些套接字对于使用它们的进程来说是抽象的,这样它们可以允许不同守护进程之间进行交互。Systemd会创建新进程并为每个进程分配一个控制组(cgroup)。处于不同控制组的进程之间可以通过内核来互相通信。systemd处理开机启动进程的方式非常漂亮,和传统基于init的系统比起来优化了太多。让我们看下Systemd的一些核心功能,和init比起来引导过程简化了很多。
- Systemd支持并发引导过程从而可以更快启动
- 通过控制组来追踪进程,而不是PID
- 优化了处理引导过程和服务之间依赖的方式
- 支持系统快照和恢复
- 监控已启动的服务;也支持重启已崩溃服务
- 包含了systemd-login模块用于控制用户登录
- 支持加载和卸载组件
- 低内存使用痕迹以及任务调度能力
- 记录事件的Journald模块和记录系统日志的syslogd模块