关于 Linux中systemd的一些笔记

article/2025/9/15 7:22:13

写在前面


  • 嗯,准备RHCA,学习整理这部分知识
  • 博文内容涉及:
    • systemd简述
    • 对于unit的信息的介绍
    • 通过systemctl命令控制Service unitDemo
    • Service unit配置文件内容,权值的一些介绍

傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波


一、Systemd 简述

systemd是Linux操作系统的系统和服务管理器。在系统启动时或者正在运行的系统上的一个守护进程,systemd负责激活系统资源、服务器守护程序和其他进程systemdRHEL 7之后出现的。

守护进程(daemon)是在后台执行各种任务的进程。通常,守护程序在引导时自动启动并继续运行直到系统关闭或手动停止。许多守护程序的名称的约定以字母d结尾

关于RHEL启动进程管理:

  • RHEL 5的时候,使用 Sys init,启动速度最慢的,无论进程相互之间有无依赖关系,都是串行启动过程,
  • RHEL 6的时候,使用 Upstart init相对启动速度快一点有所改进。有依赖的进程之间依次启动而其他与之没有依赖关系的则并行同步启动
  • RHEL 7 Systemd与以上都不同。所有进程无论有无依赖关系则都是并行启动(很多时候进程没有真正启动而是只有一个信号或者说是标记而已,在真正利用的时候才会真正启动)。

Systemd为了解决上文的问题而诞生。它的目标是,为系统的启动和管理提供一套完整的解决方案,

RHEL启动的第一个进程(PID 1)就是systemd,提供的功能包括:

  • 并行化功能(同时启动多个服务),可提高系统的启动速度。
  • 按需启动后台程序而无需单独的服务。
  • 自动管理服务依赖关系,可以防止长时间超时。例如,网络相关服务在网络可用之前不会尝试启动。
  • 使用Linux控制组(Cgroup)一起跟踪相关进程的方法。

Systemd 架构图

systemd Targets 启动级别

二、systemctl 命令管理系统

systemctl Systemd 的主命令,systemctl命令用于管理不同类型的系统对象,这些对象称之为units

  • Service unit:用于定义系统服务,文件扩展名为.service
  • Target unit:用于模拟实现“运行级别”,文件扩展名为.target,可以理解Target 就是一个 Unit 组,包含许多相关的 Unit
  • Device unit:用于定义内核识别的设备,文件扩展名为.device
  • Mount unit:用于定义文件系统挂载点,文件扩展名为.mount
  • Socket unit:用于标识进程间通信用的socket文件,文件扩展名为.socket
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl status cockpit.socket #CocKpit驾驶舱 和SSH类似,用于远程控制,类似于阿里云的控制台。为初级管理员提供基本操作,通过web端的控制台,访问地址:服务器IP:9090
● cockpit.socket - Cockpit Web Service SocketLoaded: loaded (/usr/lib/systemd/system/cockpit.socket; disabled; vendor preset: disabled)Active: inactive (dead)Docs: man:cockpit-ws(8)Listen: [::]:9090 (Stream)
  • Snapshot unit:管理系统快照,文件扩展名为.snapshot
  • Swap unit:用于标识swap设备,文件扩展名为.swap
  • Automount unit:文件系统的自动挂载点,文件扩展名为.automount
  • Path unit:用于根据文件系统上特定对象的变化来启动其他服务,文件扩展名为.path
  • Timer unit:用于管理计划任务,文件扩展名为.timer
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl status systemd-tmpfiles-clean.timer #用于定时清理 `/tmp`,`/var/tmp`之类的临时文件
● systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary DirectoriesLoaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static; vendor preset: disabl>Active: active (waiting) since Sun 2022-04-03 11:24:00 CST; 1h 48min agoTrigger: Mon 2022-04-04 11:39:07 CST; 22h leftDocs: man:tmpfiles.d(5)man:systemd-tmpfiles(8)Apr 03 11:24:00 liruilongs.github.io systemd[1]: Started Daily Cleanup of Temporary Directories.
┌──[root@liruilongs.github.io]-[~]
└─$
  • Slice unit:用于资源管理,文件扩展名为.slice

1.查看units列表信息

列出loaded(配置文件以加载)的units

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl list-unitsUNIT                                               LOAD   ACTIVE SUB       DESCRIPTIONproc-sys-fs-binfmt_misc.automount                  loaded active waiting   Arbitrary Executable File>.............

