deepwzh的技术笔记
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • 操作系统
  • Linux 源码阅读笔记
  • 内存管理
  • 文件系统
  • Windows

    • Windows
    • 端口转发
    • WSL

      • WSL
      • 与 windows 的互通
      • 安装
      • wsl 常见问题
      • 在 wsl 下进行开发
      • 配置
  • Linux

    • Linux
    • 动态追踪技术
    • DNS 配置
    • 问题排查
    • 杂项
    • Linux 免密登录
    • ebpf
    • 性能调优
    • init 进程
    • Ipvs
    • 基准测试
    • Linux
    • Keepalived
    • Linux 与 Unix
    • 系统调用
    • 命令行补全
    • 文件系统

      • 文件系统
      • Mount
    • systemd

      • systemd
      • Systemd
    • 命令工具

      • 命令工具
      • 时区配置
      • 进程管理工具
      • 路由表维护
      • 文件系统工具
      • 网络工具

        • 网络工具
        • curl
        • 端口转发 rinetd
    • 包管理

      • 包管理
      • APT 与 DEB
    • Shell

      • Shell
      • Zsh
      • Bash

        • Bash
        • 配置文件

systemd

概述

systemd 是 Linux 系统的一组基本构建模块。它提供了一个系统和服务管理器,以 PID 1 运行并启动系统的其余部分。systemd 提供强大的并行化能力,使用套接字和 D-Bus 激活来启动服务,提供按需启动守护进程,使用 Linux 控制组跟踪进程,维护挂载点和自动挂载点,并实现复杂的基于事务依赖的服务控制逻辑。systemd 支持 SysV 和 LSB 初始化脚本,并可替代 sysvinit。其他部分包括一个日志守护进程、用于控制基本系统配置(如主机名、日期、区域设置)的实用程序、维护登录用户列表以及正在运行的容器和虚拟机、系统账户、运行时目录和设置,以及用于管理简单网络配置、网络时间同步、日志转发和名称解析的守护进程。

他是一个大而全的系统,包含了很多功能,可以如下图所示:

主要的一些功能有:

  • 服务管理:systemd 可以启动、停止、重启、查看服务的状态,还可以设置服务的依赖关系。
  • 日志管理:systemd 通过 journalctl 命令可以查看系统日志,支持按服务、时间、优先级等条件过滤。
  • 定时任务:systemd 可以替代 cron,通过 systemd-timer 实现定时任务的管理。
  • 系统初始化:systemd 负责系统的初始化,包括加载内核模块、挂载文件系统、启动用户空间进程等。
  • 用户会话:systemd 可以管理用户会话,包括用户登录、注销、会话控制等。
  • 内核管理:包括 cgroups、kdbus、autofs 等
  • 网络管理:systemd-networkd 可以管理网络配置,systemd-resolved 可以管理 DNS 解析。
  • 设备管理:systemd 可以管理设备,包括磁盘、网络、USB 等设备。
  • cgroup 管理:systemd 可以管理 cgroup,实现资源限制和控制。

基本概念

单元(Unit)

systemd 中的所有配置都是以单元(Unit)的形式存在,单元是 systemd 的基本配置单位,用于描述系统中的各种资源。常见的单元类型包括:

  • 服务单元(Service Unit):用于描述一个服务,如 Nginx、MySQL 等。
  • 定时器单元(Timer Unit):用于描述一个定时任务。
  • 设备单元(Device Unit):用于描述一个设备。
  • 挂载单元(Mount Unit):用于描述一个文件系统挂载点。
  • 路径单元(Path Unit):用于描述一个文件或目录的监控。
  • 网络单元(Network Unit):用于描述一个网络配置。
  • ...

单元的配置文件通常存放在 /etc/systemd/system/ 目录下,以 .service、.timer、.device 等后缀结尾。

服务单元(Service Unit)

服务单元(Service Unit)用于描述一个服务,包括服务的启动、停止、重启、状态等操作。服务单元的配置文件通常以 .service 为后缀,如 nginx.service、mysql.service 等。

服务单元的配置文件通常包含以下几个部分:

  • [Unit]:描述单元的基本信息,如单元的描述、依赖关系等。
  • [Service]:描述服务的具体配置,如服务的启动命令、环境变量、工作目录等。
  • [Install]:描述单元的安装信息,如单元的启动级别、依赖关系等。

一个简单的服务单元配置文件示例如下:

[Unit]
Description=My Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/my-service
Restart=always

[Install]
WantedBy=multi-user.target

日志管理

systemd 使用 systemd-journald 守护进程来管理系统日志。systemd-journald 守护进程会将日志信息保存在 /run/log/journal 目录下,日志信息以二进制格式存储。我们可以使用 journalctl 命令来查看系统日志,如:

