一. 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_64g /data/img

  cd /data/img

  /usr/lib/dracut/skipcpio initramfs-3.10.0-693.11.6.el7.x86_64g | 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 的。