深入理解 Linux systemd 单元类型及配置详解

时间:2025-01-18 12:33:00

深入理解 Linux systemd 单元类型及配置详解

在 Linux 系统中,systemd 是一种强大的初始化系统和服务管理工具,它通过**单元(Unit)**来管理服务、文件系统、设备等。systemd 支持多种单元类型,如服务单元(.service)、目标单元(.target)、挂载单元(.mount)、设备单元(.device)、计时单元(.timer)。本文将全面介绍这些单元的用途、常用配置项及实际应用场景。


1. 服务单元(*.service)

定义

服务单元用于管理系统服务,例如 nginx.servicemysql.service。主要负责定义服务的启动、停止、重启行为。

常用配置项

  • Type=
    指定服务类型:
  • simple(默认):ExecStart 启动的进程就是主进程。
  • forking:后台运行服务,ExecStart 会派生子进程。
  • oneshot:执行一次性任务后退出。
  • notify:服务通过 sd_notify 通知启动完成。
  • idle:延迟启动,直到所有任务完成。
  • ExecStart=
    指定启动服务的命令。
  • ExecStop=
    定义停止服务的命令。
  • Restart=
    定义服务的重启策略:
  • always:总是重启。
  • on-failure:仅在非正常退出时重启。
  • User=Group=
    定义服务运行的用户和组。

示例

服务单元文件:/etc/systemd/system/nginx.service

[Unit]
Description=High Performance Web Server
After=network.target
Requires=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/nginx
ExecStop=/usr/sbin/nginx -s quit
Restart=on-failure
RestartSec=5s
User=nginx
Group=nginx

[Install]
WantedBy=multi-user.target

使用方法

# 启动服务
systemctl start nginx.service
# 停止服务
systemctl stop nginx.service
# 查看状态
systemctl status nginx.service
# 设置开机启动
systemctl enable nginx.service

2. 目标单元(*.target)

定义

目标单元用于定义系统运行状态,类似于传统的运行级别(runlevel)。通过目标单元可以管理多个服务的依赖关系。

常用配置项

  • Requires=
    定义当前目标的强依赖单元,缺失会导致目标加载失败。
  • Wants=
    定义弱依赖,缺失不会影响目标的加载。
  • Before=After=
    指定目标的启动顺序。

示例

目标单元文件:/etc/systemd/system/multi-user.target

[Unit]
Description=Multi-User Mode
Documentation=man:systemd.special(7)
Requires=basic.target
Wants=network.target
After=basic.target network.target

使用方法

# 查看当前目标
systemctl get-default
# 设置默认目标
systemctl set-default multi-user.target
# 切换到特定目标
systemctl isolate multi-user.target

3. 挂载单元(*.mount)

定义

挂载单元用于管理文件系统的挂载点,替代传统的 /etc/fstab,提供更灵活的挂载方式。

常用配置项

  • What=
    要挂载的设备或网络路径。
  • Where=
    挂载点路径。
  • Type=
    文件系统类型,例如 ext4xfs
  • Options=
    挂载选项,例如 rw(读写)、ro(只读)。

示例

挂载单元文件:/etc/systemd/system/mnt-data.mount

[Unit]
Description=Data Mount
After=local-fs.target

[Mount]
What=/dev/sdb1
Where=/mnt/data
Type=ext4
Options=defaults

[Install]
WantedBy=multi-user.target

使用方法

# 挂载文件系统
systemctl start mnt-data.mount
# 卸载文件系统
systemctl stop mnt-data.mount
# 设置开机自动挂载
systemctl enable mnt-data.mount

4. 设备单元(*.device)

定义

设备单元用于管理硬件设备,是由 systemd 动态生成的,通常结合其他单元进行依赖管理。

常用配置项

设备单元本身不需要手动配置,但可以结合服务单元通过以下方式使用:

  • BindsTo=
    定义设备与其他单元的绑定关系。
  • After=
    确保服务在设备可用后启动。

示例

自动挂载 USB 设备并启动服务:

[Unit]
Description=Start Service on USB Mount
BindsTo=dev-sdb1.device
After=dev-sdb1.device

[Service]
ExecStart=/usr/local/bin/backup.sh

使用方法

# 查看设备单元
systemctl list-units --type=device
# 检查设备状态
systemctl status dev-sdb1.device

5. 计时单元(*.timer)

定义

计时单元用于替代传统的 cron 定时任务,支持更强大的依赖和触发条件。

常用配置项

  • OnCalendar=
    定义任务的触发时间,支持类 cron 格式。
  • OnBootSec=
    系统启动后经过的时间。
  • OnUnitActiveSec=
    上次任务运行后经过的时间。
  • Persistent=
    如果系统关机期间未执行任务,重启后是否补偿。

示例

计时单元文件:/etc/systemd/system/backup.timer

[Unit]
Description=Daily Backup Timer

[Timer]
OnCalendar=23:00
Persistent=true

[Install]
WantedBy=timers.target

对应的服务单元:/etc/systemd/system/backup.service

[Unit]
Description=Backup Service

[Service]
ExecStart=/usr/bin/rsync -a /data /backup

使用方法

# 启用计时器
systemctl enable backup.timer
# 启动计时器
systemctl start backup.timer
# 查看所有计时器
systemctl list-timers

总结

  • 服务单元(.service):管理应用服务,适合启动和监控系统服务。
  • 目标单元(.target):组合多个单元,定义系统运行级别。
  • 挂载单元(.mount):灵活挂载文件系统。
  • 设备单元(.device):管理硬件设备与服务的依赖。
  • 计时单元(.timer):定时任务管理,替代 cron。

通过学习这些单元及其配置项,你可以更高效地管理 Linux 系统。如果遇到任何问题,欢迎留言交流!