炼数成金 门户 大数据 Linux 查看内容

CentOS7 - systemd 启动过程

2018-3-14 10:59| 发布者: 炼数成金_小数| 查看: 16738| 评论: 0|原作者: 猪猪|来自: 进击的大杂烩

摘要: 本文通过 CentOS7 的启动过程来了解systemd是如何处理系统启动的。linux 的启动过程,POST --> BIOS(boot) --> Bootloader(MBR(446)) --> kernel(initrd) --> init(systemd)。可见在 kernel 挂载根文件系统 ...

tm 管理 Hadoop 培训 内核

一. Linux 的启动过程
二. CentOS 7 系统systemd引导过程
阶段1
阶段2
阶段3
阶段4
阶段5
三. 总结

在文章 CentOS7 - systemd Systemd对 服务、启动项和日志管理这三项功能。本文通过 CentOS7 的启动过程来了解systemd是如何处理系统启动的。
本文中的命令在 CentOS 7.4 测试通过

一. linux 的启动过程
POST --> BIOS(boot) --> Bootloader(MBR(446)) --> kernel(initrd) --> init(systemd)
可见在 kernel 挂载根文件系统完成后,启动 init 进程。init 进程是 linux 系统启动的第一个进程,那么 CentOS7 中的第一个进程是什么?

# 解压 CentOS7 内核文件:
mkdir -p /data/img
# 不通版本内核版本号可能不同。
cp /boot/initramfs-3.10.0-693.11.6.el7.x86_64.img /data/img
cd /data/img
/usr/lib/dracut/skipcpio initramfs-3.10.0-693.11.6.el7.x86_64.img  | zcat | cpio -id --no-absolute-filenames

解压后的目录如下
lrwxrwxrwx.  1 root root        7 Jan 24 10:27 bin -> usr/bin
drwxr-xr-x.  2 root root       42 Jan 24 10:27 dev
drwxr-xr-x. 12 root root     4096 Jan 24 10:27 etc
lrwxrwxrwx.  1 root root       23 Jan 24 10:27 init -> usr/lib/systemd/systemd
lrwxrwxrwx.  1 root root        7 Jan 24 10:27 lib -> usr/lib
lrwxrwxrwx.  1 root root        9 Jan 24 10:27 lib64 -> usr/lib64
drwxr-xr-x.  2 root root        6 Jan 24 10:27 proc
drwxr-xr-x.  2 root root        6 Jan 24 10:27 root
drwxr-xr-x.  2 root root        6 Jan 24 10:27 run
lrwxrwxrwx.  1 root root        8 Jan 24 10:27 sbin -> usr/sbin
-rwxr-xr-x.  1 root root     3117 Jan 24 10:27 shutdown
drwxr-xr-x.  2 root root        6 Jan 24 10:27 sys
drwxr-xr-x.  2 root root        6 Jan 24 10:27 sysroot
drwxr-xr-x.  2 root root        6 Jan 24 10:27 tmp
drwxr-xr-x.  7 root root       61 Jan 24 10:27 usr
drwxr-xr-x.  2 root root       27 Jan 24 10:27 var
可见 init 进程软链到了 systemd。此时 systemd 成为linux第一个进程(PID=1),接管系统启动。

二. CentOS 7 系统systemd引导过程
阶段1
systemd执行的第一个目标是/usr/lib/systemd/system/default.target,这个文件链接到当前目录的graphical.target。文件内容如下:
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.service
AllowIsolate=yes
文件中配置项 Requires=multi-user.target 将控制权交给 multi-user.target (相当于旧概念的运行级别)。

阶段2
在这个阶段,会启动multi-user.target,这个target为多用户支持设定系统环境。会启动如下两个目录中单元。
/etc/systemd/system/multi-user.target.wants/
/usr/lib/systemd/system/multi-user.target.wants/
multi-user.target文件内容如下:
[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
multi-user.target会将控制权交给 basic.target。

阶段3
basi.target用于启动普通服务,特别是图形管理服务,它通过如下两个目录决定那些单元会被启动。
/etc/systemd/system/basic.target.wants/
/usr/lib/systemd/system/basic.target.wants/
basi.target 文件内容如下:
[Unit]
Description=Basic System
Documentation=man:systemd.special(7)

Requires=sysinit.target
After=sysinit.target
Wants=sockets.target timers.target paths.target slices.target
After=sockets.target paths.target slices.target
basi.target 会将控制权交给 sysinit.target

阶段4
sysinit.target会启动重要的系统服务例如系统挂载,内存交换空间和设备,内核补充选项等等。它通过如下两个目录决定那些单元会被启动。
/etc/systemd/system/sysinit.target.wants/
/usr/lib/systemd/system/sysinit.target.wants/
sysinit.target文件内容如下:
[Unit]
Description=System Initialization
Documentation=man:systemd.special(7)
Conflicts=emergency.service emergency.target
Wants=local-fs.target swap.target
After=local-fs.target swap.target emergency.service emergency.target
sysinit.target在启动过程中会传递给 local-fs.target 和 swap.target。

阶段5
local-fs.target 也不能算是阶段5,可能和阶段4一些服务并行启动,这个阶段不会启动用户相关服务,它只处理底层核心服务,这个target会根据/etc/fstab来执行相关磁盘挂载操作。它通过如下一个目录决定那些单元会被启动。
/usr/lib/systemd/system/local-fs.target.wants/
local-fs.target 文件内容如下:
[Unit]
Description=Local File Systems
Documentation=man:systemd.special(7)
DefaultDependencies=no
Conflicts=shutdown.target
After=local-fs-pre.target
OnFailure=emergency.target
OnFailureJobMode=replace-irreversibly

三. 总结
个人理解:虽然systemd的引用target的顺序如上,但是真正的启动顺序为从下到上,其中管理单元可以并行启动,从而使效率大大提高。同时 Systemd 是向下兼容 System V 的。
官网给出的启动顺序如下图:

systemd boot process in linux
systemd boot process in linux
要查看具体的启动顺序可以通过如下命令输入到文件,然后通过浏览器打开查看。
systemd-analyze plot > boot.html
列出所有正在运行的单元,按从初始化开始到启动所花的时间排序。
systemd-analyze blame 

欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708

Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967 

鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

 

GMT+8, 2018-8-19 09:25 , Processed in 0.295316 second(s), 24 queries .