背景:买了块网件的A6210无线网卡,用的是mt7612u芯片,插到deepin下不能识别,ubuntu 18.04下同样不能识别,查过内核版本号,用的都是4.15的内核,去Github查了Linux内核仓库,确认4.15内核里没有mt7612u的驱动,Github上有几个其他的驱动试了试居然会编译出错,后来我查到OpenWRT的mt76驱动是支持mt7612u的,而且这个驱动在4.19的时候就被合并到Linux主分支了。查了内核代码后确实在mediatek的文件夹下找到了mt76的源代码,那么现在,等4.19内核的推送?算了,等到4.19怕是几个月以后了吧,看看Ubuntu内核版本报告http://kernel.ubuntu.com/~kernel-ppa/reports/versions.html就知道进度了,所以最后我决定直接安装4.19的内核,而不是自己编译驱动安装,好处嘛,就是快(免编译)、干净(直接装)、靠谱(内核自带驱动)。
进入正题,安装新内核的操作步骤:
下载最新内核,进入Ubuntu主线内核仓库http://kernel.ubuntu.com/~kernel-ppa/mainline/,注意虽然这是Ubuntu的内核仓库但是是可以直接安装到deepin的(都是用deb封装的包,而且,我都试过了),这里面有好多内核版本,自己挑一个喜欢的点进去,我点的是v4.19.6,点进去以后会有说明,我们用的64位deepin版本自然是需要“Build for amd64”下面的这几个了,下载
linux-modules-xxx-generic_xxx_amd64.deb(内核驱动包)、
linux-image-unsigned-xxx-generic_xxx_amd64.deb(内核镜像包)、
linux-headers-xxx_all.deb(内核头文件包1)、
linux-headers-xxx-generic_xxx_amd64.deb(内核头文件包2)、
这四个deb文件,然后直接按顺序用“深度软件包管理器”安装就行,安装新内核不用担心老内核会被删除,只是会增加一个启动菜单选项,若新内核启动失败那么在启动菜单的第二项进去选择老内核启动就行了,无安全隐患,如果想卸载自己安装的内核就直接卸载上面几个对应的deb包名就行了。下载最新固件,本来第一步就已经成功安装好内核了,一般情况下重启后系统就已经用的是新安装的内核了,可如果有朋友像我这样需要最新驱动的话,就要看看是不是要手动安装固件了,因为原来的固件包是跟老内核对应的,有些新驱动需要的固件就没有安装到系统,进入Linux固件仓库https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/tree,这个目录下的文件就对应着系统盘/lib/firmware/文件夹下的文件,那怎样知道自己缺少哪些固件呢?可以在终端里执行sudo update-initramfs -u命令,如果缺少固件命令会输出“W: Possible missing firmware /lib/firmware/xxx/xxx.bin for module XXX”,一般把要用的驱动XXX的固件.bin补齐就行了,其他用不到的驱动固件可以不要,当然强迫症的可以全部补齐,补齐方法就是到Linux固件仓库找到对应的.bin文件下载后放到系统盘对应的文件夹里,最后别忘了再执行一次sudo update-initramfs -u命令更新系统。注意喽,自己下载的固件在未来可能会跟系统新的固件包冲突,若是存在同名文件的话新固件包的安装会报错,这个时候就需要把之前下载的固件手动删除了。
关于安装新内核后可能出现的启动延时问题:
这个问题是一个不兼容的驱动造成的,通过sudo systemctl --failed命令的输出可以了解到系统的systemd-modules-load服务启动失败,不兼容的驱动是mincores,这个驱动是深度引进的warm-sched延时加载功能的依赖驱动,因为4.19内核API头文件的更改造成编译不通过,进而导致systemd-modules-load服务找不到要加载的内核模块,不断重试造成启动延时。
mincores驱动的源文件路径是/usr/src/mincores-0.2.0/mincores.c,我暂时还没深入研究,有兴趣的朋友可以研究研究该如何修改。
附上编译出错信息:
make: 进入目录“/usr/src/linux-headers-4.19.7-041907-generic”
CC [M] /var/lib/dkms/mincores/0.2.0/build/mincores.o
In file included from ./include/linux/idr.h:15:0,
from ./include/linux/kernfs.h:14,
from ./include/linux/sysfs.h:16,
from ./include/linux/kobject.h:20,
from ./include/linux/module.h:17,
from /var/lib/dkms/mincores/0.2.0/build/mincores.c:1:
/var/lib/dkms/mincores/0.2.0/build/mincores.c: 在函数‘dump_mapping’中:
/var/lib/dkms/mincores/0.2.0/build/mincores.c:122:43: 错误:‘struct address_space’没有名为‘page_tree’的成员
radix_tree_for_each_contig(slot, &addr->page_tree, &iter, next_start) {
^
./include/linux/radix-tree.h:598:45: 附注:in definition of macro ‘radix_tree_for_each_contig’
slot || (slot = radix_tree_next_chunk(root, iter, \
^~~~
make[1]: *** [scripts/Makefile.build:310:/var/lib/dkms/mincores/0.2.0/build/mincores.o] 错误 1
make: *** [Makefile:1517:_module_/var/lib/dkms/mincores/0.2.0/build] 错误 2
make: 离开目录“/usr/src/linux-headers-4.19.7-041907-generic”
最后分享一个可以查无线网卡芯片的网站https://wikidevi.com/wiki/Main_Page,想在Linux下使用无线网卡的小伙伴可以看看。