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

什么是Linux中的systemd?

写在前面

为什么要回过头来复习linux的system的,最近在研究DELL EMC的PowerStore存储系统,其底层是基于CoreOS开发的,这套操作系统是基于Systemd来设计的。所以要深入了解PowerStore就必须对systemd做详细了解。

systemd 是一个用于 Linux 系统的初始化系统(init system)和服务管理器,旨在取代传统的 System V init 系统。它不仅负责启动操作系统,还管理服务、日志、设备、挂载点等系统资源。systemd 由 Lennart Poettering 和 Kay Sievers 等人开发,自 2010 年左右开始被广泛采用,现已成为许多主流 Linux 发行版(如 RHEL、Ubuntu、Debian、Fedora、Arch Linux 等)的默认初始化系统。

以下是对 systemd 的详细解释,包括其概念、功能、组件以及在 Linux 生态中的作用。

1. systemd 的核心概念

定义

  • 初始化系统:systemd 是 Linux 内核启动后运行的第一个用户空间进程(PID 1),负责初始化系统、启动服务并管理整个系统的运行。
  • 服务管理器:它管理系统服务的启动、停止、重启、状态检查等操作。
  • 系统管理工具:systemd 提供了一套工具,用于管理日志、设备、定时任务、网络配置等。

设计目标

  • 并行化:加速系统启动,通过并行启动服务减少启动时间。
  • 统一管理:为各种系统资源(如服务、设备、挂载点)提供一致的管理接口。
  • 依赖管理:自动处理服务之间的依赖关系。
  • 现代化支持现代 Linux 特性,如 cgroups、namespace、容器化等。在PowerStore中大量使用docker。
  • 日志集成:通过 systemd-journald 提供结构化的日志管理。所有PowerStore的日志管理都是通过journald来管理的,这个和以前的存储管理方式是不同的。

核心理念

  • 单元(Units):systemd 将所有管理的资源抽象为“单元”,如服务(.service)、挂载点(.mount)、定时器(.timer)等。
  • 声明式配置:通过配置文件(通常在 /etc/systemd/ 或 /lib/systemd/)定义单元的行为,而不是传统的 shell 脚本。
  • 事件驱动:systemd 监控系统事件(如设备插入、服务启动),动态响应。

2. systemd 的主要功能

  1. 系统初始化
    • 启动内核后,systemd 作为 PID 1 接管系统,加载必要的服务、文件系统、网络等。
    • 支持并行启动服务,优化启动速度。
    • 示例:启动后加载 sshd.service、network.target 等。
  2. 服务管理
    • 管理服务的生命周期(启动、停止、重启、启用、禁用)。
    • 使用 systemctl 命令控制服务。
    • 示例:
      systemctl start docker
      systemctl enable sshd
      systemctl status network
  3. 依赖管理
    • 自动解析服务之间的依赖关系(如 docker.service 依赖 network-online.target)。
    • 通过 Wants、Requires、After 等关键字定义依赖。
  4. 日志管理
    • 通过 systemd-journald 收集和存储系统日志,存储在 /var/log/journal/(持久化)或 /run/log/journal/(内存)。
    • 使用 journalctl 查询日志。
    • 示例:
      journalctl --unit docker
      journalctl -p err
  5. 设备管理
    • 管理硬件设备(如 USB、磁盘)的挂载和卸载。
    • 使用 .device 和 .mount 单元。
    • 示例:
      systemctl status dev-sda1.device
  6. 定时任务
    • 使用 .timer 单元替代传统的 cron,提供更灵活的定时任务管理。
    • 示例:
      systemctl list-timers
  7. 资源控制
    • 利用 cgroups 限制服务的 CPU、内存、IO 等资源。
    • 示例:
      systemctl set-property docker.service MemoryLimit=2G
  8. 网络管理
    • 通过 systemd-networkd 和 systemd-resolved 管理网络配置和 DNS 解析。
    • 示例:
      networkctl status
  9. 容器和虚拟化支持
    • 通过 systemd-nspawn 提供轻量级容器管理。
    • 支持与 Docker、Podman 等容器技术集成。

3. systemd 的核心组件

systemd 不仅仅是一个单一的程序,而是一套工具和守护进程的集合。主要组件包括:

  1. systemd(主进程):
    • 作为 PID 1 运行,负责初始化和管理单元。
    • 解析 /etc/systemd/system/ 和 /lib/systemd/system/ 中的单元文件。
  2. systemctl
    • 用户命令行工具,用于管理服务、单元和系统状态。
    • 示例:
      systemctl restart sshd
      systemctl list-units
  3. journald
    • 日志管理守护进程,收集系统和服务的日志。
    • 存储结构化日志,支持通过 journalctl 查询。
    • 示例:
      journalctl -f
  4. logind
    • 管理用户登录会话,处理多用户、多座位环境。
    • 示例:
      loginctl list-sessions
  5. networkd
    • 管理网络接口和配置。
    • 示例:
      networkctl list
  6. resolved
    • 提供 DNS 解析服务。
    • 示例:
      resolvectl status
  7. timedated
    • 管理系统时间和时区。
    • 示例:
      timedatectl set-timezone Asia/Shanghai
  8. udevd
    • 管理设备事件(如插入 USB 设备)。
    • 示例:
      udevadm monitor