命令输出说明:

  • UNIT:服务单元名称。
  • LOAD: systemd是否正确解析了单元的配置并将该单元加载到内存中
  • ACTIVE:单元的高级别激活状态。此信息表明单元是否已成功启动
  • SUB:单元的低级别激活状态。此信息指示有关该单完的更多详细信息。信息视单元类型、状态以及单元的执行方式而异。
  • DESCRIPTION:单元的简短描述

在这里插入图片描述

列出全部的units

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl list-unit-files
UNIT FILE                                  STATE
proc-sys-fs-binfmt_misc.automount          static
-.mount                                    generated
boot.mount                                 generated
dev-hugepages.mount                        static
dev-mqueue.mount                           static
proc-sys-fs-binfmt_misc.mount              static
sys-fs-fuse-connections.mount              static
sys-kernel-config.mount                    static
sys-kernel-debug.mount                     static
tmp.mount                                  disabled
systemd-ask-password-console.path          static
.....

查看指定的系统对象

查看timer,系统定时任务

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl list-units -i timer
0 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl list-unit-files -t timer
UNIT FILE                    STATE
dnf-makecache.timer          enabled  #yaml仓库定时更新
fstrim.timer                 disabled  
systemd-tmpfiles-clean.timer static  # 临时文件清理
unbound-anchor.timer         enabled4 unit files listed.
┌──[root@liruilongs.github.io]-[~]
└─$

查看socket套接字

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl list-unit-files -t socket
UNIT FILE                               STATE
cockpit-wsinstance-http-redirect.socket static
cockpit-wsinstance-http.socket          static
cockpit-wsinstance-https-factory.socket static
cockpit-wsinstance-https@.socket        static
cockpit.socket                          enabled
dbus.socket                             static

列出类型为service,状态为loadedactive的 unit

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl list-units -t serviceUNIT                                                 LOAD   ACTIVE SUB     DESCRIPTIONauditd.service                                       loaded active running Security Auditing Service

列出类型为service,状态为activeinactive 的unit

┌──[root@liruilongs.github.io]-[~]
└─$  systemctl list-units --type service --all

查看失败的服务

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl --failed -t serviceUNIT          LOAD   ACTIVE SUB    DESCRIPTION
● kdump.service loaded failed failed Crash recovery kernel arming
.....

三、systemctl操作Service unit

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl status sshd 
● sshd.service - OpenSSH server daemon  #单元的描述信息Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled) #子状态,加载的配置文件,默认开机自启Active: active (running) since Sun 2022-04-03 11:24:03 CST; 2h 16min ago #运行状态,时间Docs: man:sshd(8)  #帮助文档man:sshd_config(5)Main PID: 880 (sshd) #主进程Tasks: 1 (limit: 6044) # 任务量 Memory: 7.2M   #消耗的内存CGroup: /system.slice/sshd.service  # 用的什么slice└─880 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes2>
Apr 03 11:24:02 liruilongs.github.io systemd[1]: Starting OpenSSH server daemon...  #启动日志,什么进程引导激活的
Apr 03 11:24:03 liruilongs.github.io sshd[880]: Server listening on 0.0.0.0 port 22. #监听的端口
Apr 03 11:24:03 liruilongs.github.io sshd[880]: Server listening on :: port 22.
Apr 03 11:24:03 liruilongs.github.io systemd[1]: Started OpenSSH server daemon.  #启动服务
Apr 03 11:25:30 liruilongs.github.io sshd[1112]: Accepted publickey for root from 172.25.254.254 port > #连接日志
Apr 03 11:25:30 liruilongs.github.io sshd[1112]: pam_unix(sshd:session): session opened for user root >
lines 1-17/17 (END)

查看Service单元状态信息

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl is-active sshd
active
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl is-enabled sshd
enabled
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl is-
is-active          is-enabled         is-failed          is-system-running

配置文件加载

优先级从高到低

  • 本地配置的系统单元: /etc/systemd/system
  • 运行时配置的系统单元: /run/systemd/system
  • 软件包安装的系统单元: /usr/lib/systemd/system

默认的服务配置文件位置:/usr/lib/systemd/system

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl status sshd | head  -2
● sshd.service - OpenSSH server daemonLoaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)

