systemd学习

传统init进程启动流程

kernel内核代码init/main.c,内核启动init进程过程:

init进程是由内核启动的第一个(也是唯一的一个)用户进程(进程id为1),它根据配置文件决定启动哪些程序,init进程是后续进程的发起者;busybox init 根据inittab启动整个系统,busybox init只是作为其它进程的发起者和控制者;

 

这种方法有两个缺点:
 

  1. 启动时间长,init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
  2. 启动脚本复杂,init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。

 

Systemd特性

Systemd 就是为了解决这些问题而诞生的。它的设计目标是,为系统的启动和管理提供一套完整的解决方案。
根据 Linux 惯例,字母d是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。

 

为了减少系统启动时间,systemd 的目标是:
·尽可能启动更少的进程
·尽可能将更多进程并行启动

如何集成Systemd到工程?

buildroot构建工具中,systemd如何配置安装?

buildroot菜单配置路径:package/systemd

配置路径:

 -> Target packages
    -> System tools

        -> systemd

 

--- systemd
    [ ]   HTTP server for journal events
    [ ]   enable backlight support
    [ ]   enable binfmt tool
    [ ]   enable coredump hook
    [ ]   enable firstboot support
    [ ]   enable hibernation support
    [*]   enable hostname daemon
    [*]   enable hwdb installation
    [ ]   enable import daemon
    [*]   enable kdbus support
    [ ]   enable locale daemon
    [ ]   enable login daemon
    [ ]   enable machine daemon
    [*]   enable myhostname NSS plugin
    [*]   enable network manager
    [ ]   enable polkit support
    [ ]   enable quotacheck tools
    [ ]   enable random-seed support
    [*]   enable resolve daemon
    [ ]   enable rfkill tools
    [ ]   enable SMACK support
    [ ]   enable sysusers support
    [*]   enable timedate daemon
    [*]   enable timesync daemon
    [*]   enable tmpfiles support
    [ ]   enable vconsole tool

 

 

系统加入systemd 的原理:

buildroot的package/systemd中的mk文件有如下字段:

define SYSTEMD_INSTALL_INIT_HOOK
        ln -fs ../lib/systemd/systemd
    $(TARGET_DIR)/sbin/init

        ln -fs ../bin/systemctl                  $(TARGET_DIR)/sbin/halt

        ln -fs ../bin/systemctl                  $(TARGET_DIR)/sbin/poweroff

        ln -fs ../bin/systemctl                  $(TARGET_DIR)/sbin/reboot

        ln -fs ../bin/systemctl                  $(TARGET_DIR)/sbin/shutdown

        ln -fs ../../../lib/systemd/system/multi-user.target \
                
                                                $(TARGET_DIR)/etc/systemd/system/default.target

endef

可知systemd 的init替代成为内核启动的唯一进程init

 

systemd系统管理(提供的工具)

systemctl:                     Systemd 的主命令,用于管理系统

systemd-analyze:        命令用于查看启动耗时

hostnamectl:               命令用于查看当前主机的信息

localectl:                     命令用于查看本地化设置

timedatectl:                命令用于查看当前时区设置

loginctl:                        命令用于查看当前登录的用户

journalctl                     日志管理

 

systemd执行单元-Unit

Systemd 可以管理所有系统资源。不同的资源统称为 Unit(单位),每一个 Unit 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit。

 

Service unit:系统服务
Target unit:多个 Unit 构成的一个组
Device Unit:硬件设备
Mount Unit:文件系统的挂载点
Automount Unit:自动挂载点
Path Unit:文件或路径
Scope Unit:不是由 Systemd 启动的外部进程
Slice Unit:进程组
Snapshot Unit:Systemd 快照,可以切回某个快照
Socket Unit:进程间通信的 socket
Swap Unit:swap 文件
Timer Unit:定时器

 

配置文件规则:

 

