systemd介绍

概述

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

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

主要的一些功能有:

  • 服务管理: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.servicemysql.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

系统初始化

alt text

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 的使用,有助于提高系统管理的效率和可靠性。

作者

deepwzh

发布于

2025-03-14

更新于

2025-03-17

许可协议

评论