本文首发在我的个人博客:https://jlice.top/p/7ve9p/。欢迎大家前去参观,么么哒~
我的电脑在启动时总会提示“Failed to start Load Kernel Modules":
虽然不影响使用,可强迫症看了还是会觉得难受。所以,还是着手解决下,顺便总结下Linux下service启动失败时一般的排查方法。
首先,查看哪些服务启动失败:
$ 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=20373
-- 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系统加载哪些内核模块,和配置文件有关系。模块保存在/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真不错~