我正在使用Ubuntu的,但问题是一般的Linux。
我通过编译我的linux内核来安装一个模块/驱动程序,并安装新的编译内核。 它工作正常。
为了使这个驱动程序在另一台机器上工作而不需要安装新内核,我将.ko
文件复制到/lib/modules/<version>/...
下的新机器上,然后运行sudo depmod -a
。 然后运行sudo modprobe <drivername>
。 该模块可以加载没有问题。 但是该设备在这个.ko
模块中运行不正常。
这两台机器不同于硬件,但它们与内核版本和ubuntu发行版本相同。 通常情况下,复制.ko
文件应该适用于相同的Linux版本和相同的内核。
有关驱动程序的更多信息。 这是一个隐藏的笔平板电脑驱动程序。 所有补丁文件:
drivers/hid/
drivers/hid/Makefile
添加一行 drivers/hid/usbhid/Kconfig
添加几行 drivers/hid/hid-ids.h
drivers/hid/usbhid/hid-quirks.c
的hid_blacklist结构中 就这样。
我甚至试图复制整个drivers/hid/
目录包括从第一台机器的所有.ko
文件到第二个。 但没有运气。 可以在第二台机器中识别笔写板,我可以用笔做鼠标左键单击事件,但笔不能移动光标。
希望我提供了足够的细节。 我的目标是只将模块安装到相同的linux发行版(内核),无需重新安装内核。 我不知道如何实现,或者如果可能的话。
非常感谢。
PS:
在第一台机器上,在插入平板电脑前,lsmod不显示模块。 插入后,模块可以自动加载。 我可以看到lsmod显示模块。
在第二台机器中,插入设备不能自动加载模块。 我必须手动执行sudo modprobe <module>
。
由于我将不得不将模块安装到我公司的许多机器上,所以安装模块更容易,无需重新安装内核。 我试图安装在第一台机器内置的第二台机器的内核.deb包,它在第二台机器上工作正常。 但是我觉得很难将内核重新安装到很多机器上。 谢谢。
看来你建的内核不是1:1的比赛。 另外,通常不需要编译新的内核。
处理树外驱动程序部署的最简单方法是使用DKMS 。
你需要提供的只是一个dkms.conf
文件,它指定了软件包名称,版本,驱动程序名称和目标(在/lib/modules/{kernel}
)。
在下面的例子中,大括号内的东西需要用真实的东西来替换,例如,如果版本是1.0.0,那么明显的是{version}
和1.0.0
。
示例dkms.conf
:
PACKAGE_NAME="{mydriver}" PACKAGE_VERSION="{version}" BUILT_MODULE_NAME[0]="{mydriver}" BUILT_MODULE_LOCATION[0]="/{mycompany?}" AUTOINSTALL="yes"
然后你只需要把源代码安装到/usr/src/{mydriver}-{version}
,然后运行dkms
:
dkms add -m {mydriver} -v {version} dkms build -m {mydriver} -v {version} dkms install -m {mydriver} -v {version}
您应该看看其他人在这方面做了什么,可以应用于测试和发布流程的自动化程度非常高。 Bluecherry的solo6x10
out-of-tree版本提供了一些有用的make
目标(披露:我是谁写的那个)。
另外,您一定要构建和分发软件包,您可以使用solo6x10/debian
作为模板,并且可以在Debian wiki中阅读有关软件仓库 。
您可以将模块添加到/ etc / modules,以便在启动时加载。