添加高优先级配置文件:/run/systemd/system

┌──[root@liruilongs.github.io]-[~]
└─$ cp /usr/lib/systemd/system/sshd.service /run/systemd/system/sshd.service
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl daemon-reload
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl status sshd | head  -2
● sshd.service - OpenSSH server daemonLoaded: loaded (/run/systemd/system/sshd.service; enabled; vendor preset: enabled)

添加高优先级配置文件,/etc/systemd/system

┌──[root@liruilongs.github.io]-[~]
└─$ cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl daemon-reload
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl status sshd | head  -2
● sshd.service - OpenSSH server daemonLoaded: loaded (/etc/systemd/system/sshd.service; enabled; vendor preset: enabled)
┌──[root@liruilongs.github.io]-[~]
└─$

配置文件内容

┌──[root@liruilongs.github.io]-[~]
└─$ cat /usr/lib/systemd/system/sshd.service
[Unit]
Description=OpenSSH server daemon #描述信息
Documentation=man:sshd(8) man:sshd_config(5) #帮助文档
After=network.target sshd-keygen.target  #依赖关系,在...之后执行
Wants=sshd-keygen.target  # 强依赖[Service] 
Type=notify  #notify类型
EnvironmentFile=-/etc/crypto-policies/back-ends/opensshserver.config  #环境变量读取
EnvironmentFile=-/etc/sysconfig/sshd   # - 号为文件可以不存在
ExecStart=/usr/sbin/sshd -D $OPTIONS $CRYPTO_POLICY  # 启动命令
ExecReload=/bin/kill -HUP $MAINPID  # reload从新初始化
KillMode=process  #设置在单元停止时,杀死进程的方法 process 表示仅杀死主进程
Restart=on-failure  #仅在服务进程异常退出时重启
RestartSec=42s # 42秒后重启[Install]
WantedBy=multi-user.target #属于那个target
┌──[root@liruilongs.github.io]-[~]
└─$

手册查看,不错的翻译 systemd.service 中文手册

┌──[root@liruilongs.github.io]-[~]
└─$ man -k systemd

控制Service unit

启动停止服务

systemctl start sshd.service 
systemctl stop sshd.service

重新加载配置文件

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl reload sshd #还是原来的进程,只是从新加载配置文件  

重启服务

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl restart  sshd #一个新的进程

查看服务状态

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl status httpd
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)Active: active (running) since Sun 2022-04-03 11:46:36 CST; 3h 5min agoDocs: man:httpd.service(8)Main PID: 1616 (httpd)Status: "Running, listening on: port 80"Tasks: 213 (limit: 6044)Memory: 33.7MCGroup: /system.slice/httpd.service├─1616 /usr/sbin/httpd -DFOREGROUND├─1617 /usr/sbin/httpd -DFOREGROUND├─1618 /usr/sbin/httpd -DFOREGROUND├─1619 /usr/sbin/httpd -DFOREGROUND└─1620 /usr/sbin/httpd -DFOREGROUNDApr 03 11:46:35 liruilongs.github.io systemd[1]: Starting The Apache HTTP Server...
Apr 03 11:46:36 liruilongs.github.io systemd[1]: Started The Apache HTTP Server.
Apr 03 11:46:36 liruilongs.github.io httpd[1616]: Server configured, listening on: port 80

设置开机自启,添加一个软链接

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl enable httpd --now #立刻激活
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl is-enabled httpd
enabled
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl is-active  httpd
active
┌──[root@liruilongs.github.io]-[~]
└─$

设置服务开机不启动

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl disable  httpd
Removed /etc/systemd/system/multi-user.target.wants/httpd.service.

服务禁用

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl mask httpd
Created symlink /etc/systemd/system/httpd.service → /dev/null.
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl start httpd
Failed to start httpd.service: Unit httpd.service is masked.
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl status  httpd | head -2
● httpd.serviceLoaded: masked (Reason: Unit httpd.service is masked.)

可以删除软链接取消禁用

┌──[root@liruilongs.github.io]-[~]
└─$ ll  /etc/systemd/system/httpd.service
lrwxrwxrwx. 1 root root 9 Apr  3 16:08 /etc/systemd/system/httpd.service -> /dev/null
┌──[root@liruilongs.github.io]-[~]
└─$ rm -r   /etc/systemd/system/httpd.service
rm: remove symbolic link '/etc/systemd/system/httpd.service'? y
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl daemon-reload
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl start httpd

