DKMS全称是Dynamic Kernel Module SupportLinux模块和内核是有依赖关系的,如果遇到因为发行版更新造成的内核版本的变动,之前编译的模块是无法继续使用的,我们只能手动再编译一遍。DKMS可以帮我们维护内核外的这些驱动程序,在内核版本变动之后可以自动重新生成新的模块。
安装dkms
sudo apt-get install dkms
dkms的使用流程如下:
uninstall --------------------------- - - V - --------------- --------------- --------------- ------------------- - - add - - build - - install - - - Not in tree - ------> - Added State - ------> - Built State - ------> - Installed State - - - - - - - - - --------------- --------------- --------------- ------------------- ^ - - - - - - - -------------------------------------------------------------------------- remove
add、build、install、uninstall和remove
例如:
$ dkms status virtualbox, 4.3.10, 3.13.0-49-generic, x86_64: installed
dkms要求代码的目录必须以 <module>-<module-version> 的格式命名, 例如: hello-0.1
rtlwifi代码的github地址为: http://github.com/lwfinger/rtlwifi_new.git
将下载的代码拷贝到/usr/src
例如:
$ ls /usr/src/ linux-headers-3.13.0-49 rtlwifi-1.0 linux-headers-3.13.0-49-generic virtualbox-4.3.10
还需要在rtlwifi-1.0中新建一个文件dkms.conf
PACKAGE_NAME="rtlwifi" PACKAGE_VERSION="1.0" CLEAN="make clean" BUILT_MODULE_NAME[0]="rtlwifi" BUILT_MODULE_LOCATION[0]="." DEST_MODULE_LOCATION[0]="kernel/drivers/net/wireless/rtlwifi" BUILT_MODULE_NAME[1]="rtl_pci" BUILT_MODULE_LOCATION[1]="." DEST_MODULE_LOCATION[1]="kernel/drivers/net/wireless/rtlwifi" BUILT_MODULE_NAME[2]="rtl_usb" BUILT_MODULE_LOCATION[2]="." DEST_MODULE_LOCATION[2]="kernel/drivers/net/wireless/rtlwifi" BUILT_MODULE_NAME[3]="btcoexist" BUILT_MODULE_LOCATION[3]="btcoexist" DEST_MODULE_LOCATION[3]="kernel/drivers/net/wireless/rtlwifi/btcoexist" BUILT_MODULE_NAME[4]="rtl8723be" BUILT_MODULE_LOCATION[4]="rtl8723be" DEST_MODULE_LOCATION[4]="kernel/drivers/net/wireless/rtlwifi/rtl8723be" AUTOINSTALL="yes"
PACKAGE_NAME和PACKAGE_VERSION和文件夹的命名是一致的。
D
ESTMODULELOCATION[0]用来设定模块安装的目的地址,本例是“/lib/module/$(KVERSION)/updates” DESTMODULELOCATION[#] 在下面这些发行版中被忽略:
Instead , the proper distribution-specific directory is used.
AUTOINSTALL=“yes”表示在Linux引导之后DKMS会自动对这个模块执行Build和Install的动作,当然如果模块已经处于该状态的话,相应的动作是不用再执行的。
sudo dkms add -m rtlwifi -v 1.0
其中-m指定module的名字, -v 指定module version 所以rtlwifi的源文件路径为: /usr/src/rtlwifi-1.0
$ sudo dkms add -m rtlwifi -v 1.0 Creating symlink /var/lib/dkms/rtlwifi/1.0/source -> /usr/src/rtlwifi-1.0 DKMS: add completed.
查看dkms的状态:
$ dkms status rtlwifi, 1.0: added virtualbox, 4.3.10, 3.13.0-49-generic, x86_64: installed
可以看到rtlwifi的状态为added
sudo dkms build -m rtlwifi -v 1.0 Kernel preparation unnecessary for this kernel. Skipping... Building module: cleaning build area.... make KERNELRELEASE=3.13.0-49-generic -C /lib/modules/3.13.0-49-generic/build M=/var/lib/dkms/rtlwifi/1.0/build.................... cleaning build area.... DKMS: build completed.
查看dkms状态:
$ dkms status rtlwifi, 1.0, 3.13.0-49-generic, x86_64: built virtualbox, 4.3.10, 3.13.0-49-generic, x86_64: installed
rtlwifi的状态为built
生成的ko模块位于:
/var/lib/dkms/rtlwifi/1.0/3.13.0-49-generic/x86_64/module
$ sudo dkms install --force -m rtlwifi -v 1.0 rtlwifi: Running module version sanity check. - Original module - Installation - Installing to /lib/modules/3.13.0-49-generic/updates/dkms/ rtl_pci.ko: Running module version sanity check. - Original module - Installation - Installing to /lib/modules/3.13.0-49-generic/updates/dkms/ rtl_usb.ko: Running module version sanity check. - Original module - Installation - Installing to /lib/modules/3.13.0-49-generic/updates/dkms/ btcoexist.ko: Running module version sanity check. - Original module - Installation - Installing to /lib/modules/3.13.0-49-generic/updates/dkms/ btcoexist.ko: Running module version sanity check. - Original module - Multiple same named modules! - 2 named btcoexist.ko in /lib/modules/3.13.0-49-generic/ - Installation - Installing to /lib/modules/3.13.0-49-generic/updates/dkms/ rtl8723be.ko: Running module version sanity check. - Original module - Installation - Installing to /lib/modules/3.13.0-49-generic/updates/dkms/ depmod.... DKMS: install completed.
查看dkms 状态:
$ dkms status rtlwifi, 1.0, 3.13.0-49-generic, x86_64: installed virtualbox, 4.3.10, 3.13.0-49-generic, x86_64: installed
从/lib/modules下移除:
sudo dkms uninstall -m rtlwifi -v 1.0
从/var/lib/dkms下彻底删除
sudo dkms remove -m rtlwifi -v 1.0 –all