跳到主要内容

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

通过一番Google,我大致知道了这个和deepin-anything有关。

Linux模块加载

Linux系统加载哪些内核模块,和配置文件有关系。模块保存在/lib/modules/下。/etc/modprobe.d/下配置模块加载时的一些参数,也可以利用blacklist来屏蔽模块的自动加载。例如,在安装NVIDIA显卡驱动时,需要屏蔽开源的nouveau驱动,就可以将其加入blacklist

可以配置启动时加载哪些内核模块,一般位于/etc/modules-load.d/。比如,对于virtual box虚拟机:

$ cat /etc/modules-load.d/virtualbox.conf
vboxdrv
vboxnetflt
vboxnetadp
vboxpci

除此之外,还有/usr/lib/modprobe.d/目录,这个一般是应用程序配置需要加载的模块。例如,vfs_monitor就是deepin-anything配置的需要加载的模块:

$ cat /usr/lib/modules-load.d/anything.conf
vfs_monitor

不过,这个只能在Deepin桌面下使用,而我用的Xfce4桌面。所以,可以将其禁用

$ cat /usr/lib/modules-load.d/anything.conf
# vfs_monitor

之后再重启systemd-modules-load.service,再查看状态,终于正常了:

$ systemctl status systemd-modules-load.service
● systemd-modules-load.service - Load Kernel Modules
Loaded: loaded (/usr/lib/systemd/system/systemd-modules-load.service; static; vendor preset: disabled)
Active: active (exited) since CST; 1h 15min ago
Docs: man:systemd-modules-load.service(8)
man:modules-load.d(5)
Process: 20926 ExecStart=/usr/lib/systemd/systemd-modules-load (code=exited, status=0/SUCCESS)
Main PID: 20926 (code=exited, status=0/SUCCESS)

最后,ArchWiki真不错~

参考文献