可以通过unmask来取消禁用

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl mask httpd
Created symlink /etc/systemd/system/httpd.service → /dev/null.
┌──[root@liruilongs.github.io]-[~]
└─$ systemctl unmask httpd
Removed /etc/systemd/system/httpd.service.
┌──[root@liruilongs.github.io]-[~]
└─$

unit依赖

可以通过如下命令查看unit的启动依赖关系

systemctl list-dependencies cups.service 
systemctl list-dependencies cups.service --reverse

查看httpd Service 正向依赖,在httpd之前启动

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl list-dependencies httpd
httpd.service
● ├─-.mount
● ├─httpd-init.service
● ├─system.slice
● └─sysinit.target
●   ├─dev-hugepages.mount
●   ├─dev-mqueue.mount
●   ├─dracut-shutdown.service
●   ├─import-state.service
●   ├─iscsi-onboot.service
●   ├─kmod-static-nodes.service
......
......
┌──[root@liruilongs.github.io]-[~]
└─$

查看httpd Service 反向依赖,在httpd之后启动

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl list-dependencies httpd --reverse
httpd.service
● └─multi-user.target
●   └─graphical.target

查看multi-user.target正向依赖是否有httpd

┌──[root@liruilongs.github.io]-[~]
└─$ systemctl list-dependencies multi-user.target | grep httpd
● ├─httpd.service

嗯,关于systemd和小伙伴们分享到这里,这块涉及的内容很多,这里简单介绍,在Linux生态系统中,systemd被部署到了大多数的标准Linux发行版中,只有为数不多的几个发行版尚未部署。关于systemd启动过程、对其他unit的控制和管理、对系统运行级别等的控制,感兴趣小伙伴可以了解下。


http://chatgpt.dhexx.cn/article/0Q6P8Zgb.shtml

相关文章

Linux-Systemd

