当前位置: 首页 > news >正文

Ubuntu 下 systemd 介绍

在这里插入图片描述

系列文章目录


Linux内核学习
Linux 知识(1)
Linux 知识(2)
WSL Ubuntu
QEMU 虚拟机
Linux 调试视频
PCIe 与 USB 的补充知识
vscode 使用说明
树莓派 4B 指南
设备驱动畅想
Linux内核子系统
Linux 文件系统挂载
QEMU 通过网络实现共享文件
OrangePi 学习摘录 —— 制作桌面版镜像
Radxa 学习摘录
Rockchip RK3399 - 引导流程和准备工作
制作Ubuntu根文件
制作RK3568 ubuntu20.04桌面版镜像
Rockchip RK3399 - 移植ubuntu 20.04.4根文件系统


文章目录

  • 系列文章目录
  • 1、init 启动方式
  • 2、相关目录介绍
  • 3、systemd 工作流程
    • 1. 启动阶段
    • 2. 加载配置文件
    • 3. 确定运行模式
    • 4. 启动基础服务
    • 5. 启动目标服务
    • 6. 服务管理
    • 7. 日志管理
    • 8. 资源控制
    • 9. 故障恢复
    • 总结
  • 4、写一个 systemd 配置文件
    • 1. 创建服务单元文件
    • 2. 编写服务配置
    • 3. 配置文件解析
    • 4. 加载并启动服务
    • 5. 注意事项


1、init 启动方式

init 进程启动后,负责初始化用户空间的系统服务和应用程序:

  • SysV init(传统方式):
    /etc/inittab 文件读取配置,确定默认运行级别(如多用户模式或图形界面模式)。
    启动基本系统服务,如网络服务、系统日志、用户登录服务(getty 等)。

  • systemd(现代主流方式,Ubuntu 从 15.04 开始默认使用):
    系统大部分组件被建模为 systemd 服务。
    通过目标单元(如 multi-user.target 或 graphical.target)协调服务启动顺序。
    自动优化启动流程,减少依赖和启动时间。

2、相关目录介绍

以下是 systemd 功能相关的目录介绍:

  1. /usr/lib/systemd/system
  • 用途 :存放由软件包安装的 systemd 单元文件,包括各种服务(.service)、目标(.target)、挂载(.mount)等单元文件。
  • 特点 :该目录下的配置文件是由软件包管理器(如 apt、rpm 等)安装软件时自动放置的,通常不需要用户手动修改。它为系统提供了各种预定义的服务和功能配置。
  1. /run/systemd/system
  • 用途 :存放系统运行时动态生成的单元文件。这些文件通常是在系统运行过程中,由各种服务或进程根据需要创建的。
  • 特点 :该目录下的配置文件具有中等优先级,一般很少被手动修改,除非需要调整程序运行时的一些参数,即 Session 级别的参数。
  1. /etc/systemd/system
  • 用途 :存放系统管理员自定义的 systemd 单元文件,或者通过 systemctl enable 命令创建的开机启动服务的符号链接。
  • 特点 :该目录下的配置文件优先级最高,如果同一选项在多个目录中都配置了,这里的配置会覆盖其他目录的配置。系统管理员可以在此目录中创建自己的单元文件,或者通过符号链接的方式启用或禁用服务。
  1. /lib/systemd/system
  • 用途 :与 /usr/lib/systemd/system 目录相同,用于存放软件包安装的 systemd 单元文件。
  • 特点 :在许多 Linux 系统中,/lib 目录实际上是 /usr/lib 的符号链接,因此这两个目录在实际使用中是等价的。

3、systemd 工作流程

systemd 是现代 Linux 系统中广泛使用的初始化系统和服务管理器,负责在系统启动时管理和启动各种服务、资源和进程。以下是 systemd 的工作流程:

1. 启动阶段

  • 内核启动 systemd
    • 内核加载完成后,会启动第一个用户空间进程 systemd(PID=1)。systemd 是现代 Linux 系统的初始化进程,取代了传统的 init 进程。
    • systemd 会读取配置文件(如 /etc/systemd/system/default.target),确定系统的默认运行模式(如多用户模式或多用户图形界面模式)。