4. systemd 的单元类型

systemd 管理的所有资源都被抽象为“单元”(Units),每种单元有特定的文件后缀。常见单元类型包括:

单元类型

后缀

用途

Service

.service

管理服务(如 sshd、docker)

Target

.target

定义一组单元的集合(如 multi-user.target)

Mount

.mount

管理文件系统挂载点

Device

.device

管理硬件设备

Socket

.socket

管理套接字(如网络连接)

Timer

.timer

管理定时任务

Path

.path

基于文件系统路径的触发器

Slice

.slice

资源控制分组(基于 cgroups)

5. systemd 在 Linux 生态中的地位

普及程度

  • 主流发行版:RHEL(7+)、CentOS(7+)、Ubuntu(16.04+)、Debian(8+)、Fedora、Arch Linux 等默认使用 systemd。
  • 非 systemd 发行版:一些发行版(如 Alpine Linux、Devuan、Void Linux)选择不使用 systemd,而是使用其他初始化系统(如 OpenRC、runit)。

优势

  • 性能:并行启动和依赖管理显著提高启动速度。
  • 一致性:为服务、设备、日志等提供统一的接口。
  • 现代化:支持 cgroups、容器、复杂依赖关系。
  • 生态整合:与 journald、networkd 等组件无缝集成。

争议

  • 复杂性:systemd 功能庞大,被批评为“过于复杂”,违背 Unix 哲学(单一职责)。
  • 兼容性:替换传统工具(如 cron、inetd),可能导致脚本不兼容。
  • 依赖性:许多软件开始依赖 systemd,限制了非 systemd 系统的选择。

与传统 init 系统的对比

特性

systemd

System V Init

启动方式

并行启动

串行启动

依赖管理

自动解析

手动配置(脚本顺序)

日志管理

集成 journald

依赖 syslog(rsyslog 等)

配置方式

声明式(单元文件)

脚本式(/etc/init.d/)

功能范围

广泛(服务、设备、日志等)

仅限服务启动

复杂性

http://www.xdnf.cn/news/3785.html

相关文章:

  • leetcode 59. 螺旋矩阵 II
  • 小土堆pytorch--tensorboard的使用
  • 【c++深入系列】:万字详解vector(附模拟实现的vector源码)
  • Spring MVC的工作流程, DispatcherServlet 的工作流程
  • 25.1linux中外置RTC芯片的PCF8563实验(知识)_csdn
  • 嵌入式GPIO 实验(流水灯程序,八段数码管显示程序)
  • Kubernetes 安装 kubectl
  • Qt实现 hello world + 内存泄漏(5)
  • C++学习:六个月从基础到就业——C++11/14:lambda表达式
  • MATLAB实现二氧化硅和硅光纤的单模光波特性与仿真
  • 打印Excel表格时单元格文字内容被下一行遮盖的解决方法
  • CPU 的指令集存放在什么地方?
  • 深度解析ZFNet:微调优化与可视化创新
  • 【现代深度学习技术】现代循环神经网络06:编码器-解码器架构
  • WPF中Behaviors
  • JSON Web Token 默认密钥 身份验证安全性分析 dubbo-admin JWT硬编码身份验证绕过
  • Python速成系列二
  • 多段线和二维多段线的区别及顶点遍历
  • Linux54 源码包的安装、修改环境变量解决 axel命令找不到;getfacl;测试
  • OpenHarmony平台驱动开发(一),ADC
  • 大模型实践:图文解锁Ollama在个人笔记本上部署llm
  • 一格一格“翻地毯”找单词——用深度优先搜索搞定单词搜索
  • [硬件电路-12]:LD激光器与DFB激光器功能概述、管脚定义、功能比较
  • 基于STM32的温湿度光照强度仿真设计(Proteus仿真+程序设计+设计报告+讲解视频)
  • 使用Scrapy构建高效网络爬虫:从入门到数据导出全流程
  • 互联网与无线广播:数字时代与模拟时代的通讯双轨制-优雅草卓伊凡
  • 【iOS】 分类 拓展 关联对象
  • Dify框架面试内容整理-Dify部署后常见问题有哪些?如何排查?
  • 【SQL触发器、事务、锁的概念和应用】
  • 基于SpringBoot + HTML 的宠物医院预约管理