使用 systemd 来管理启动项 启动序列

启动序列(使用 systemd 来管理启动项)

了解 systemd 是怎样决定服务启动顺序,即使它本质上是个并行系统 。

使用 systemd 来管理启动项 启动序列


最近在设置 Linux 系统时,我想知道如何确保服务和其他单元的依赖关系在这些依赖于它们的服务和单元启动之前就已经启动并运行了 。我需要更多 systemd 如何管理启动程序的相关知识,特别是在本质上是一个并行的系统中如何是决定服务启动顺序的 。
你可能知道 SystemV(systemd 的前身,我在这个系列的 第一篇文章中解释过)通过 Sxx 前缀命名启动脚本来决定启动顺序,xx 是一个 00-99 的数字 。然后 SystemV 利用文件名来排序,然后按照所需的运行级别执行队列中每个启动脚本 。
但是 systemd 使用单元文件来定义子程序,单元文件可由系统管理员创建或编辑,这些文件不仅可以用于初始化时也可以用于常规操作 。在这个系列的 第三篇文章中,我解释了如何创建一个挂载单元文件 。在第五篇文章中,我解释了如何创建一种不同的单元文件 —— 在启动时执行一个程序的服务单元文件 。你也可以修改单元文件中某些配置,然后通过 systemd 日志去查看你的修改在启动序列中的位置 。
准备工作先确认你已经在 /etc/default/grub文件中的GRUB_CMDLINE_LINUX=这行移除了rhgbquiet,如同我在这个系列的第二篇文章中展示的那样 。这让你能够查看 Linux 启动信息流,你在这篇文章中部分实验中需要用到 。
程序在本教程中,你会创建一个简单的程序让你能够在主控台和后续的 systemd 日志中查看启动时的信息 。
创建一个 shell 程序 /usr/local/bin/hello.sh然后添加下述内容 。你要确保执行结果在启动时是可见的,可以轻松的在 systemd 日志中找到它 。你会使用一版携带一些方格的 “Hello world” 程序,这样它会非常显眼 。为了确保这个文件是可执行的,且为了安全起见,它需要 root 的用户和组所有权和700 权限 。
#!/usr/bin/bash# Simple program to use for testing startup configurations# with systemd.# By David Both# Licensed under GPL V2#echo ###############################echo ######### Hello World! ########echo ###############################在命令行中执行这个程序来检查它能否正常运行 。
[root@testvm1 ~]# hello.sh######################################## Hello World! #######################################[root@testvm1 ~]#这个程序可以用任意脚本或编译语言实现 。hello.sh程序可以被放在Linux 文件系统层级结构(FHS)上的任意位置 。我把它放在/usr/local/bin目录下,这样它可以直接在命令行中执行而不必在打命令的时候前面带上路径 。我发现我创建的很多 shell 程序需要从命令行和其他工具(如 systemd)运行 。
服务单元文件【使用 systemd 来管理启动项 启动序列】创建服务单元文件 
/etc/systemd/system/hello.service
,写入下述内容 。这个文件不一定是要可执行的,但是为了安全起见,它需要 root 的用户和组所有权和644或640权限 。
# Simple service unit file to use for testing# startup configurations with systemd.# By David Both# Licensed under GPL V2#[Unit]Description=My hello shell script[Service]Type=oneshotExecStart=/usr/local/bin/hello.sh[Install]WantedBy=multi-user.target

推荐阅读