我有一个第三方库,它提供了一个内核模块(module.ko
),并且需要在启动时自动加载。但是,module.ko
它不依赖于特定版本的 Linux 内核,并且可以跨多个版本工作。注意我没有module.ko
;的来源它是预编译的。
我正在为此第 3 方库创建 RPM 包,因此创建 SPEC 文件。
我的第一个方法是使用lib/modprobe.d
,lib/modules-load.d
并在启动时lib/modules/$(uname -r)
自动加载module.ko
。这很好用;然而,我不想每次升级 Linux 内核时都必须重新安装我的软件包。这是因为,在 SPEC 文件中,module.ko
被复制到lib/modules/$(uname -r)
,其中$(uname -r)
是当前内核版本。
第二种方法是创建一个在启动时加载内核的服务,使用insmod
.这modprobe
完全避免了,因为modprobe
需要将内核复制到lib/modules/$(uname -r)
.
我的问题是第二种方法是否是实现这一目标的唯一方法,或者是否有更好的方法?
答案1
insmod
您可以提供/lib/modprobe.d/mymodule.conf
线路,而不是提供服务
install mymodule insmod /path/to/mymodule.ko
我尝试了这个,它在 fedora 22 上运行正常,以现有模块为例slip
。
$ cd /lib/modules/4.2.8-200.fc22.x86_64/extra/drivers/net/slip/
$ lsmod|grep slip
$ sudo modprobe slip
$ lsmod|grep slip
slip 20480 0
slhc 20480 1 slip
$ sudo rmmod slip
$ lsmod|grep slip
$ sudo mv slip.ko.xz ~
$ sudo modprobe slip
modprobe: ERROR: could not insert 'slip': Unknown symbol in module, or unknown parameter
$ sudo sh -c 'echo install slip insmod /home/meuh/slip.ko.xz >/lib/modprobe.d/mymodule.conf'
$ sudo modprobe slip
$ lsmod|grep slip
slip 20480 0
slhc 20480 1 slip