Linux基础知识 ·

systemd之default.target

[隐藏]

在内核载入完毕、进行完硬件检测与驱动程序载入后,此时你的主机应该已经准备就绪了(ready) ,此时内核会主动的呼叫第一个程序,那就是 systemd 了。这也是为啥你会发现systemd的PID号码是一号啦。

systemd最主要的功能就是准备软件执行的环境,包括系统的主机名称、网络设定、语系处理、文件系统格式及其他服务的启动等。而所有的动作都会通过 systemd 的预设启动服务集合,亦即是/etc/systemd/system/default.target 来规划。另外, systemd 已经舍弃沿用多年的 system V 的 runlevel 了!

常见的操作环境target与相容于runlevel的等级

可以作为预设的操作环境(default.target) 的主要项目有: multi-user.target 以及 graphical.target 这两个。当然还有某些比较特殊的操作环境, 包括 rescue.target、 emergency.target、 shutdown.target 等等,以及 initrd.target

但是过去的 systemV 使用的是一个称为 runlevel (执行等级) 的概念来启动系统的,systemd 为了相容于旧式的systemV 操作行为, 所以也将 runlevel 与操作环境做了结合!你可以使用底下的方式来查询两者间的对应:

如果你之前已经使用过 systemV 的方式来管理系统的话,那应该会知道切换执行等级可以使用『 init 3 』转成文字界面,『 init 5 』转成图形界面吧?这个init 程序依旧是保留下来的,只是init 3 会相当于systemctl isolate multi-user.target 就是了!如果做个完整的叠代,这两个东西的对应为:

SystemVsystemd
init 0systemctl poweroff
init 1systemctl rescue
init [234]systemctl isolate multi-user.target
init 5systemctl isolate graphical.target
init 6systemctl reboot

systemd 的处理流程

当我们取得了/etc/systemd/system/default.target 这一个预设操作界面的设定之后,接下来系统会到/usr/lib/systemd/system/ 这个目录下去取得 multi-user.target 或 graphical.target 这两个其中的一(正常的进入Linux 操作环境的情况下!)。

假设我们是使用 graphical.target ,接着下来systemd 会去找两个地方的设定:

  • /etc/systemd/system/graphical.target.wants/:使用者设定载入的 unit
  • /usr/lib/systemd/system/graphical.target.wants/:系统预设载入的 unit

然后再由 /usr/lib/systemd/system/graphical.target 这个预设文件内读取如下的信息:

这表示 graphical.target 必须要完成 multi-user.target 之后才能够进行,而进行完 graphical.target 之后,还得要启动 display-manager.service 才行的意思。


那么通过同样的方式,我们来找找 multi-user.target 执行要载入的项目。

通过上面的結果,我们能够知道 multi-usre.target 需要在 basic.target 运行完成好才能够载入上述的许多 unit !然后再去 basic.target 里面找信息等等~ 最这些信息就可以通过『 systemctl list-dependencies graphical.target 』这个指令來列出所有的相关性的服务!这就是 systemd 的运行所需要的服务的流程了!

要知道系统的服务启动的流程,最简单的方法就是『 systemctl list-dependencies graphical.target 』这个指令!只是,如果你想要知道背后的设定意义, 那就需要分別去找出 /etc 与 /usr/lib 底下的 graphical.target.wants/ 目录下的资料了!当然,设定项脚本里面的 Requires 這个设定值所代表的服务, 也是需要是先载入的!

根据『 systemctl list-dependencies graphical.target 』所输出的相依属性服务,基本上 CentOS 7.x 的 systemd 开机流程大概是这样:

  1. local-fs.target + swap.target:这两个 target 主要在挂载本机 /etc/fstab 里面所预设的文件与相关存储设备。
  2. sysinit.target:這個 target 主要在检测硬件,载入所需要的内核模块等。
  3. basic.target:载入主要的周边硬件驱动程序与防火墙相关的任务。
  4. multi-user.target 底下的其它一般系统或网络服务的载入。
  5. 图像界面相关服务如 gdm.service 等其他服务的载入。

参与评论