systemd 服务管理
章节标题
systemd是现代Linux系统的默认服务管理系统,它提供了丰富的功能和更好的性能,取代了传统的SysVinit。本章节将详细介绍systemd的核心概念、架构、单元文件结构、管理命令和高级功能,帮助读者掌握systemd的使用方法和配置技巧。
核心知识点讲解
1. systemd的基本概念
systemd的定义
systemd是一个系统和服务管理器,它负责在Linux系统启动时初始化系统,管理系统服务的启动、停止、重启和监控等操作。
systemd的特点
- 并行启动:服务可以并行启动,提高系统启动速度
- 基于单元:使用单元(Unit)来管理不同类型的资源
- 自动依赖管理:自动处理服务之间的依赖关系
- 集成日志管理:通过journald组件提供统一的日志管理
- 控制组集成:与cgroups集成,提供资源限制功能
- 快照功能:支持系统状态的快照和恢复
- 开机启动优化:通过分析启动过程,优化启动顺序
2. systemd的架构
核心组件
- systemd:主守护进程,负责系统初始化和服务管理
- journald:日志管理组件,收集和管理系统日志
- logind:用户登录管理组件,管理用户会话
- networkd:网络配置组件,管理网络接口和连接
- resolved:DNS解析组件,提供DNS解析服务
- timedated:时间管理组件,管理系统时间
- hostnamectl:主机名管理组件,管理系统主机名
- localed:区域设置管理组件,管理系统区域设置
启动流程
- BIOS/UEFI初始化:硬件自检,加载引导加载程序
- 引导加载程序:加载Linux内核和initramfs
- 内核初始化:挂载根文件系统,启动systemd
- systemd初始化:
- 加载默认目标(default.target)
- 启动基本服务(如udev、syslog等)
- 启动网络服务
- 启动用户服务
- 系统就绪:进入用户登录界面
3. systemd单元文件
单元类型
systemd使用不同类型的单元来管理系统资源:
- service:服务单元,管理后台服务
- socket:套接字单元,管理网络套接字
- device:设备单元,管理硬件设备
- mount:挂载单元,管理文件系统挂载
- automount:自动挂载单元,管理自动挂载
- target:目标单元,类似SysVinit的运行级别
- timer:定时器单元,管理定时任务
- path:路径单元,监控文件系统路径
- slice:切片单元,管理资源分配
- scope:作用域单元,管理外部创建的进程
单元文件结构
单元文件通常位于以下目录:
/etc/systemd/system/:系统管理员创建的单元文件/usr/lib/systemd/system/:发行版提供的单元文件/run/systemd/system/:运行时生成的单元文件
单元文件语法
单元文件采用INI格式,包含多个节(Section):
[Unit]
Description=描述信息
Documentation=文档地址
After=依赖的服务或目标
Before=被依赖的服务或目标
Requires=强依赖关系
Wants=弱依赖关系
Conflicts=冲突的服务
Condition=条件表达式
[Service]
Type=服务类型(simple、forking、oneshot、dbus、notify、idle)
ExecStart=启动命令
ExecStartPre=启动前执行的命令
ExecStartPost=启动后执行的命令
ExecReload=重新加载配置的命令
ExecStop=停止命令
ExecStopPost=停止后执行的命令
Restart=重启策略
RestartSec=重启间隔时间
TimeoutSec=超时时间
User=运行用户
Group=运行组
WorkingDirectory=工作目录
Environment=环境变量
[Install]
WantedBy=目标单元
RequiredBy=目标单元
Also=同时安装的其他单元
Alias=服务别名4. systemd管理命令
基本管理命令
- systemctl:主要的systemd管理命令
- systemd-analyze:分析系统启动时间
- journalctl:查看系统日志
- hostnamectl:管理主机名
- timedatectl:管理系统时间
- localectl:管理区域设置
- loginctl:管理用户登录会话
systemctl命令
systemctl是systemd的主要管理命令,用于管理服务和其他单元:
- 启动服务:
systemctl start 服务名 - 停止服务:
systemctl stop 服务名 - 重启服务:
systemctl restart 服务名 - 重新加载配置:
systemctl reload 服务名 - 查看服务状态:
systemctl status 服务名 - 启用服务:
systemctl enable 服务名 - 禁用服务:
systemctl disable 服务名 - 查看服务是否启用:
systemctl is-enabled 服务名 - 查看服务是否运行:
systemctl is-active 服务名 - 查看所有服务:
systemctl list-units --type=service - 查看运行中的服务:
systemctl list-units --type=service --state=running - 查看失败的服务:
systemctl list-units --type=service --state=failed
5. systemd的高级功能
目标管理
目标(Target)是一组相关单元的集合,类似SysVinit的运行级别:
- poweroff.target:关机
- rescue.target:救援模式
- multi-user.target:多用户文本模式
- graphical.target:图形界面模式
- reboot.target:重启
服务依赖管理
systemd会自动分析服务之间的依赖关系,确保服务按正确的顺序启动:
- Requires:强依赖,依赖的服务失败时,当前服务也会失败
- Wants:弱依赖,依赖的服务失败时,当前服务继续运行
- After:指定启动顺序,确保在指定服务之后启动
- Before:指定启动顺序,确保在指定服务之前启动
系统启动优化
systemd提供了多种工具来分析和优化系统启动过程:
- systemd-analyze:分析系统启动时间
- systemd-analyze blame:查看启动过程中各服务的耗时
- systemd-analyze critical-chain:查看启动过程的关键路径
- systemd-analyze plot:生成启动过程的可视化图表
日志管理
journald是systemd的日志管理组件,提供了统一的日志管理功能:
- journalctl:查看系统日志
- 日志存储:默认存储在
/run/log/journal/目录 - 日志持久化:可以配置为持久化存储
- 日志过滤:支持按时间、服务、优先级等过滤日志
实用案例分析
案例1:管理系统服务
场景描述
需要管理系统中的SSH服务,包括启动、停止、重启、查看状态和配置开机自启。
解决方案
使用systemctl命令管理SSH服务:
# 查看SSH服务状态
systemctl status sshd
# 启动SSH服务
systemctl start sshd
# 停止SSH服务
systemctl stop sshd
# 重启SSH服务
systemctl restart sshd
# 重新加载SSH配置
systemctl reload sshd
# 启用SSH服务开机自启
systemctl enable sshd
# 禁用SSH服务开机自启
systemctl disable sshd
# 查看SSH服务是否启用
systemctl is-enabled sshd
# 查看SSH服务是否运行
systemctl is-active sshd案例2:创建自定义服务
场景描述
需要创建一个自定义服务,用于管理一个后台应用程序,确保它在系统启动时自动启动,并在意外停止时自动重启。
解决方案
创建一个自定义的systemd服务单元文件:
# 创建服务单元文件
sudo vi /etc/systemd/system/myapp.service
# 添加以下内容
[Unit]
Description=My Custom Application
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapp
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=always
RestartSec=5
User=myuser
Group=mygroup
WorkingDirectory=/opt/myapp
Environment="PATH=/usr/local/bin:/usr/bin:/bin"
Environment="CONFIG_FILE=/opt/myapp/config.json"
[Install]
WantedBy=multi-user.target
# 重新加载systemd配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start myapp
# 启用服务开机自启
sudo systemctl enable myapp
# 查看服务状态
sudo systemctl status myapp案例3:优化系统启动速度
场景描述
系统启动速度较慢,需要分析启动过程,找出耗时较长的服务,并进行优化。
解决方案
使用systemd-analyze工具分析和优化系统启动过程:
# 分析系统启动时间
systemd-analyze
# 查看启动过程中各服务的耗时
systemd-analyze blame
# 查看启动过程的关键路径
systemd-analyze critical-chain
# 生成启动过程的可视化图表
systemd-analyze plot > boot.svg
# 优化措施:
# 1. 禁用不需要的服务
# 2. 调整服务的启动顺序
# 3. 优化服务的配置
# 4. 考虑使用socket激活方式
# 禁用不需要的服务
sudo systemctl disable bluetooth
# 查看服务的依赖关系
systemctl list-dependencies sshd代码示例
示例1:systemd服务管理命令
# 查看所有服务
systemctl list-units --type=service
# 查看运行中的服务
systemctl list-units --type=service --state=running
# 查看失败的服务
systemctl list-units --type=service --state=failed
# 查看系统目标
systemctl list-units --type=target
# 查看默认目标
systemctl get-default
# 设置默认目标
systemctl set-default multi-user.target
# 切换到救援模式
systemctl isolate rescue.target
# 重启系统
systemctl reboot
# 关机
systemctl poweroff
# 挂起系统
systemctl suspend
# 休眠系统
systemctl hibernate示例2:服务单元文件
简单服务示例
[Unit]
Description=Simple Example Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/example.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target守护进程服务示例
[Unit]
Description=Daemon Example Service
After=network.target
[Service]
Type=forking
PIDFile=/var/run/example.pid
ExecStart=/usr/local/bin/example-daemon start
ExecStop=/usr/local/bin/example-daemon stop
ExecReload=/usr/local/bin/example-daemon reload
Restart=always
[Install]
WantedBy=multi-user.targetSocket激活服务示例
# 服务单元文件
[Unit]
Description=Socket Activated Service
[Service]
Type=simple
ExecStart=/usr/local/bin/socket-service
[Install]
WantedBy=multi-user.target
# 套接字单元文件
[Unit]
Description=Socket for Socket Activated Service
[Socket]
ListenStream=8080
Accept=true
[Install]
WantedBy=sockets.target示例3:系统启动优化
# 分析系统启动时间
systemd-analyze
# 查看启动过程中各服务的耗时
systemd-analyze blame | head -10
# 查看启动过程的关键路径
systemd-analyze critical-chain
# 生成启动过程的可视化图表
systemd-analyze plot > boot.svg
# 禁用不需要的服务
sudo systemctl disable cups
sudo systemctl disable avahi-daemon
sudo systemctl disable NetworkManager-wait-online
# 查看服务的依赖关系
systemctl list-dependencies --reverse sshd
# 启用并行启动
sudo vi /etc/systemd/system.conf
# 修改以下行
# DefaultTimeoutStartSec=90s
# DefaultTimeoutStopSec=90s
# DefaultRestartSec=100ms实践练习
练习1:使用systemctl管理服务
- 查看系统中所有的服务
- 查看运行中的服务
- 查看失败的服务
- 管理SSH服务(启动、停止、重启、查看状态)
- 配置SSH服务开机自启
- 禁用不需要的服务
练习2:创建自定义服务
- 编写一个简单的后台脚本
- 创建一个systemd服务单元文件
- 配置服务的启动、停止和重启行为
- 启动服务并查看状态
- 配置服务开机自启
- 测试服务的自动重启功能
练习3:优化系统启动速度
- 分析系统启动时间
- 查看启动过程中耗时较长的服务
- 查看启动过程的关键路径
- 禁用不需要的服务
- 调整服务的启动顺序
- 重新启动系统,验证启动速度是否有所改善
总结
本章节详细介绍了Linux系统中systemd服务管理系统的核心概念、架构、单元文件结构、管理命令和高级功能,包括:
systemd的基本概念:了解systemd是一个系统和服务管理器,提供了丰富的功能和更好的性能
systemd的架构:了解systemd的核心组件和启动流程
systemd单元文件:了解单元文件的类型、结构和语法
systemd管理命令:掌握systemctl命令的使用方法,用于管理服务和其他单元
systemd的高级功能:了解目标管理、服务依赖管理、系统启动优化和日志管理等高级功能
通过本章节的学习,读者可以掌握systemd的使用方法和配置技巧,提高系统管理效率,优化系统启动速度,确保系统服务的稳定运行。systemd作为现代Linux系统的默认服务管理系统,掌握它的使用方法对于Linux系统管理员来说是非常重要的。