目录 一、Systemd概述 二、Systemd优势 2.1兼容性 2.2启动速度 2.3systemd 提供按需启动能力 2.4采用 linux 的 cgroups 跟踪和管理进程的生命周期 2.5启动挂载点和自动挂载的管理 2.6实现事务性依赖关系管理 2.7日志服务 2.8 依赖关系 2.9systemd 事务 三、unit(单…

Systemd 简介

一 概述 Linux 服务管理有两种方式service和systemctl。而systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动,systemd对应的进程管理命令就是systemctl。值得一提…

systemd简介

Systemd 是一个专用于 Linux 操作系统的系统与服务管理器,其目的是要取代Unix时代以来一直在使用的init系统。 systemd概述Systemd 是 Linux 系统中最新的初始化系统(init),它主要的设计目标是克服 sysvinit 固有的缺点,提高系统的启动速度。 systemd框架图 根据 Linux 惯…

Systemd 入门及常用命令

目录 Systemdsystemd架构systemd 系统管理管理系统查看启动耗时查看当前主机的信息 Unit 资源查看当前系统的所有 Unit查看系统状态和单个 Unit 的状态 Unit 管理依赖关系Unit 配置文件查看配置文件的内容 Targettarget(Systemd) 与 runlevel&#xff08…

systemd 介绍

转自:https://www.linuxidc.com/Linux/2018-03/151291.htm 从 init 系统说起 Linux 操作系统的启动首先从 BIOS 开始,接下来进入 boot loader,由 bootloader 载入内核,进行内核初始化。内核初始化的最后一步就是启动 PID 为 1 的 …

[2020.1.10]systemd介绍

1 systemd基本概念 systemd:a system daemon,相当于以前的init进程,pid1,systemd是1号进程!!! sbin/init --> /lib/systemd/systemd unit: 一个进程,例如lightdm.service job: 一个动作,启动是个job,关闭是个job。开机启动时,systemd…

systemd教程(三)

下来会通过示例来描述不同Service Type值的应用场景。在此之前,强烈建议先阅读前后台进程父子关系和daemon类进程来搞懂进程之间的关系和Daemon类进程的特性。 systemd service:Typeforking 当使用systemd去管理一个长久运行的服务进程时,最…

dpkg打包笔记

dpkg 安装软件 dpkg -i xxx.deb 查看安装目录 dpkg -L xxx 显示版本 dpkg -l xxx 详细信息 dpkg -s xxx 罗列内容 dpkg -c xxxx 卸载软件 dpkg -r xxxx 构建deb包 dpkg -p

dpkg和apt

文章目录 Ubuntu软件安装Deb包安装Deb包简介dpkg常用命令 apt-get源安装apt-get简介apt工作原理apt相关文件常用的apt命令参数apt-getapt-cache dpkg和apt-get的区别 Ubuntu软件安装 Linux有很多种发行版本,各种发行版本之间安装软件方式和命令不一样,同…

dpkg安装

目录 转载:https://blog.csdn.net/u012300744/article/details/80267225 1.安装 (3)安装 sudo dpkg -i deb文件名 (4)根据经验,通常情况下会报依赖关系的错误,我们可以使用以下的命令修复安…

dpkg制作deb包详解

1 deb包文件结构 deb 软件包里面的结构,它具有DEBIAN和软件具体安装目录(如etc, usr, opt, tmp等)。在DEBIAN目录中至少必须包括control文件,还有可能postinst(postinstallation)、postrm(postremove)、preinst(preinstallation)、…

dpkg命令的用法

dpkg命令的用法 dpkg 是Debian package的简写,为”Debian“ 操作系统 专门开发的套件管理系统,用于软件的安装,更新和移除。 所有源自"Debian"的Linux的发行版都使用 dpkg, 例如"Ubuntu" 阅读目录 安装软件列出与该…

dpkg说明

dpkg与centos中的rpm相似,被用于安装,卸载及查询deb包信息。下面简单介绍基础命令。 已有安装包:test.deb。 安装命令: dpkg -i test.deb 安装test.deb软件包 dpkg -c test.deb #查看test.deb软件包中包含的文件结构 安装后查询命令&#xff…

大数据生态和Spark简介

一、大数据时代 1.第三次信息化浪潮:根据IBM前首席执行官郭士纳的观点,IT领域每隔十五年就会迎来一次重大变革。 2.数据产生方式的变革促成大数据时代的来临: ①存储设备容量不断增加 ②CPU处理能力大幅提升 ③网络带宽不断增加 等等&#…

Spark大数据计算引擎介绍

本文内容参考《Spark与Hadoop大数据分析》[美]文卡特安卡姆 著;《大数据架构详解 从数据获取到深度学习》 朱洁 罗华霖 著。 大数据生态的两个主要部分是Hadoop软件框架和Spark内存级计算引擎。Hadoop包含四个项目:Hadoop common,HDFS&#…

大数据之spark_spark简介

什么是Spark Spark是一种快速、通用、可扩展的大数据分析引擎,2009年诞生于加州大学伯克利分校AMPLab,2010年开源,2013年6月成为Apache孵化项目,2014年2月成为Apache的顶级项目,2014年5月发布spark1.0,201…

开源项目_springboot的答题系统+spark大数据实时分析

一、项目展示 在这里,主要展示大数据图表分析的几个页面。更多精彩由您自己发掘! 图1 饼状图 图2 堆叠图 图3 柱状图 二、项目介绍 本项目分为两个模块,第一个为java语言基于springboot实现的答题模块,另一个为scala语言基于spar…

Spark大数据开发技术简介

Spark大数据开发技术简介 轻量级的内存集群计算平台 文章目录 Spark大数据开发技术简介历史沿革Spark的优点对比Apache Spark堆栈中的不同组件基本原理架构组成部署和体系结构Spark运行模式 页面 历史沿革 Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架最…

【大数据】【Spark】Spark概述

由于Spark程序的编写最好使用Scala语言,可参照博主以下Scala入门文章 链接:https://blog.csdn.net/treesorshining/article/details/124697102 文章目录 1.Spark概念2.Spark与Hadoop的关系1.从时间节点上来看2.从功能上来看 3.Spark与Hadoop的比较4.Spar…

Spark大数据系列教程持续更新

Spark大数据系列教程 想学习大数据的福利来了,由于近期工作繁忙,本人已将自己学习大数据的过程陆续开始更新: Spark大数据系列:一、RDD详解Spark大数据系列 二、Spark入门程序WordCount详解(Scala版本)Spark大数据系列&#xff…