由于最近要做一些libvips的性能优化,必须要在一台物理机器且带NVIDIA GPU的机器上运行。Windows上用libvips很痛苦,于是就给自己家的二手捡垃圾PC装上了 Ubuntu 24.04
安装好之后,自然是没有无线网卡驱动的,我的无线网卡是捡垃圾的UGREEN AX900 CM763,还好从官网搜到了驱动 https://www.lulian.cn/download/154.html
本来以为,编译驱动什么的就是个10分钟的小事情,make && make install && modeprobe xxxx
但是这次没想到,一晚上都没了……🫠
编译驱动
根据官方的pdf说明
bash install_setup.sh cd drivers/aic8800 make make install modprobe cfg80211 modprobe aic_load_fw modprobe aic8800_fdrv
理论上就应该能看到无线设备了!
但是……2025年,我猜你很可能遇到……
could not insert 'aic_load_fw': Key was rejected by service
说明你启用了安全启动,要么禁用安全启动(小心你的Windows可能启动不了),要么自己创建一份key 然后 enroll
给驱动增加签名
由于开启了安全启动,内核默认会拒绝加载没有签名的ko文件,所以我们要自己创建key,导入,然后去签名ko
创建MOK
sudo apt install mokutil openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=WiFi/" mokutil --import MOK.der
之后会让你输入个密码,然后reboot
重启系统,会看到这样类似蓝色的界面
Enroll后,继续启动进入系统,输入 mokutil --list-enrolled
看是否能够看到创建的issuer信息,如果能够看到,那就可以了
编译模块并签名
总之无论如何,肯定已经编译出来了两个ko文件,并且key已经enroll了
那么就要签名,让内核能够加载这个模块,要注意两个内核模块都要签名哦,路径自己改改
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 \ ~/Desktop/MOK.priv \ ~/Desktop/MOK.der \ aic8800_fdrv/aic8800_fdrv.ko sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 \ ~/Desktop/MOK.priv \ ~/Desktop/MOK.der \ aic_load_fw/aic_load_fw.ko
签名成功,可以用modinfo
确认一下
modinfo aic8800_fdrv/aic8800_fdrv.ko | grep signer modinfo aic_load_fw/aic_load_fw.ko | grep signer
有输出内容,能够看到签名信息,就说明正确了
此时就可以make install
了,一定不要忘记了这步
加载内核模块
modprobe cfg80211 modprobe aic_load_fw modprobe aic8800_fdrv
然后lsmod
看看呢?
lsmod | grep aic aic8800_fdrv 696320 0 cfg80211 1433600 1 aic8800_fdrv aic_load_fw 90112 1 aic8800_fdrv
然而你ifconfig
还是可能,看不到无线网卡,插拔也看不到😂
dmesg 说firmware failed to open
看看dmesg
dmesg | grep -i aic
你会惊喜的发现
[ 1.233597] usb 5-2: Product: AIC Wlan [ 1.233599] usb 5-2: Manufacturer: aicsemi [ 3.930973] aic_load_fw: loading out-of-tree module taints kernel. [ 3.932153] aic_bluetooth_mod_init [ 3.932158] AICWFDBG(LOGINFO) aicwf_prealloc_init enter [ 3.937597] AICWFDBG(LOGINFO) pre alloc rxbuff list len: 1000 [ 3.937638] AICWFDBG(LOGINFO) aicwf_usb_probe vid:0xA69C pid:0x8D80 icl:0x0 isc:0x0 ipr:0x0 [ 3.937644] AICWFDBG(LOGINFO) aicloadfw_chipmatch USE AIC8800D80 [ 3.937648] Aic high speed USB device detected [ 3.938438] aic_load_firmware :firmware path = /lib/firmware/aic8800D80/fmacfw_8800d80_u02.bin [ 3.938734] aic_load_firmware: fmacfw_8800d80_u02.bin file failed to open [ 3.938742] aicwf_bus_deinit [ 4.439093] usb_err:<aicwf_usb_rx_submit_all_urb,234>: bus is not up=0 [ 4.439118] usb_err:<aicwf_usb_rx_submit_all_urb,234>: bus is not up=0
又惊喜又意外是不是,还需要一个firmware,还好他的压缩包里有,全给复制进去
file aic8800_linux_driver/fw/aic8800D80/fmacfw_8800d80_u02.bin # 输出为 aic8800_linux_driver/fw/aic8800D80/fmacfw_8800d80_u02.bin: data sudo mkdir -p /lib/firmware/aic8800D80 cp aic8800_linux_driver/fw/aic8800D80/* /lib/firmware/aic8800D80/
重新加载内核模块,这次应该可以了吧?
sudo modprobe -r aic8800_fdrv sudo modprobe -r aic_load_fw sudo modprobe aic_load_fw sudo modprobe aic8800_fdrv
dmesg wrong size of firmware file
尽管上一步我们已经modeprobe
了,但是dmesg中看到……
[ 591.951845] usbcore: registered new interface driver aic8800_fdrv [ 0.458630] Spectre V2 : Enabling Speculation Barrier for firmware calls [ 0.640535] ACPI: [Firmware Bug]: BIOS _OSI(Linux) query ignored [ 0.667872] acpi PNP0A08:00: [Firmware Info]: ECAM [mem 0xf0000000-0xf7ffffff] for domain 0000 [bus 00-7f] only partially covers this bridge [ 3.621969] systemd[1]: Mounting snap-firmware\x2dupdater-167.mount - Mount unit for firmware-updater, revision 167... [ 3.636882] systemd[1]: Mounted snap-firmware\x2dupdater-167.mount - Mount unit for firmware-updater, revision 167. [ 3.938438] aic_load_firmware :firmware path = /lib/firmware/aic8800D80/fmacfw_8800d80_u02.bin [ 3.938734] aic_load_firmware: fmacfw_8800d80_u02.bin file failed to open [ 3.938740] wrong size of firmware file [ 4.334041] nouveau 0000:0b:00.0: pmu: firmware unavailable
更新下 initramfs 应该就好了
sudo update-initramfs -u
然后重启系统,然后继续……
sudo modprobe -r aic8800_fdrv sudo modprobe -r aic_load_fw sudo modprobe aic_load_fw sudo modprobe aic8800_fdrv
继续重新加载内核模块
但是此时,好像Wi-Fi还没出啦啊?
更改设备模式
lsusb
可以看到
Bus 005 Device 003: ID a69c:5724 aicsemi Aic MSC
然后如果你细心打开过文件管理器,或者 df
了一次,还会发现
/dev/sdb1 3808 3195 613 84% /media/benny/UGREENs
甚至是如果你仔细看了上面的dmesg high speed USB device detected
[ 3.937644] AICWFDBG(LOGINFO) aicloadfw_chipmatch USE AIC8800D80 [ 3.937648] Aic high speed USB device detected [ 3.938438] aic_load_firmware :firmware path = /lib/firmware/aic8800D80/fmacfw_8800d80_u02.bin [ 3.938734] aic_load_firmware: fmacfw_8800d80_u02.bin file failed to open
系统把这个识别成了U盘😂 记得在Windows下使用也是直接多了个U盘,里面有个setup.exe
只不过这个设备不是用的 usb_modeswitch
,而是udev
,并且其实在install_setup.sh
中已经提示了
驱动源代码中搜索可以看到如下内容
KERNEL=="sd*", ATTRS{idVendor}=="a69c", ATTRS{idProduct}=="5721", SYMLINK+="aicudisk", RUN+="/usr/bin/eject /dev/%k" KERNEL=="sd*", ATTRS{idVendor}=="a69c", ATTRS{idProduct}=="5723", SYMLINK+="tendaudisk", RUN+="/usr/bin/eject /dev/%k" KERNEL=="sd*", ATTRS{idVendor}=="a69c", ATTRS{idProduct}=="5724", SYMLINK+="ugreenudisk", RUN+="/usr/bin/eject /dev/%k"
那么创建一个文件 /etc/udev/rules.d/99-aic-udisk.rules
加入如下内容(或者你想加了上面三行,也行)
KERNEL=="sd*", ATTRS{idVendor}=="a69c", ATTRS{idProduct}=="5724", SYMLINK+="ugreenudisk", RUN+="/usr/bin/eject /dev/%k"
然后运行如下两条命令
sudo udevadm control --reload-rules sudo udevadm trigger
重新插拔网卡,并lsusb
root@vips:~# lsusb Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 002: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode) Bus 001 Device 003: ID 05e3:0608 Genesys Logic, Inc. Hub Bus 001 Device 004: ID 1c4f:0043 SiGma Micro USB Keyboard Bus 001 Device 005: ID 10c4:0005 Silicon Labs USB OPTICAL MOUSE Bus 001 Device 011: ID 368b:8d88 AICSemi AIC 8800D80 wlx6c1ff7557a1b: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 ether 6c:1f:f7:aa:aa:aa txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
哦吼,出现了 🙃真不容易,不愧是开源拖拉机😂 赶紧备份一下整个分区……🫠
但是你以为这就完了吗?没有……
固定内核版本
由于不是dkms,如果某一天一个apt upgrade,然后升级了内核,那么就会发现,咦,我Wi-Fi呢?所以我们要固定一下内核版本,避免出现这种问题
sudo apt-mark hold linux-image-$(uname -r) \ linux-headers-$(uname -r) \ linux-modules-$(uname -r) \ linux-modules-extra-$(uname -r)
🤣 怎么感觉好像工作量全部在配置环境上了
🤔 要是使用 Windows + VM + 直通GPU会不会好一点?总之😂 太痛苦了,没想到竟然被一个无线网卡硬控了4个小时