2. 加载配置文件

  • 系统初始化配置
    • systemd/etc/systemd/system.conf 文件中加载系统初始化配置,包括系统的运行模式、默认的依赖关系模式等。
  • 单元文件查找
    • 系统启动时,systemd 首先会读取 /etc/systemd/system/usr/lib/systemd/system/run/systemd/system 目录中的单元文件(例如 .service.target.socket 等)。其中:
      • /etc/systemd/system:优先级最高,存放系统管理员自定义或使用 systemctl enable 启用的单元文件。
      • /usr/lib/systemd/system:存放软件包安装的默认单元文件。
      • /run/systemd/system:存放系统运行时生成的临时单元文件。

3. 确定运行模式

  • 运行模式(Target):
    • systemd 使用 target 来定义系统的运行模式。常见的 target 包括:
      • multi-user.target:多用户命令行模式。
      • graphical.target:图形化多用户模式。
    • 默认运行模式由 /etc/systemd/system/default.target 文件指定。

4. 启动基础服务

  • 基础服务启动:
    • systemd 会启动一些基础服务,如:
      • udev:管理设备节点。
      • systemd-logind:管理用户会话。
      • systemd-journald:管理日志系统。
    • 这些服务是系统运行的基础设施,必须优先启动。

5. 启动目标服务

  • 根据 target 启动服务:
    • systemd 会根据目标 target 文件(如 multi-user.target 或 graphical.target)启动相关服务。
    • 服务的配置文件通常位于 /etc/systemd/system/<target>.wants/ 目录下。
    • 服务启动时,systemd 会自动解析服务之间的依赖关系,并按需并行启动服务。

6. 服务管理

  • 服务生命周期管理:

    • systemd 提供了 systemctl 命令来管理服务,例如:
      • systemctl start <service>:启动服务。
      • systemctl stop <service>:停止服务。
      • systemctl restart <service>:重启服务。
      • systemctl status <service>:查看服务状态。
  • 开机自启管理:
    通过 systemctl enable <service>systemctl disable <service> 命令,可以启用或禁用服务的开机自启动。

7. 日志管理

  • 日志记录:
    • systemd-journald 负责记录系统日志,日志存储在内存和磁盘中,便于快速查询。
  • 日志查询:
    • 使用 journalctl 命令可以查看日志,例如:
      • journalctl -u <service>:查看指定服务的日志。
      • journalctl -b:查看本次启动的日志。
      • journalctl -f:实时查看最新日志。

8. 资源控制

  • 资源隔离:
    • systemd 使用控制组(cgroups)来隔离和限制服务的资源使用,例如内存、CPU 等。
  • 沙盒运行:
    • 可以通过配置文件中的选项(如 ProtectSystem=strict 和 PrivateTmp=true)增强服务的安全性。

9. 故障恢复

  • 自动重启服务:
    • 在服务配置文件中设置 Restart=on-failure,当服务崩溃时,systemd 会自动重启服务。

总结

systemd 的工作流程包括从系统启动到服务管理的全过程,其核心特点是:

  • 并行启动:通过并行启动服务,显著缩短系统启动时间。
  • 依赖管理:自动解析服务之间的依赖关系,确保服务按正确顺序启动。
  • 统一管理:通过 systemctl 和 journalctl 命令,提供了一致的服务和日志管理接口。

4、写一个 systemd 配置文件

systemd 使用单元文件(unit files)来管理各种系统资源。以下是一个简单的自定义服务配置示例,我们将创建一个名为 my-custom-service.service 的服务。

1. 创建服务单元文件

/etc/systemd/system/ 目录下创建一个新的单元文件,例如:/etc/systemd/system/my-custom-service.service

2. 编写服务配置

打开文件并添加以下内容:

[Unit]
Description=My Custom Service
After=network.target[Service]
Type=simple
User=myuser
ExecStart=/path/to/my/script.sh
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill $MAINPID
Restart=on-failure
RestartSec=5s[Install]
WantedBy=multi-user.target

