Systemd服务详解

Systemd-logo

systemd是Linux操作系统中的一个系统和服务管理器, 于2010年由Lennart Poettering和Kay Sievers首次发布, 旨在替代传统的System V init系统。它的出现是为了应对init系统在现代计算环境中的一些不足, 提供更高效、更灵活的服务管理

0x00 前世今生

在systemd之前, Linux使用System V init(SysV init)作为初始化系统, 每个服务都有一个对应的启动脚本, 放置在不同的运行级别目录下, 通过符号链接管理

SysV init的缺点

  • 采用串行启动方式, 启动速度慢
  • 每个服务脚本需要手动编写和管理, 维护繁琐
  • init系统缺乏对服务状态的有效管理, 难以检测和恢复失败的服务

systemd的设计目标是提供更快的系统启动速度、更好的并行服务启动能力和更强的服务管理功能

systemd关键特性

  • 并行启动:systemd能够并行启动服务, 显著提高系统启动速度
  • 依赖关系管理:通过unit文件, systemd可以明确配置服务之间的依赖关系, 确保以正确的顺序启动和关闭服务
  • 状态和监控:提供了更好的服务状态监控和管理工具, 可以自动重启失败的服务
  • 统一接口:整合了设备管理、挂载点管理等功能, 通过统一的接口(systemctl)管理系统和服务
  • 日志功能:systemd-journald提供了集中化的日志收集和管理功能

systemd的争议与痛点

  • 复杂性:由于systemd的功能广泛, 代码库庞大, 学习和掌握systemd需要一定的时间和精力
  • 一体化设计:systemd的设计较为一体化, 一些用户认为这违背了Unix的做一件事, 做好它的哲学
  • 兼容性问题:从传统的init系统迁移到systemd可能导致一些兼容性问题, 特别是在定制化的脚本和服务配置方面

systemd工具集

1
2
3
4
5
6
7
8
9
10
11
12
# 核心管理工具
systemctl # 系统和服务管理器的主要命令行工具
journalctl # 日志管理
loginctl # 用户会话管理
networkctl # 网络管理
timedatectl # 系统时间和日期管理
hostnamectl # 系统主机名管理
localectl # 系统本地化设置管理
machinectl # 虚拟机和容器管理
coredumpctl # 核心转储管理
portablectl # 便携服务管理
resolvectl # DNS解析管理

可以看到这些命令都以ctl结尾, 表示它们是用于control系统特定方面的工具

命令的参数也有着统一的命令风格

1
2
3
命令 status    # 查看状态
命令 set-xxx # 设置某个值
命令 list # 列出信息

这些工具都是通过systemd的D-Bus接口与系统交互, 流程上是

1
工具命令 -> D-Bus接口 -> systemd服务 -> 系统配置

systemctl命令

启动、停止、重启服务,查看服务状态,管理开机启动服务等

1
2
3
4
5
6
7
systemctl start <service>          # 启动服务
systemctl stop <service> # 停止服务
systemctl restart <service> # 重启服务
systemctl status <service> # 查看服务状态
systemctl enable <service> # 设置服务开机自启
systemctl disable <service> # 禁用服务开机自启
systemctl list-units --type=service # 列出所有服务

hostnamectl命令

管理系统主机名和相关设置的工具

1
2
3
4
hostnamectl status                 # 查看当前主机名
hostnamectl set-hostname <name> # 设置主机名
hostnamectl set-hostname <name> --static # 设置静态主机名
hostnamectl set-hostname <name> --pretty # 设置友好的主机名

timedatectl命令

查看和设置系统时间、日期、时区、NTP 同步状态等

1
2
3
4
5
timedatectl status                 # 查看当前时间、时区、NTP 状态
timedatectl set-time "YYYY-MM-DD HH:MM:SS" # 设置系统时间
timedatectl set-timezone <timezone> # 设置时区
timedatectl set-ntp true # 启用 NTP 时间同步
timedatectl set-ntp false # 禁用 NTP 时间同步

localectl命令

查看和设置系统的语言环境和键盘布局

1
2
3
4
localectl status                   # 查看当前语言和键盘布局
localectl list-locales # 列出所有可用区域设置
localectl set-locale LANG=<locale> # 设置语言环境(如:en_US.UTF-8)
localectl set-keymap <keymap> # 设置键盘布局

PS. 对于需要安装的语言环境, 可以通过locale-gen或类似工具生成

Debian/Ubuntu

1
2
echo "zh_CN.UTF-8 UTF-8" >> /etc/locale.gen
locale-gen && locale -a

RHEL/CentOS/Fedora

1
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8

生成语言环境后再通过localectl set-locale LANG=zh_CN.UTF-8应用配置

loginctl命令

查看或管理用户登录会话和用户权限

1
2
3
4
loginctl list-sessions             # 列出所有会话
loginctl show-session <id> # 查看指定会话详细信息
loginctl terminate-session <id> # 终止指定会话
loginctl list-users # 列出所有登录用户

journalctl命令

用于查询和管理systemd日志

1
2
3
4
5
6
journalctl                               # 查看所有日志
journalctl -u <service> # 查看特定服务的日志
journalctl -f # 实时跟踪日志
journalctl -p <priority> # 查看特定优先级的日志 (e.g., err, warning, info)
journalctl -b # 查看自本次启动以来的日志
journalctl --since "YYYY-MM-DD HH:MM:SS" # 查看指定时间以来的日志