给定一个内核模块 my-module.ko,我已采取以下步骤来尝试在启动时自动加载该模块:
cp my-module.ko /lib/modules/$(uname -r)/my-module.ko
echo my-module >> /etc/modules-load.d/my-module.conf
# alt: echo my-module >> /etc/modules
echo my-module.ko: >> /lib/modules/$(uname -r)/modules.dep
# alt: depmod
systemctl restart systemd-modules-load
# alt: reboot the machine
无论我尝试什么变化,错误总是相同的:
● systemd-modules-load.service - Load Kernel Modules
Loaded: loaded (/lib/systemd/system/systemd-modules-load.service; static; vendor preset: enabled)
Active: failed (Result: exit-code) since <date>; 9s ago
Docs: man:systemd-modules-load.service(8)
man:modules-load.d(5)
Process: 318 ExecStart=/lib/systemd/systemd-modules-load (code=exited, status=1/FAILURE)
Main PID: 318 (code=exited, status=1/FAILURE)
Feb 14 03:19:58 localhost systemd[1]: Starting Load Kernel Modules...
Feb 14 03:19:58 localhost systemd-modules-load[318]: Failed to find module 'my-module'
Feb 14 03:19:58 localhost systemd[1]: systemd-modules-load.service: Main process exited, code=exited, status=1/FAILURE
Feb 14 03:19:58 localhost systemd[1]: systemd-modules-load.service: Failed with result 'exit-code'.
Feb 14 03:19:58 localhost systemd[1]: Failed to start Load Kernel Modules.
具体来说 ”找不到模块我可以运行modprobe my-module
,并且模块被发现并加载得很好。我忽略了 systemd 和 libkmod 的源代码,默认模块目录/lib/modules/$(uname -r)
如预期的那样。此外,名称还会与各种文件modules.dep
、modules.alias
等等进行比较,因此服务从技术上来说应该能够找到它。
我还可以尝试什么才能让它发挥作用?我更喜欢使用 systemd-modules-load 服务,而不是编写自己的服务来完成几乎相同的事情。
系统规格:ARMv7、Debian、Linux Kernel v4.9.37、Systemd v241-7~deb10u2;注意:depmod 是 busybox 的 simlink
答案1
经过对 libkmod 内部的仔细检查,我发现它modules.dep.bin
被用作参考源文件,而不是modules.dep
.
ls -al /sbin | grep depmod
产生了depmod -> /bin/busybox
改变一些事情:
rm /sbin/depmod
apt install kmod
ln -s /usr/bin/kmod /sbin/depmod
depmod
现在一切都很顺利!事实证明,busybox 版本的 depmod 没有正确更新文件module.dep.bin
- 这就是为什么 systemd ”找不到模块”。