3. 配置文件解析

  • [Unit]

    • Description:服务的简短描述。
    • After:指定该服务在 network.target 后启动,表示该服务依赖于网络服务。
  • [Service]

    • Type:定义服务类型,simple 表示服务启动后立即进入主进程。
    • User:指定服务运行的用户。
    • ExecStart:启动服务时执行的命令。
    • ExecReload:重新加载服务时执行的命令(此处示例为发送 HUP 信号)。
    • ExecStop:停止服务时执行的命令。
    • Restart:指定服务在失败时的重启策略,on-failure 表示服务失败时自动重启。
    • RestartSec:设置重启服务前的等待时间。
  • [Install]

    • WantedBy:指定该服务对应的目标(target),multi-user.target 表示在多用户模式下启动。

4. 加载并启动服务

  1. 重新加载 systemd 配置:
sudo systemctl daemon-reload
  1. 启动服务:
sudo systemctl start my-custom-service
  1. 设置开机自启:
sudo systemctl enable my-custom-service
  1. 检查服务状态:
sudo systemctl status my-custom-service

5. 注意事项

  • 路径和权限:确保 ExecStart 指定的脚本路径正确,并且脚本具有可执行权限。
  • 日志查看:使用 journalctl -u my-custom-service 查看服务日志,便于排查问题。
  • 调试:如果服务启动失败,可以查看 /var/log/journal 中的系统日志。

通过以上步骤,你可以创建并配置一个自定义的 systemd 服务。

相关文章:

Ubuntu 下 systemd 介绍

系列文章目录 Linux内核学习 Linux 知识&#xff08;1&#xff09; Linux 知识&#xff08;2&#xff09; WSL Ubuntu QEMU 虚拟机 Linux 调试视频 PCIe 与 USB 的补充知识 vscode 使用说明 树莓派 4B 指南 设备驱动畅想 Linux内核子系统 Linux 文件系统挂载 QEMU 通过网络实现…...

BERT文本分类(PyTorch和Transformers)畅用七个模型架构

&#xff08;PyTorch&#xff09;BERT文本分类&#xff1a;七种模型架构 &#x1f31f; 1. 介绍 使用BERT完成文本分类任务&#xff08;如情感分析&#xff0c;新闻文本分类等等&#xff09;对于NLPer已经是很基础的工作了&#xff01;虽说已迈入LLM时代&#xff0c;但是BERT…...

两步在 Vite 中配置 Tailwindcss

第一步&#xff1a;安装依赖 npm i -D tailwindcss tailwindcss/vite第二步&#xff1a;引入 tailwindcss 更改配置 // src/main.js import tailwindcss/index// vite.config.js import vue from vitejs/plugin-vue import tailwindcss from tailwindcss/viteexport default …...

【vmware虚拟机安装教程】

以下是在VMware Workstation Pro上安装虚拟机的详细教程&#xff1a; 准备工作 下载VMware Workstation Pro 访问VMware官网下载并安装VMware Workstation Pro&#xff08;支持Windows和Linux系统&#xff09;。安装完成后&#xff0c;确保已激活软件&#xff08;试用版或正式…...

文字转语音(三)FreeTTS实现

项目中有相关的功能&#xff0c;就简单研究了一下。 说明 FreeTTS 是一个基于 Java 的开源文本转语音&#xff08;TTS&#xff09;引擎&#xff0c;旨在将文字内容转换为自然语音输出。 FreeTTS 适合对 英文语音质量要求低、预算有限且需要离线运行 的场景&#xff0c;但若需…...

string类详解(上)

文章目录 目录1. STL简介1.1 什么是STL1.2 STL的版本1.3 STL的六大组件 2. 为什么学习string类3. 标准库中的string类3.1 string类3.2 string类的常用接口说明 目录 STL简介为什么学习string类标准库中的string类string类的模拟实现现代版写法的String类写时拷贝 1. STL简介 …...

Visual Studio Code使用ai大模型编成

1、在Visual Studio Code搜索安装roo code 2、去https://openrouter.ai/settings/keys官网申请个免费的配置使用...

外贸跨境订货系统流程设计、功能列表及源码输出

在全球化的商业环境下&#xff0c;外贸跨境订货系统对于企业拓展国际市场、提升运营效率至关重要。该系统旨在为外贸企业提供一个便捷、高效、安全的订货平台&#xff0c;实现商品展示、订单管理、物流跟踪等功能&#xff0c;满足跨境业务的多样化需求。以下将详细阐述外贸订货…...