[Unit]区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

  • Description=:这里一般写服务简短的描述。
  • Documentation=:这里一般是服务文档的链接等。
  • Requires=:这里写本服务依赖的其他服务,启动本服务时,一般会并行的启动该服务和它所依赖的服务,如果它依赖的服务启动失败了,本服务将无法启动成功。
  • Wants=:这个命令和Requires=类似但是相对宽松一些,即使依赖的服务启动失败了,本服务也可以继续正常启动。一般的依赖都推荐使用这个命令。
  • BindsTo=:和Requires=类似,但是如果依赖的服务停止了,本服务也会停止。
  • Before=After=:这两个需要和上面描述依赖关系的命令一起使用,表示依赖的当前服务与依赖的服务启动的先后顺序:Before=表示当前服务启动成功后才可以启动依赖服务,After=相反。
  • Conflicts=:这个命令后面跟的服务将不能和当前服务同时运行,如果当前服务运行则会导致该命令列举的服务被停止。
  • Condition...=:这个命令往往和许多其他命令一起使用,用来测试一些条件,比如测试当前的操作系统。如果条件不满足,则跳过当前服务的启动。
  • Assert...=:和Condition...=类似,但是如果条件检测不满足会导致失败。

 

[Install]通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下

  • WantedBy=:这个命令是最通用的用来指定服务如何被enable,即在哪些target/runlevel下被设置为开机自启动。我们可以通过这个命令来指定服务捡的依赖关系,有点像[Unit]部分的Wants=,但是这个只是辅助性的。当一个unit被enable后,就会在/etc/systemd/system目录下创建以.wants为后缀的目录,比如当前unit文件里面写了WantedBy=multi-user.target,那么enable当前unit后,就会在/etc/systemd/system目录下创建multi-user.target.wants目录,并且将当前unit及其依赖的unit的符号链接放在新创建的目录里面。disable该unit之后,它的软连接及其依赖的unit的软连接都将被删除。
  • RequiredBy=:和WantedBy=类似,但是它指定的依赖条件如果不满足,就会导致服务启动失败。如果enable的话,创建的是.requires结尾的目录。
  • Alias=:给服务创建别名。
  • Also=:将多个unit设置为一个组,可以一起操作。

 

[Service]区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

unit对象有很多种类型,其中device,target,snapshot,scope这几种类型没有对应该类型的Section,其他的都有,比如service这种类型特有的section就是[Service],也就是本节要介绍的。[Service]有一个必须的命令就是Type,它根据进程的行为将服务分为好多类别,不同的类别管理不是不太一样:

  • simple:这种是最普遍的类型,在启动行(使用ExecStart=指定)指定进程,如果Type=Busname=没有设置,但是ExecStart=却指定了的话,那默认就是这种类型。
  • forking:这种类别指的是那种fork出来子进程后,父进程就马上退出的情况。这种类型下,父进程退出后,systemd仍然认为进程是OK的。而且可以使用PIDFile=命令来指定存放主子进程pid的文件。Nginx就属于这种类型。
  • oneshot:这种一般用在存活时间不长的一次性任务的进程上,它告诉systemd应该等待进程退出后再接着去处理其它的unit。
  • dbus:这种类别的告诉systemd该unit会在D-Bus上面获取一个名字。
  • notify:这种类别的服务会在启动完之后发出一个消息,systemd必须等到接收到这个消息后才可以接着去处理其它unit。
  • idle:这种类别表示在收到所有任务前,服务都不会运行。

OK,上面就是Type=可取得值。下面介绍除Type=以外的其他命令:

  • ExecStart=:用来指定进程文件(必须是绝对路径)和启动参数,一般该命令只能指定一次。有一个特殊的用法就是比如其他文件里面已经设置了,我们现在想在优先级更高的地方覆盖它,就可以先写一行ExecStart=(前面的表示清空之前的设置),然后再在另外一行写上完整的命令ExecStart=***。另外,如果在命令之前加上-的话表示进程如果以非0退出,也不算失败。
  • ExecStartPre=ExecStartPost=:看名字就看出来了,通过这两个指令可以指定在进程运行前和运行后执行的命令,同样也可以加-,表示接受非0的退出状态。
  • ExecReload=:重新加载服务的配置。
  • ExecStop=:指定停止服务的命令,如果未指定,服务停止后将使用kill来杀掉进程。
  • ExecStopPost=:指定服务停止后运行的命令。
  • RestartSec=:如果服务的自动重启设置了的话,这个命令指定多久重启。
  • Restart=:指定systemd在何种状态下重启服务,可用值有:"always", "on-success", "on-failure", "on-abnormal", "on-abort", "on-watchdog".
  • TimeoutSec=:指定systemd在标记服务失败多久前强制杀掉进程。也可以分别指定TimeoutStartSec=TimeoutStopSec=

