深入理解 Linux systemd 单元类型及配置详解
在 Linux 系统中,systemd 是一种强大的初始化系统和服务管理工具,它通过**单元(Unit)**来管理服务、文件系统、设备等。systemd 支持多种单元类型,如服务单元(.service
)、目标单元(.target
)、挂载单元(.mount
)、设备单元(.device
)、计时单元(.timer
)。本文将全面介绍这些单元的用途、常用配置项及实际应用场景。
1. 服务单元(*.service)
定义
服务单元用于管理系统服务,例如 nginx.service
或 mysql.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=
文件系统类型,例如ext4
、xfs
。 -
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 系统。如果遇到任何问题,欢迎留言交流!