systemctl snapshot 不能捕获服务运行时状态或实现精准恢复,仅记录已加载 unit 的激活状态和依赖关系,且无 restore 功能;真正可行的是备份配置、记录启用与运行状态、并用脚本重放启动逻辑。

systemctl snapshot 并不能用于“捕获当前所有运行中服务的活跃状态”并实现升级失败后的“精准恢复”。
这是个常见误解——systemctl snapshot 不保存服务状态,也不支持回滚服务配置或运行时状态。
它实际功能是:创建一个 systemd manager 的运行时快照(runtime snapshot),仅记录当前已加载的 unit(服务、target、socket 等)的 激活状态(active/inactive/failed) 和 依赖关系结构,但不保存进程 PID、内存数据、网络连接、配置文件内容、环境变量或服务内部状态。且该快照无法被 restore 或 rollback —— systemd 没有 systemctl restore 命令,snapshot 仅用于调试、分析或临时存档(如 systemctl list-units --all --state=active 的静态快照),不具备恢复能力。
所以,系统升级前想“精准恢复服务状态”,靠 snapshot 是无效的。真正可行的做法是组合使用以下机制:
✅ 1. 记录服务启用与运行状态(可复现的基础)
升级前执行并保存结果:
# ① 记录哪些服务设置了开机自启(决定重启后该不该起) systemctl list-unit-files --type=service --state=enabled > /tmp/services-enabled-$(date +%s).txt # ② 记录当前实际运行中的服务(非全部 enabled,而是 real active) systemctl list-units --type=service --state=running --no-pager > /tmp/services-running-$(date +%s).txt # ③ 记录失败服务(便于升级后比对异常) systemctl --failed --no-pager > /tmp/services-failed-$(date +%s).txt
这些文本可作为恢复依据:升级失败重启后,用 systemctl start 手动拉起原 running 列表里的服务,用 systemctl enable/disable 对齐原启用状态。
✅ 2. 保存关键服务的配置与环境(避免配置漂移)
-
/etc/systemd/system/*.service和/usr/lib/systemd/system/*.service中被修改过的单元文件(建议用rsync -a /etc/systemd/system/ /backup/etc-systemd-$(date +%s)/) - 关键服务的配置目录(如
/etc/nginx/,/etc/mysql/)需单独备份 - 使用
systemctl show --property=Environment,ExecStart,User,Restart <service>提取运行时关键属性,存为参考
✅ 3. 避免依赖 snapshot 的“伪恢复”
不要这样做 ❌:
systemctl snapshot pre-upgrade # 生成 snapshot-000.target(仅是个 target unit) # 升级失败后试图: systemctl isolate snapshot-000.target # ❌ 失败!这不是恢复命令,只是切换到一个空 target
snapshots 是只读标记,isolate 它只会停掉所有非依赖服务,不会重启任何原服务,也不会还原进程或配置,极易导致系统不可用。
✅ 4. 真实可靠的恢复路径(推荐流程)
- 升级前:备份
/etc+ 记录enabled/running状态 + 校验关键服务日志末尾(journalctl -u xxx --since "1 hour ago" | tail -20) - 升级中:使用
--no-restart或分批重启服务(如dnf upgrade --assumeno先预检) - 升级失败重启后:
- 比对
/tmp/services-running-*.txt,对每个服务执行systemctl start xxx - 比对
/tmp/services-enabled-*.txt,执行systemctl enable xxx(未启用的跳过) - 若某服务启动失败,用
journalctl -u xxx -p 3..7 --no-pager查 error 级日志
- 比对
真正能“精准恢复”的,从来不是某个 magic 命令,而是状态清单 + 配置备份 + 可重放的操作逻辑。
systemd 设计上就不支持运行时状态回滚——它假设服务是幂等、可重复启动的。把恢复逻辑写成脚本,比依赖 snapshot 实际得多。


