备注:

    配置文件分成几个区块,配置文件的区块名和字段名,都是大小写敏感的;
    键值对的等号两侧不能有空格;

    配置文件的后缀名,就是该 Unit 的种类,比如sshd.socket。如果省略,Systemd 默认后缀名为.service,所以sshd会被理解成sshd.service

 

Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。

systemctl enable命令用于在上面两个目录之间,建立符号链接关系,如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。

与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。

 

systemdservice实例

操作实例:

/usr/lib/systemd/system中创建文件service配置文件,文件内容如下:

test.service

------------------------------------------------------------
[Unit]
Description=systemd test service

[Service]
Type=simple
ExecStartPre=/bin/echo "[test service]: Pre start..."
ExecStart=/usr/bin/test_service.sh
Restart=always

[Install]
WantedBy=multi-user.target

------------------------------------------------------------

/usr/bin/目录创建测试用的可执行脚本

test_service.sh

------------------------------------------------------------

#!/bin/sh
cnt=5
while [ $cnt -gt 0 ];do
        echo "test running cnt:"$cnt
        sleep 1
        cnt=`expr $cnt - 1`
done

------------------------------------------------------------

 

systemctl start|stop|restart  test.service,启动|停止|重启服务


systemctl status test.service,查看服务状态


journalctl -u test.service -f ,实时滚动显示某个 Unit 的最新日志

 

systemctl    enable|disable test.service 使能|禁止服务

 

systemd依赖

/usr/lib/systemd/system # cat foo.service
[Unit]
Description=systemd foo service
Wants=test.service

[Service]
Type=simple
ExecStartPre=/bin/echo "[foo service]: Pre start..."
ExecStart=/usr/bin/foo_service.sh
Restart=always

[Install]
WantedBy=multi-user.target

 

systemd定时器

Timer Unit示例:

创建文件 foo.timer

/usr/lib/systemd/system # cat foo.timer
[Unit]
Description=systemd foo timer

[Timer]
OnStartupSec=1min
OnUnitActiveSec=1min
Unit=foo_timer.service

[Install]
WantedBy=multi-user.target

 

参考资料

[Timer] 部份:

设定参数

参数意义说明

OnActiveSec

当 timers.target 启动多久之后才执行这只 unit

OnBootSec

当开机完成后多久之后才执行

OnStartupSec

当 systemd 第一次启动之后过多久才执行

OnUnitActiveSec

这个 timer 配置文件所管理的那个 unit 服务在最后一次启动后,隔多久后再执行一次的意思

OnUnitInactiveSec

这个 timer 配置文件所管理的那个 unit 服务在最后一次停止后,隔多久再执行一次的意思。

OnCalendar

使用实际时间 (非循环时间) 的方式来启动服务的意思!至于时间的格式后续再来谈。

Unit

一般来说不太需要设定,因此如同上面刚刚提到的,基本上我们设定都是 sname.server + sname.timer,那如果你的 sname 并不相同时,那在 .timer 的文件中, 就得要指定是哪一个 service unit 啰!

Persistent

当使用 OnCalendar 的设定时,指定该功能要不要持续进行的意思。通常是设定为 yes ,比较能 够满足类似 anacron 的功能喔!

 


 

创建文件执行主体 foo_timer.service

/usr/lib/systemd/system # cat foo_timer.service
[Unit]
Description=foo timer service

[Service]
Type=simple
ExecStart=/bin/echo "########### systemd foo timer begining... ========="

