systemd管理

▶ systemd 管理

Linux 的初始化程序 systemd:https://www.cnblogs.com/takenika/articles/18391899

CentOS7 等系列开始,系统使用的是 systemd 为第一个内核启动的进程,系统启动后的默认目标是 /etc/systemd/system/default.target 这个文件所指定的这是一个链接文件,在最小化安装后指向的就是 multi-user.target 文件。

▷ 查看当前的 target

方式一:直接查看目标指的是那个文件:

[root@server ~]# ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 41 Aug 15 09:19 /etc/systemd/system/default.target
-> /usr/lib/systemd/system/multi-user.target

方式二:基于 systemctl 命令: systemctl get-default

[root@server ~]# systemctl get-default
multi-user.target

▷▷ 获得当前的运行的目标

通过 runlevel 或者是 who -r

[root@server ~]# runlevel
N 3
[root@server ~]# who -r
         run-level 3  2024-09-02 15:23

▷ 切换 target

▷▷ 临时性的切换

systemctl isolate 新目标

▷▷ 永久性的切换

systemctl set-default 新目标

▷ 分析 systemd-analyze

▷▷ 分析开机使用的时间

使用 systemctl-analyze time

[root@server ~]# systemd-analyze time
Startup finished in 1.681s (kernel) + 2.360s (initrd) + 5.205s (userspace) = 9.248s
multi-user.target reached after 3.409s in userspace.

▷▷ 分析单个unit启动使用的时间

该命令也可以用于查看该系统其他的 unit
单元的开机时间:

[root@server ~]# systemd-analyze blame | grep sshd
 140ms sshd.service

▷▷ 分析开机时间

systemd-analyze plot
       This command prints either an SVG graphic, detailing which system services have been started at
       what time, highlighting the time they spent on initialization, or the raw time data in JSON or
       table format.

       plot 这个 command 会保存一个 SVG 的图形,该图形能显示系统服务什么时候启动,高亮显示启动的时候花了多久的时间,
       也能将原始的时间数据保存在 JSON 或者 表格式上。
[root@server ~]# systemd-analyze plot > boot.svg

打开 boot.svg 文件查看:


▶ systemd 的单元文件-unit

unit 的文件会在三个位置上出现。

单元文件位置 含义
/usr/lib/systemd/system/ 默认单元文件
/etc/systemd/system/ 自定义单元文件
/run/systemd/system/ 自动生成的单元文件

▷ /usr/lib/systemd/system/-默认的单元文件

这个位置是在安装一些 RPM 包的时候,如 httpd、mariadb 等的软件包的时候,会在这个目录下复制一些默认的单元文件。

由于对于一些服务来说会从中复制一些内容所以不应该修改编辑文件目录下的文件。

▷ /etc/systemd/system/-自定义单元文件

这里面可以进行编辑,包含自定义的 unit 文件,对于 /run/systemd/system 来说这个是自动生成的,所以对于自定义 unit 单元来说在 /etc/systemd/system 下编辑 unit 文件比较合适。

当一个单元的文件存在多个位置的时候,会有应用的优先级,先是运行 默认是单元文件 然后是 自定义单元文件 最后是 自动生成的单元文件,后运用的会覆盖前面的。

查看 httpd 的 unit:

[root@server ~]# systemctl cat httpd.service

/usr/lib/systemd/system/httpd.service
--snip--
[Unit]
Description=The Apache HTTP Server
Wants=httpd-init.service
After=network.target remote-fs.target nss-lookup.target httpd-init.service
Documentation=man:httpd.service(8)

[Service]
Type=notify
Environment=LANG=C

--snip--

当安装了httpd,会在这个目录下有个单元文件,该单元文件是 httpd.service ,该文件不宜修改,应该修改到 /etc/systemd/system 当中,最终修改的结果实现是三个文件一起合并的结果。

▶ 常见的 system 四类的文件

通过 systemctl -t help 可以查看 unit 的几类文件。

service    mount    swap     socket    target    device
automount  timer    path     slice     scope

▷ Unit单元-Service

Service 单元是极为重要的 unit 类型,用于启动进程。