# 查看所有日志
journalctl
# 查看指定服务的日志
journalctl -u nginx
# 查看指定时间范围的日志
journalctl --since "2025-03-15 00:00:00" --until "2025-03-15 23:59:59"
# 查看指定优先级的日志
journalctl -p err

定时任务

systemd 可以通过定时器单元(Timer Unit)实现定时任务的管理。定时器单元的配置文件通常以 .timer 为后缀,如 my-task.timer。

一个简单的定时器单元配置文件示例如下:

[Unit]
Description=Run My Task

[Timer]
OnCalendar=*-*-* 00:00:00
Persistent=true

[Install]
WantedBy=timers.target

服务管理

systemd 可以管理系统的服务,包括启动、停止、重启、查看状态等。我们可以使用 systemctl 命令管理系统的服务,如:

# 启动服务
systemctl start my-service
# 停止服务
systemctl stop my-service
# 重启服务
systemctl restart my-service
# 查看服务状态
systemctl status my-service
# 设置服务开机自启动
systemctl enable my-service
# 取消服务开机自启动
systemctl disable my-service

系统初始化

systemd 负责系统的初始化,包括加载内核模块、挂载文件系统、启动用户空间进程等。systemd 会在启动时读取 /etc/systemd/system/default.target 文件,根据该文件指定的目标(Target)启动系统。

常见的系统目标包括:

  • multi-user.target:多用户目标,用于启动多用户模式。
  • graphical.target:图形目标,用于启动图形界面。
  • rescue.target:救援目标,用于修复系统。
  • emergency.target:紧急目标,用于进入紧急模式。

我们可以使用 systemctl set-default 命令设置系统的默认目标,如:

# 设置系统默认目标为 multi-user.target
systemctl set-default multi-user.target

用户会话

systemd 可以管理用户会话,包括用户登录、注销、会话控制等。用户会话的配置文件通常存放在 ~/.config/systemd/user/ 目录下。

我们可以使用 systemctl --user 命令管理用户会话,如:

# 启动用户会话中的服务
systemctl --user start my-service
# 停止用户会话中的服务
systemctl --user stop my-service
# 查看用户会话中的服务状态
systemctl --user status my-service

内核管理

systemd 包括对 cgroups、kdbus、autofs 等内核功能的管理。cgroups 是 Linux 内核提供的一种资源管理机制,用于限制和控制进程组的资源使用。systemd 可以通过 cgroups 实现对进程的资源限制和控制。

网络管理

systemd-networkd 可以管理网络配置,包括网络接口、IP 地址、路由、DNS 等。我们可以使用 systemctl start systemd-networkd 命令启动 systemd-networkd 服务,使用 systemctl enable systemd-networkd 命令设置 systemd-networkd 服务开机自启动。

systemd-resolved 可以管理 DNS 解析,包括 DNS 缓存、DNS 服务器、DNS 查询等。我们可以使用 systemctl start systemd-resolved 命令启动 systemd-resolved 服务,使用 systemctl enable systemd-resolved 命令设置 systemd-resolved 服务开机自启动。

设备管理

systemd 可以管理设备,包括磁盘、网络、USB 等设备。我们可以使用 systemctl start systemd-udevd 命令启动 systemd-udevd 服务,使用 systemctl enable systemd-udevd 命令设置 systemd-udevd 服务开机自启动。

cgroup 管理

systemd 可以管理 cgroup,实现资源限制和控制。cgroup 是 Linux 内核提供的一种资源管理机制,用于限制和控制进程组的资源使用。我们可以使用 systemctl set-property 命令设置 cgroup 的资源限制,如:

# 设置进程的 CPU 限制
systemctl set-property my-service CPUQuota=50%
# 设置进程的内存限制
systemctl set-property my-service MemoryLimit=1G

常用命令

systemctl

systemctl 命令用于管理 systemd 服务。常用的选项包括:

  • start:启动服务。
  • stop:停止服务。
  • restart:重启服务。
  • status:查看服务状态。
  • enable:设置服务开机自启动。
  • disable:取消服务开机自启动。
  • daemon-reload:重新加载 systemd 配置。

journalctl

journalctl 命令用于查看系统日志。常用的选项包括:

  • -u:按服务过滤日志。
  • --since:按时间范围过滤日志。
  • -p:按优先级过滤日志。
  • -k:查看内核日志。
  • -b:查看引导日志。
  • -f:实时查看日志。

总结

systemd 是 Linux 系统的一组基本构建模块,提供了强大的系统和服务管理功能。通过 systemd,我们可以管理系统的服务、日志、定时任务、系统初始化、用户会话、内核、网络、设备、cgroup 等。熟练掌握 systemd 的使用,有助于提高系统管理的效率和可靠性。

子文档

  • Systemd
Next
Systemd