[Install]
WantedBy=multi-user.target

 

systemctl enable foo.timer 使能foo定时器;重启,journalctl  查看日志信息

 

 

systemd启动优先级与依赖关系分析

查看当前的使能的target

/ # systemctl list-unit-files --type=target | grep enable
ctrl-alt-del.target       enabled
default.target            enabled
machines.target           enabled
multi-user.target         enabled
reboot.target             enabled
remote-fs.target          enabled
runlevel2.target          enabled
runlevel3.target          enabled
runlevel4.target          enabled
runlevel6.target          enabled

 

 

 

systemd配置文件的存放位置

/etc/systemd/system存放系统当前启动的unit

/lib/systemd/system存放系统unit

/usr/lib/systemd/system存放用户unit

/run/systemd系统生成unit

 

 

/etc/systemd/system目录内容如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144194.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

我的AI工具箱Tauri版-VideoClipMixingCut视频批量混剪

本教程基于自研的AI工具箱Tauri版进行VideoClipMixingCut视频批量混剪。 VideoClipMixingCut视频批量混剪 是自研AI工具箱Tauri版中的一款强大工具,专为自动化视频批量混剪设计。该模块通过将预设的解说文稿与视频素材进行自动拼接生成混剪视频,适合需要…

【Finetune】(二)、transformers之Prompt-Tuning微调

文章目录 0、prompt-tuning基本原理1、实战1.1、导包1.2、加载数据1.3、数据预处理1.4、创建模型1.5、Prompt Tuning*1.5.1、配置文件1.5.2、创建模型 1.6、配置训练参数1.7、创建训练器1.8、模型训练1.9、推理:加载预训练好的模型 0、prompt-tuning基本原理 prompt…

【论文阅读】FedABC: Targeting Fair Competition in Personalized Federated Learning

论文链接(AAAI2023) 文章解决的问题主要是NO-IID问题。 文章的方法包括几个关键的技术和策略,具体如下: 二元分类框架: FedABC利用二元分类的训练策略来解决每个类别的个性化问题。这意味着对于每个类别都训练一个独立…

初识 C++ ( 1 )

引言:大家都说c是c的升级语言。我不懂这句话的含义后来看过解释才懂。 一、面向过程语言和面向对象语言 我们都知道C语言是面向过程语言,而C是面向对象语言,说C和C的区别,也就是在比较面向过程和面向对象的区别。 1.面向过程和面向…

JDBC 编程

目录 JDBC 是什么 JDBC 的工作原理 JDBC 的使用 引入驱动 使用 常用接口和类 Connection Statement ResultSet 使用总结 JDBC 是什么 JDBC(Java Database Connectivity):Java数据库连接,是一种用于执行 SQL 语句的Java…

‍♀️焦虑症患者的救赎之路:这5项运动让你重拾宁静与力量!

在这个快节奏、高压力的时代,焦虑症已成为许多人难以言说的秘密。它像一张无形的网,悄悄侵蚀着我们的心灵,让我们在日复一日的焦虑中挣扎。然而,你知道吗?运动,这一简单而强大的自然疗法,正是我…

强化信息安全:密码机密钥管理的策略与实践

强化信息安全:密码机密钥管理的策略与实践 随着信息技术的飞速发展,信息安全已成为企业和社会关注的焦点。密码机作为加密通信和数据保护的关键设备,其密钥管理直接关系到整个信息系统的安全性。本文旨在探讨密码机密钥管理的策略与实践&…

Java 实现桌面烟花秀

前言 今天,我们将展示如何使用 Java Swing 创建一个烟花效果,覆盖整个桌面。我们将重点讲解如何在桌面上展示烟花、如何实现发射和爆炸效果,以及如何将这些效果整合到一个完整的程序中。 效果展示 如上图所示,我们在桌面实现了&…

深入解析ThingsBoard与ThingsKit物联网平台的差异