当通过 yum 或者是 dnf 的形式安装好程序后,就会在 /usr/lib/systemd/system 下面出现一个 .service 结尾的相关程序的 unit 单元程序配置,往往有三部分组成,这三部分是 UnitServiceInstatall

单元 解释
Unit 描述了依赖关系,常用语句是 Description 和 After,After 语句用于描述该程序在什么 target 之后
Service 描述如何启动和停止服务,Type 选项指定进程如何来启动forking表示是以守护程序的方式进行的,ExecStart 指定以何种形式来启动单元
Install 指定Unit安装到那个 target,也就是在那个target来启动 unit

▷ Unit单元-mount

mount 单元指定文件系统如何挂载到特定的目录中。

[root@server ~]# ls /usr/lib/systemd/system/*mount
/usr/lib/systemd/system/dev-hugepages.mount
/usr/lib/systemd/system/dev-mqueue.mount
/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount
/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.mount
/usr/lib/systemd/system/sys-fs-fuse-connections.mount
/usr/lib/systemd/system/sys-kernel-config.mount
/usr/lib/systemd/system/sys-kernel-debug.mount
/usr/lib/systemd/system/sys-kernel-tracing.mount
/usr/lib/systemd/system/tmp.mount

▷ Unit单元-Socket

套接字 socket 是一种为应用程序创建通讯的方法。

systemd 使用 socket 单元主要的作用是对入站监听的端口,可以与服务做分开。

[root@server ~]# ls /usr/lib/systemd/system/*mount
/usr/lib/systemd/system/dev-hugepages.mount
/usr/lib/systemd/system/dev-mqueue.mount
/usr/lib/systemd/system/proc-sys-fs-binfmt_misc.automount
--snip--

系统中有多种 socket,里面就有有关与服务定义的端口的设置。

通过 socket 查看 cockpit 的端口:

[root@server ~]# dnf -y install cockpit
[root@server ~]# cat /usr/lib/systemd/system/cockpit.socket

[Unit]
Description=Cockpit Web Service Socket
Documentation=man:cockpit-ws(8)
Wants=cockpit-motd.service

[Socket]
ListenStream=9090
ExecStartPost=-/usr/share/cockpit/motd/update-motd '' localhost
ExecStartPost=-/bin/ln -snf active.motd /run/cockpit/motd
ExecStopPost=-/bin/ln -snf inactive.motd /run/cockpit/motd

[Install]
WantedBy=sockets.target

通过 ListenStream 可以看到 cockpit 使用端口是 9090


▷ Unit单元-Target

为了提高管理的效率,systemd 会提供一种特殊的单元叫作 target,这可以把很多的 unit 单元 合并 在一起,方面这些 unit 以 合理的顺序 来启动。


target 有两种,一种是定义机器启动的状态这种 target 和早期的 Linux 的发行版本的运行级别是相当的, 另一种 target 就是一组服务,通过这种 target 可以轻松管理相关的服务。

target 可以依赖另一个 target。

通过 systemctl list-dependencies 来查看某个 target 依赖于那些 target。

[root@server ~]# systemctl list-dependencies basic.target
basic.target
● ├─-.mount
○ ├─microcode.service
● ├─paths.target
● ├─slices.target
● │ ├─-.slice
● │ └─system.slice
● ├─sockets.target

使用 --reverse 可以查看那些依赖于指定的 target 。

[root@server ~]# systemctl list-dependencies basic.target --reverse
basic.target
○ ├─initrd.target
● └─multi-user.target
○   └─graphical.target

当安装了某个服务的时候也会在某个 target 中添加符号链接。


▶ 单元的依赖关系

一般来说 systemdunit 依赖有两种方式,第一种:对于 socketpath 这两个单元通常都是与服务相关联的,所以访问某个 unit 就会触发另外一种类型,还有一种则是通过单元内定义中使用关键字来进行依赖。

单元定义中使用关键字 说明
Requires 要求。一起被加载,一起启动,一起被停止
Requisite 必要条件。如果指定单元尚未加载,则失败
Wants 想要。希望也加载指定的单位
Before 之前。在指定的单元之前启动
After 之后。在指定的单元之后启动
posted @ 2024-09-03 13:43  takenika  阅读(109)  评论(0)    收藏  举报