TraeAi上手体验

一、Trae介绍 由于MarsCode 在国内由于规定限制&#xff0c;无法使用 Claude 3.5 Sonnet 模型&#xff0c;字节跳动选择在海外推出 Trae&#xff0c;官网&#xff1a;https://www.trae.ai/。 二、安装 1.下载安装Trae-Setup-x64.exe 2.注册登录 安装完成后&#xff0c;点击登…...

深入解析 vLLM:高性能 LLM 服务框架的架构之美(一)原理与解析

修改内容时间2.4.1处理请求的流程&#xff0c;引用更好的流程图2025.02.11首发2025.02.08 深入解析 vLLM&#xff1a;高性能 LLM 服务框架的架构之美&#xff08;一&#xff09;原理与解析 深入解析 vLLM&#xff1a;高性能 LLM 服务框架的架构之美&#xff08;二&#xff09;…...

thingboard告警信息格式美化

原始报警json内容&#xff1a; { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…...

redis解决高并发看门狗策略

当一个业务执行时间超过自己设定的锁释放时间&#xff0c;那么会导致有其他线程进入&#xff0c;从而抢到同一个票,所有需要使用看门狗策略&#xff0c;其实就是开一个守护线程&#xff0c;让守护线程去监控key&#xff0c;如果到时间了还未结束&#xff0c;就会将这个key重新s…...

Python函数的函数名250217

函数名其实就是一个变量&#xff0c;这个变量就是代指函数而已函数也可以被哈希&#xff0c;所以函数名也可以当作集合中的元素&#xff0c;也可作为字典的key值 # 将函数作为字典中的值&#xff0c;可以避免写大量的if...else语句 def fun1():return 123 def fun2():return 4…...

Unity 获取独立显卡数量

获取独立显卡数量 导入插件包打开Demo 运行看控制台日志 public class GetGraphicCountDemo : MonoBehaviour{public int count;// Start is called before the first frame updatevoid Start(){count this.GetIndependentGraphicsDeviceCount();}}...

JAVA生产环境(IDEA)排查死锁

使用 IntelliJ IDEA 排查死锁 IntelliJ IDEA 提供了强大的工具来帮助开发者排查死锁问题。以下是具体的排查步骤&#xff1a; 1. 编写并运行代码 首先&#xff0c;我们编写一个可能导致死锁的示例代码&#xff1a; public class DeadlockExample {private static final Obj…...

如何正确安装Stable Diffusion Web UI以及对应的xFormers

本文是我总结的步骤&#xff0c;验证了几次保证是对的。因为正确的安装 Stable Diffusion Web UI 以及对应的 xFormers 实在是太麻烦了&#xff0c;官方和网上的步骤都是残缺和分散的&#xff0c;加上国内网络速度不理想&#xff0c;所以需要一些额外步骤&#xff0c;之前研究出…...

机器学习_14 随机森林知识点总结

随机森林&#xff08;Random Forest&#xff09;是一种强大的集成学习算法&#xff0c;广泛应用于分类和回归任务。它通过构建多棵决策树并综合它们的预测结果&#xff0c;显著提高了模型的稳定性和准确性。今天&#xff0c;我们就来深入探讨随机森林的原理、实现和应用。 一、…...

机器学习基本篇

文章目录 1 基本概念2 基本流程2.0 数据获取2.1 预处理2.1.0 认识数据认识问题2.1.1 不平衡标签的处理a.随机过采样方法 ROS,random over-samplingb. SMOTE synthetic minority Over-Sampling Technique2.2 缺失值处理2.3 数据清洗2.3.0离散特征编码2.3.1 连续特征处理归一化标…...

vue2.x与vue3.x生命周期的比较

vue2.x 生命周期图示&#xff1a; new Vue() | v Init Events & Lifecycle | v beforeCreate | v created | v beforeMount | v mounted | v beforeUpdate (when data changes) | v updated | v beforeDestroy (when vm.…...

接口测试及常用接口测试工具(Postman/Jmeter)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 首先&#xff0c;什么是接口呢&#xff1f; 接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口&#xf…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

表单设计器拖拽对象时添加属性

背景&#xff1a;因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...