systemd-modules-load.service启动失败问题排查
· 阅读需 5 分钟
我的电脑在启动时总会提示“Failed to start Load Kernel Modules":
虽然不影响使用,可强迫症看了还是会觉得难受。所以,还是着手解决下,顺便总结下Linux下service启动失败时一般的排查方法。
这个问题是systemd-modules-load.service
启动失败,因为 Failed to find module 'vfs_monitor',下面给出排查过程和解决方案。
日志分析
首先,查看哪些服务启动失败:
$ systemctl --failed
UNIT LOAD ACTIVE SUB DESCRIPTION
● systemd-modules-load.service loaded failed failed Load Kernel Modules
或者可以打印出错的日志:
$ journalctl -fp err
可以发现systemd-modules-load
出了问题,可以查看它的状态:
$ systemctl status systemd-modules-load.service
● systemd-modules-load.service - Load Kernel Modules
Loaded: loaded (/usr/lib/systemd/system/systemd-modules-load.service; static)
Active: failed (Result: exit-code) since ; 6min ago
Docs: man:systemd-modules-load.service(8)
man:modules-load.d(5)
Process: 684 ExecStart=/usr/lib/systemd/systemd-modules-load (code=exited, status=no-zero)
Main PID: 684 (code=exited, status=1/FAILURE)
HP systemd[1]: Starting Load Kernel Modules...
去掉了日期时间,下同。
如果没有列出Process ID,可以重启下服务,就可以看到Process ID了。比如说,本例中Process ID就是684。
有了Process ID,就可以深入研究这个错误了。我们可以通过下面这个命令来从日志中筛选出与这个Process ID相关的日志(_PID的值替换为相应的Process ID):
$ journalctl _PID=684
-- Reboot --
HP systemd-modules-load[684]: Failed to find module 'vfs_monitor'
Process ID是进程号。当然,操作系统可能给别的进程分配这个进程号,进程号前面就是这个进程的名字了。由于我们关心systemd-modules-load
,所以注意与之相关的日志。
除了使用Process ID进行筛选,还可以直接使用服务名进行筛选:
$ journalctl _SYSTEMD_UNIT=systemd-modules-load.service
HP systemd-modules-load[382]: Failed to find module 'vfs_monitor'
-- Reboot --
HP systemd-modules-load[456]: Failed to find module 'vfs_monitor'
-- Reboot --
HP systemd-modules-load[472]: Failed to find module 'vfs_monitor'
注意这里写的是服务名,所以要带上.service
,对应查看状态里的Loaded那一项。
可以发现是由于找不到vfs_monitor
这个模块导致的。如果不知道这些日志筛选方法,也可以直接用-xe
选项来查看,然后肉眼筛选:
$ journalctl -xe