VS 在物联网(IoT)领域,平台的选择对于企业来说至关重要。本文将深入探讨ThingsBoard社区版与ThingsKit企业版这两个物联网平台的差异,帮助读者更好地理解它们的特色和适用场景。 系统相同点 首先,ThingsBoard社区版和ThingsKit企业版都基于…

Flink1.18.1 Standalone模式集群搭建

Flink1.18.1 Standalone模式集群搭建 Flink1.18.1 Standalone模式集群搭建1. 环境准备1.1 Flink下载地址1.2 集群角色分配 2. Flink 集群安装步骤2.1 下载并解压 Flink2.2 解压安装包2.3 配置环境变量2.4 配置 SSH 免密登录 3. 配置 Flink 集群3.1 修改 flink-conf.yaml 配置文…

Day99 代码随想录打卡|动态规划篇--- 01背包问题

题目(卡玛网T46): 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等&am…

【linux008】目录操作命令篇 - rmdir 命令

文章目录 1、基本用法2、常见选项3、举例4、注意事项 rmdir 是 Linux 系统中的一个命令,用于删除空目录。它只能删除 空目录,如果目录中存在文件或子目录,则无法删除。 1、基本用法 rmdir [选项] 目录名...2、常见选项 -p, --parents&…

Linux标准IO-系统调用详解

1.1 系统调用 系统调用(system call)其实是 Linux 内核提供给应用层的应用编程接口(API),是 Linux 应用层进入内核的入口。不止 Linux 系统,所有的操作系统都会向应用层提供系统调用,应用程序通…

在 Windows 上恢复已删除的 PDF 文件的最佳方法

如果您不小心删除了 PDF 文件或由于系统突然崩溃而无法再找到它们,本指南介绍了恢复已删除文件的最佳方法。 帖子中列出的方法简单、有效且可行。我们在列出它们之前对其进行了测试。 什么是 PDF,Adobe 将未保存的 PDF 存储在哪里? 自从 Ad…

无损转换:严选4个视频mkv转mp4格式的方法

视频的mkv格式是较为清晰的视频格式,但越清晰的视频格式所占的设备内存也就越大,从而也可能会出现视频传输失败、播放卡顿等的问题。对此,我们可以将视频转换为体积较小的格式来解决上述问题,如mkv转mp4。接下来,小编就…

实战讲稿:Spring Boot整合MyBatis

文章目录 实战讲稿:Spring Boot整合MyBatis课程目标课程内容1. 创建员工映射器接口1.1 创建子包1.2 创建接口 2. 测试员工映射器接口2.1 自动装配员工映射器2.2 测试按标识符查询员工方法2.3 测试查询全部员工方法2.4 测试插入员工方法2.5 测试更新员工方法2.6 测试…

『玉竹』基于Laravel 开发的博客、微博客系统和Android App

基于 Laravel 和 Filament 开发, 使用 Filament 开发管理后台,前端比较简洁。 博客大家都清楚是什么东西,微博客类似于微博之类的吧,有时候想要写的东西可能只有几句话,想要起个标题都不好起。 为了是微博客功能更好用&#xff0c…

通信工程学习:什么是ONT光网络终端

ONT:光网络终端 ONT(Optical Network Terminal,光网络终端)是光纤接入网络(FTTH)中的关键设备,用于将光纤信号转换为电信号或将电信号转换为光信号,以实现用户设备与光纤网络的连接。…

我的AI工具箱Tauri版-VideoIntroductionClipCut视频介绍混剪

本教程基于自研的AI工具箱Tauri版进行VideoIntroductionClipCut视频介绍混剪。 本项目为自研的AI工具箱Tauri版中的视频剪辑模块,专注于自动生成视频介绍片段。该模块名为 VideoIntroductionClipCut,用户可以通过该工具快速进行视频的混剪和介绍内容的生…

Android开发高频面试题之——Android篇

Android开发高频面试题之——Android篇 Android开发高频面试题之——Java基础篇 Android开发高频面试题之——Kotlin基础篇 Android开发高频面试题之——Android基础篇 1. Activity启动模式 standard 标准模式,每次都是新建Activity实例。singleTop 栈顶复用。如果要启动的A…