Systemd服务详解
Systemd服务详解
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 | # 核心管理工具 |
可以看到这些命令都以ctl
结尾, 表示它们是用于control系统特定方面的工具
命令的参数也有着统一的命令风格
1 | 命令 status # 查看状态 |
这些工具都是通过systemd的D-Bus接口与系统交互, 流程上是
1 | 工具命令 -> D-Bus接口 -> systemd服务 -> 系统配置 |
systemctl命令
启动、停止、重启服务,查看服务状态,管理开机启动服务等
1 | systemctl start <service> # 启动服务 |
hostnamectl命令
管理系统主机名和相关设置的工具
1 | hostnamectl status # 查看当前主机名 |
timedatectl命令
查看和设置系统时间、日期、时区、NTP 同步状态等
1 | timedatectl status # 查看当前时间、时区、NTP 状态 |
localectl命令
查看和设置系统的语言环境和键盘布局
1 | localectl status # 查看当前语言和键盘布局 |
PS. 对于需要安装的语言环境, 可以通过locale-gen或类似工具生成
Debian/Ubuntu
1 | echo "zh_CN.UTF-8 UTF-8" >> /etc/locale.gen |
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 | loginctl list-sessions # 列出所有会话 |
journalctl命令
用于查询和管理systemd日志
1 | journalctl # 查看所有日志 |