网卡驱动移植

型号确认及模式设置

在移植网卡驱动前,首先得知道它的型号。如果是USB网卡的话,可以通过lsusb命令查看

1
2
3
4
5
lsusb 

...
Bus 001 Device 003: ID 0bda:1a2b Realtek Semiconductor Corp. RTL8188GU 802.11n WLAN Adapter (Driver CDROM Mode
...
  • 很多网卡在未使用时,可能被初始化成U盘的模式,这时还需要我们将其转成网卡模式

  • 这里RTL8188GU并不是真正的型号,因为它此时不是真正的网卡模式,RTL8188GU是Realtek常用“老型号马甲”

可以通过以下的指令,将USB网卡切换到真正的网卡模式

1
2
3
4
5
sudo apt install usb-modeswitch usb-modeswitch-data

sudo usb_modeswitch \
-v 0bda -p 1a2b \
-M "5553424312345678000000000000061b000000020000000000000000000000"
  • -v / -p 是当前 VID/PID(MSC 模式)
  • -M 是发送给设备的切换命令(MessageContent)

执行完后再执行lsusb,就可以发现USB设备的vendor_id、pid、描述符都变了

1
2
3
4
5
lsusb

...
Bus 001 Device 006: ID 0bda:b851 Realtek Semiconductor Corp. 802.11ax WLAN Adapter
...
  • 0bda → Realtek 官方 VID
  • b851 → Realtek RTL8851BU 专用 PID

驱动签名

如果编译Linux内核时开了内核模块签名校验,那么在驱动安装之前,需要手动对驱动进行签名操作,不然驱动会安装失败

如何看Linux内核到底看没开驱动签名校验

1
zcat /proc/config.gz | grep MODULE_SIG
  • CONFIG_MODULE_SIG=y:启用模块签名支持
  • CONFIG_MODULE_SIG_FORCE=y:强制所有模块必须签名才能加载
  • CONFIG_MODULE_SIG_KEY="...":内核自带签名密钥

要进行驱动签名,需要以下准备文件

  • 密钥对:

    • 私钥(Private Key):用于给模块生成签名,只能被开发者或受信任方持有,一般是.pem格式

    • 公钥(Public Key):内核用它来验证模块签名,一般是 .x509.der格式

    • 一般放在/lib/modules/$(uname -r)/build/certs/

  • 签名工具(由Linux提供):

    • 一般放在路径/lib/modules/$(uname -r)/build/scripts/sign-file

准备好后,通过下面指令进行驱动签名

1
2
3
4
5
6
cd /lib/modules/6.1.112-rt43-DR-4.0.4-2510152230-gb381cb-g6c4511/build

./scripts/sign-file sha256 \
./certs/module_signature.pem \
./certs/module_signature.x509\
~/Desktop/rtl8851bu-master/8851bu.ko

驱动安装

驱动签名完之后,就可以直接将驱动加载进内核了,有2种方式

1
2
3
4
5
# 法1
sudo insmod /path/to/8851bu.ko

# 法2
sudo modprobe 8851bu

如果签名失败,会报以下错误

1
sudo modprobe 8851bu modprobe: ERROR: could not insert '8851bu': Key was rejected by service

网卡状态验证

1
2
3
4
5
# 查看网卡接口
ip link

# 查看无线接口
iwconfig