systemd学习

news2024/11/15 15:33:41

传统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.coloradmin.cn/o/2150565.html

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

相关文章

mybatisplus的多记录操作 批量删除和批量查询

1.批量查询 通过in查询 Testpublic void testBatchSelectByIds(){List<Integer> ids Arrays.asList(5,7);List<User> users userMapper.selectBatchIds(ids);log.info(users);} 2.批量删除 Testpublic void testBatchDelete(){List<Integer> ids Arrays…

LLM - 理解 多模态大语言模型(MLLM) 的 指令微调(Instruction-Tuning) 与相关技术 (四)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142237871 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…

Java知识点小结3:内存回收

文章目录 对象引用强引用软引用&#xff08;SoftReference&#xff09;弱引用&#xff08;WeakReference&#xff09;考一考 虚引用&#xff08;PhantomReference&#xff09;总结 垃圾回收新生代老年代永生代 内存管理小技巧尽量使用直接量使用StringBuilder和StringBuffer进行…

Vue学习记录之六(组件实战及BEM框架了解)

一、BEM BEM是一种前端开发中常用的命名约定&#xff0c;主要用于CSS和HTML的结构化和模块化。BEM是Block、Element、Modifier的缩写。 Block&#xff08;块&#xff09;&#xff1a;独立的功能性页面组件&#xff0c;可以是一个简单的按钮&#xff0c;一个复杂的导航条&…

A Simple Encoder-Decoder for Open-Vocabulary Semantic Segmentation

FAM: Feature Aggregation Module&#xff0c;Circle with R represents removing feature maps of non-selected categories 辅助信息 权重有1.3G&#xff0c;不建议复现

neo4j关系的创建删除 图的删除

关系的创建和删除 关系创建 CREATE (:Person {name:"jack"})-[:LOVE]->(:Person {name:"Rose"})已有这个关系时&#xff0c;merge不起效果 MERGE (:Person {name:"Jack" })-[:LOVE]->(:Person {name:"Rose"})关系兼顾节点和关…

功耗中30分钟下载场景对平均电流标准的影响评估

下载场景的测试数据: 测试结论:相同场景下,有应用下载安装跟没应用下载安装,平均电流相差90-140mA左右 查看数据:下载场景的平均增量电流 (227+279) / 2 - 136 = 117 mA 理论的量化数据影响 根据当前的测试数据:静置待机平均电流 136 mA,下载场景平均电流增量 117mA, …

相亲交易系统源码详解与开发指南

随着互联网技术的发展&#xff0c;越来越多的传统行业开始寻求线上转型&#xff0c;其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求&#xff0c;因此&#xff0c;开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

电气自动化入门05:三相异步电动机的正反转点动控制电路

视频链接&#xff1a;3.2 电工知识&#xff1a;三相异步电动机的正反转点动控制电路_1_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p6&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.断路器及其选型 1.1断路器定义、分类、表示符号 1.2.断路器功能、…

Vision Transform—用于大规模图像分类的Transformers架构

VIT — 用于大规模图像识别的 Transformer 论文题目&#xff1a;AN IMAGE IS WORTH 16X16 WORDS:TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE。 官方代码&#xff1a;https://github.com/google-research/vision_transformer 引言与概述 Vision Transformer&#xff08;ViT&…

虚拟机vaware中cpu设置跑满大核

首先&#xff0c;大核速度快&#xff0c;并且在资源紧张时大核优先&#xff0c;小核甚至是闲着围观大核跑满。其次&#xff0c;遇到经常切换操作虚拟机和win11的使用场景&#xff0c;切换核心本身也会造成一点卡顿&#xff0c;降低虚拟机里操作流畅度。另外&#xff0c;13代在你…

【linux】4张卡,坏了1张,怎么办?

先禁用这张卡 grub 禁用&#xff0c;防止加载驱动 禁用这张卡的 PCI # 禁用 PCI 设备 0000:b1:00.0 (NVIDIA GPU) ACTION"add", SUBSYSTEM"pci", ATTR{vendor}"0x10de", KERNELS"0000:b1:00.0", RUN"/bin/sh -c echo 0000:b1:00…

vue part 10

vue-resource 在vue1.0时代讲的比较多&#xff0c;是vue.插件库&#xff0c; import vueResource from vue-resourceVue.use(vueResource) 在vc和vm中会多出如下F12代码即&#xff0c;$http:() 他的用法和返回值和axios一模一样&#xff0c;但是不常维护了 插槽 默认插槽 …

11年计算机考研408-数据结构

设执行了k次。 解析&#xff1a; d要第一个出&#xff0c;那么abc先入栈&#xff0c;d入栈然后再出栈&#xff0c;这前面是一个固定的流程&#xff0c;后面就很灵活了&#xff0c;可以ecba&#xff0c;ceba&#xff0c;cbea&#xff0c;cbae。 答案是4个序列。 解析&#xff1a…

解决redis缓存击穿问题之布隆过滤器

布隆过滤器 1. 什么是布隆过滤器 布隆过滤器&#xff08;Bloom Filter&#xff09;是一个空间效率很高的数据结构&#xff0c;用于判断一个元素是否在一个集合中。布隆过滤器的核心思想是利用位数组和一系列随机映射函数&#xff08;哈希函数&#xff09;来快速判断某个元素是…

基于SpringBoot+Vue+MySQL的网上租赁系统

系统展示 用户前台界面 管理员后台界面 系统背景 在当前共享经济蓬勃发展的背景下&#xff0c;网上租赁系统作为连接租赁双方的重要平台&#xff0c;正逐步改变着人们的消费观念和生活方式。通过构建一个基于SpringBoot、Vue.js与MySQL的网上租赁系统&#xff0c;我们旨在为用户…

LangChain 和 Elasticsearch 加速构建 AI 检索代理

作者&#xff1a;来自 Elastic Joe McElroy, Aditya Tripathi, Serena Chou Elastic 和 LangChain 很高兴地宣布发布新的 LangGraph 检索代理模板&#xff0c;旨在简化需要代理使用 Elasticsearch 进行代理检索的生成式人工智能 (GenAI) 代理应用程序的开发。此模板预先配置为使…

基于机器学习的癌症数据分析与预测系统实现,有三种算法,bootstrap前端+flask

研究背景 癌症作为全球范围内最主要的死亡原因之一&#xff0c;已成为当代医学研究和公共健康的重大挑战。据世界卫生组织&#xff08;WHO&#xff09;的统计&#xff0c;癌症每年导致全球数百万人的死亡。随着人口老龄化、环境污染和生活方式的改变&#xff0c;癌症的发病率逐…

Pytorch学习---基于经典网络架构ResNet训练花卉图像分类模型

基于经典网络架构训练图像分类模型 导包 import copy import json import time import torch from torch import nn import torch.optim as optim import torchvision import os from torchvision import transforms, models, datasets import numpy as np import matplotlib.…

【使用Hey对vllm接口压测】模型并发能力

使用Hey对vllm进行模型并发压测 docker run --rm --networkknowledge_network \registry.cn-shanghai.aliyuncs.com/zhph-server/hey:latest \-n 200 -c 200 -m POST -H "Content-Type: application/json" \-H "Authorization: xxx" \-d {"model"…