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:区域设置管理组件,管理系统区域设置

启动流程

  1. BIOS/UEFI初始化:硬件自检,加载引导加载程序
  2. 引导加载程序:加载Linux内核和initramfs
  3. 内核初始化:挂载根文件系统,启动systemd
  4. systemd初始化
    • 加载默认目标(default.target)
    • 启动基本服务(如udev、syslog等)
    • 启动网络服务
    • 启动用户服务
  5. 系统就绪:进入用户登录界面

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.target

Socket激活服务示例

# 服务单元文件
[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管理服务

  1. 查看系统中所有的服务
  2. 查看运行中的服务
  3. 查看失败的服务
  4. 管理SSH服务(启动、停止、重启、查看状态)
  5. 配置SSH服务开机自启
  6. 禁用不需要的服务

练习2:创建自定义服务

  1. 编写一个简单的后台脚本
  2. 创建一个systemd服务单元文件
  3. 配置服务的启动、停止和重启行为
  4. 启动服务并查看状态
  5. 配置服务开机自启
  6. 测试服务的自动重启功能

练习3:优化系统启动速度

  1. 分析系统启动时间
  2. 查看启动过程中耗时较长的服务
  3. 查看启动过程的关键路径
  4. 禁用不需要的服务
  5. 调整服务的启动顺序
  6. 重新启动系统,验证启动速度是否有所改善

总结

本章节详细介绍了Linux系统中systemd服务管理系统的核心概念、架构、单元文件结构、管理命令和高级功能,包括:

  1. systemd的基本概念:了解systemd是一个系统和服务管理器,提供了丰富的功能和更好的性能

  2. systemd的架构:了解systemd的核心组件和启动流程

  3. systemd单元文件:了解单元文件的类型、结构和语法

  4. systemd管理命令:掌握systemctl命令的使用方法,用于管理服务和其他单元

  5. systemd的高级功能:了解目标管理、服务依赖管理、系统启动优化和日志管理等高级功能

通过本章节的学习,读者可以掌握systemd的使用方法和配置技巧,提高系统管理效率,优化系统启动速度,确保系统服务的稳定运行。systemd作为现代Linux系统的默认服务管理系统,掌握它的使用方法对于Linux系统管理员来说是非常重要的。

« 上一篇 服务管理概述 下一篇 » SysVinit 服务管理