使用systemctl诊断和修复systemd故障单元

本文详细介绍了如何使用systemctl命令诊断和修复systemd中失败的单元,包括分析服务失败原因、查看详细状态信息、手动清除失败单元等实用技巧,帮助系统管理员快速解决服务启动问题。

使用systemctl诊断和修复systemd故障单元

解决systemd单元失败问题

Systemd是传统init系统的替代服务管理器。为确保系统健康运行,应定期检查失败的单元。迟早会有单元失败并出现在systemctl列表中。本文介绍如何解决这些问题。

服务失败的原因

在系统启动期间,已启用的服务会被启动并排队执行。大多数进程会正确启动,systemd会在日志中记录相关状态。但在某些情况下,由于另一个命令未正确完成,服务可能进入"失败状态"。

1
2
3
4
5
6
7
# systemctl
UNIT                                     LOAD   ACTIVE SUB       DESCRIPTION
-.mount                                  loaded active mounted   /
boot.mount                               loaded active mounted   /boot
dev-hugepages.mount                      loaded active mounted   Huge Pages File System
● dev-mqueue.mount                       loaded failed failed    POSIX Message Queue File System
run-user-0.mount                         loaded active mounted   /run/user/0

服务失败通常是由于缺少依赖项(例如文件或挂载点)、缺少配置或权限不正确。在此示例中,我们看到类型为mount的dev-mqueue单元失败。由于类型是挂载,原因很可能是挂载特定分区失败。

查看详细状态信息

使用systemctl status命令可以查看dev-mqueue.mount单元的详细信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# systemctl status dev-mqueue.mount
● dev-mqueue.mount - POSIX Message Queue File System
   Loaded: loaded (/usr/lib/systemd/system/dev-mqueue.mount; static)
   Active: failed (Result: exit-code) since Sun 2014-11-23 17:53:10 CET; 4min 12s ago
    Where: /dev/mqueue
     What: mqueue
     Docs: man:mq_overview(7)
           http://www.freedesktop.org/wiki/Software/systemd/APIFileSystems
  Process: 446 ExecMount=/bin/mount -n mqueue /dev/mqueue -t mqueue (code=exited, status=32)

Nov 23 17:53:10 localhost.localdomain systemd[1]: dev-mqueue.mount mount process exited, code=exited status=32
Nov 23 17:53:10 localhost.localdomain systemd[1]: Failed to mount POSIX Message Queue File System.
Nov 23 17:53:10 localhost.localdomain systemd[1]: Unit dev-mqueue.mount entered failed state.

此信息显示了执行的相关命令。我们看到单元在退出代码上失败,因为它不是期望的值0(实际上是32)。手动运行该命令显示设备/dev/mqueue缺失。

类似地,IPMI在我们的虚拟机上失败。由于没有/dev/ipmi*设备,服务无法启动并失败:

1
2
3
4
5
6
# systemctl status ipmievd.service
? ipmievd.service - Ipmievd Daemon
Loaded: loaded (/usr/lib/systemd/system/ipmievd.service; enabled)
Active: failed (Result: exit-code) since Sun 2014-11-23 16:08:48 CET; 1h 36min ago
Process: 550 ExecStart=/usr/sbin/ipmievd $IPMIEVD_OPTIONS (code=exited, status=1/FAILURE)
Nov 23 16:08:47 localhost.localdomain ipmievd[550]: Could not open device at /dev/ipmi0 or /dev/ipmi/0 or /dev/ipmidev/0: No such file or directory

清除失败单元

可以使用systemctl reset-failed命令手动清除失败的单元。这可以针对所有单元或单个单元执行。

对于不再需要的服务,最好停止并禁用它们:

1
2
systemctl stop rngd.service
systemctl disable rngd.service

了解更多systemctl知识

本文使用systemctl命令完成任务。对于这个流行工具,有一个速查表可用!

» 掌握工具:systemctl

保护systemd和系统服务

使用Lynis改进系统服务和进程的安全性,执行系统审计,包括systemd单元和服务的配置测试。

Lynis是一个经过实战考验的基于Unix系统的技术安全审计工具。它是开源的,免费可用,被全世界的系统管理员使用。其他用户包括安全专业人员、渗透测试人员和IT审计员。

工具信息

  • 成本:免费
  • 许可证:GPLv3
  • 链接:GitHub项目、软件包(deb/rpm)、压缩包
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计