如果对你有帮助,可以点赞收藏
本文分享一种思路去解决linux下不能直接识别usb网卡的方案
1.总体思路:
1.通过lsusb 查看usb 对应的vid:pid 如0bda:a192
2.复制这段代码到google git 上查找相关的驱动信息
3.下载驱动文件到linux 系统的某一文件夹中编译成符合linux 内核的ko驱动文件
遵从这个思路可以解决大部分的网卡驱动的情况。
但是有些情况比较特殊!
尤其针对没有内核-头文件的内核系统
本文中使用的wifi:mercury MW310UH 驱动芯片rtl8192fu
1.1 找到驱动文件
首先通过lsusb确认驱动对应的id
lsusb
列举出所有已经接再linux 上的usb设备,并且可以看到相应的id
格式为
idVendor:idProduct
例如0bda:a192
如果你的usb wifi网卡直接显示为WLAN Adapter 的话那你可以直接去安装驱动,再有驱动编译的问题可以看第二部分
1.2 usb网卡的工作模式切换:
如果你的usb wifi 网卡为Disk 后缀,或者corp 结尾的状态,那么你可以继续参考本文下面所写的内容。
针对市面上的随身usbwifi插入windows后为cd 状态,安装完驱动才会开启wifi功能
对于zeroCD的这种usb 设备有专门的软件来解决他,就比如这种usb 网卡,带有windows 驱动,但是对于linux 而言他就是没有意义的。所以被称为zeroCD,相关内容可以搜索usb_modeswitch可以看到更多内容,或者点击本文最后的链接为该项目(usb_modeswitch)的官网,不是很建议去官网的方式安装,因为秃头成分严重。
先查看usb列表,显示为cd状态
$ lsusb[...]Bus 001 Device 013: ID 0bda:a192 Realtek Semiconductor Corp. Disk
对于这种disk 后缀得到我们都需要对他进行模式切换
最简单的方法安装usb_modeswitch
ps:换源小妙招
sed -i "s@http://deb.debian.org@https://mirrors.aliyun.com@g" /etc/apt/sources.list
安装usb_modeswitch
sudo apt-get install -y usb-modeswitch
更改相应文件
sudo vim /lib/udev/rules.d/40-usb_modeswitch.rules
这种状态后就可以开始安装驱动,但是不要着急,先将usb的模式设置为默认wifi状态
进入目录:
sudo vim /lib/udev/rules.d/40-usb_modeswitch.rules
shirt+G 直接到最后一行加入到LABEL之前
# Realtek 8192F Wifi AC USB
ATTR{idVendor}=="0bda", ATTR{idProduct}=="a192", RUN+="/usr/sbin/usb_modeswitch -K -v 0bda -p a192"LABEL="modeswitch_rules_end"
需要手动再次执行
sudo usb_modeswitch -KW -v 0bda -p a192
1.3 usb-wifi模式自动切换的方案
方法一:解决poweroff 后需要输入命令的情况 直接看优化
cd /lib/udev/rules.d/
sudo vim 40-usb_modeswitch_rtl8192.rules
输入以下内容:
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="a192", RUN+="/usr/sbin/usb_modeswitch -K -v 0bda -p a192"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="a192", RUN+="/bin/bash -c 'modprobe 8192fu && echo 0bda f192 > /sys/bus/usb-serial/drivers/option1/new_id'"
以上方法不再需要输入命令,还是需要拔插一次usb wifi 才可以自动变成wifi模式
(不够完美)
经过优化:已经达到开机可用状态
在这个目录下的rules.d 文件中进行修改后实现了开机就可以用的状态
执行下面的代码
sudo vim /etc/udev/rules.d/50-usb-realtek-net.rules
最后一行输入:
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="a192", RUN+="/usr/sbin/usb_modeswitch -K -v 0bda -p a192"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="a192", RUN+="/bin/bash -c 'modprobe 8192fu && echo 0bda f192 > /sys/bus/usb-serial/drivers/option1/new_id'"
安装完驱动,再断电后开机,等待30秒左右(正常开机)既可以ssh 通过WiFi的ip进行管理
这里代表usb网卡的cd模式已经切换为wifi工作模式
首先确认内核版本:
uname -a
我的内核版本如下:
Linux flygemini 5.10.85-sunxi64 #trunk SMP Tue Apr 12 13:21:58 CST 2022 aarch64 GNU/Linux
编译驱动首先要获取内核头文件,如果没有就直接看2吧。有的话马上就装完。直接看3
sudo apt install -y linux-headers-$(uname -r)
2.没有头文件的情况:
没有头文件的情况,需要自己制作相似的内核系统头文件,并且更改vermagic版本号,最终实现制作和内核版本一致的ko驱动文件,步骤如下
2.1没有找到内核头文件那就先找一份相似的,并且放置好头文件的位置
内核网站: (仅仅作为示范:展示一个armbian的源网站)
http://armbian.tnahosting.net/apt/pool/main/l/
最相近的如图所示:
下载后传输/复制到linux 中
进入.deb 所在目录后
安装命令
sudo dpkg -i linux-headers-current-sunxi64_21.08_arm64.deb
安装后可以在这个目录里中找到
cd /usr/src/
cd /usr/src/linux-headers-5.10.60-sunxi64/
首先在linux内核头文件目录下生成一个build文件夹(因为没有找到匹配的头文件,所以新建一个)
cd /usr/lib/modules/5.10.85-sunxi64/
sudo mkdir build
复制找到的最相近的内核文件的头文件(刚刚的安装目录上面给过👆)
sudo cp -r /usr/src/linux-headers-5.10.60-sunxi64/. /usr/lib/modules/5.10.85-sunxi64/build
进入这个文件夹中
cd /usr/src/linux-headers-5.10.60-sunxi64/arch/
创建一个新的aarch64 文件夹并将arm64下的文件都复制进去
sudo cp -r arm64/. aarch64
好了,目前完成了用来编译的内核文件的源文件基础部分的构建
2.2下面我们需要修改vermagic的版本号
通过修改ko文件的版本号,从而实现驱动报错的情况:
为什么要修改呢?
因为make命令后生成的驱动文件是你自己下载的对应内核版本,
所以要修改伪装成是当前的内核版本。
第一个文件:utsrelease.h
sudo vim /usr/lib/modules/5.10.85-sunxi64/build/include/generated/utsrelease.h
第二个文件:
sudo vim /usr/lib/modules/5.10.85-sunxi64/build/include/config/kernel.release
好了,伪装 工作全部完成
3.安装驱动
接下来开始在所下载的驱动文件夹下进行安装(这一步一般都在驱动项目中给了)
git clone https://gitee.com/BrightXu/rtl8192fu.git
cd rtl8192fu
make -j$(nproc)
这里会有类似报错:
如何解决以及解决思路,待更新(按照伪造内核头文件的方法,这里不会有报错)
sudo make install
sudo modprobe 8192fu
如果安装过程中没有一次报错,那么恭喜你,wifi应该就可以用了
检验wifi驱动是否挂载成功
usb-devices | grep "Vendor=0bda ProdID=f192" -B2 -A5
测试下
如果不是none 那么就是安装成功了
dkms的支持需要看驱动git页面进行设置,本文不做赘述。
参考文章:
1.自动将usb 网卡的disk模式切换为wifi芯片systemd - Automatically use usb_modeswitch for Wifi USB - Ask Ubuntuhttps://askubuntu.com/questions/1080944/automatically-use-usb-modeswitch-for-wifi-usb/1082418#1082418
2.修改ko驱动文件的版本号为当前的内核版本
linux 修改 ko文件内核版本号_whatday的博客-CSDN博客当需要一个ko在一个内核下编译,insmod到另一个内核时,1、include/config/kernel.release文件中为内核版本号,将其改为所需版本。2、include/generated/utsrelease.h文件中 #define UTS_RELEASE “XXX” 将xxx改为自己所需内核版本号 。3、include/linux/vermagic.h文件改为与另一内核相同。注意:这样修改并保存后,编译出来的.ko文件里面的版本信息就更改了,但是重新编译内核时会变回.https://blog.csdn.net/whatday/article/details/1122468313.rtl8192fu驱动对应0dba:f192 的linux驱动安装教程
rtl8192fu: 8192fu Linux USB无线网卡驱动 - Gitee.comhttps://gitee.com/BrightXu/rtl8192fu/tree/master4.usb_modswitch 的拓展阅读
Draisberghof - Software - USB_ModeSwitchhttps://www.draisberghof.de/usb_modeswitch/#trouble
5. Getting a Huawei E352s-5 to work with Linuxhttps://www.bytefish.de/blog/huawei_e352s5.html