本文主要是介绍编译WSL内核,用于操作usb读卡器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
wsl2默认不能操作usb读卡器,但是对于嵌入式linux开发来说,需要经常对tf卡进行操作,随时都会使用到usb读卡器的访问。下面讲述如何开启wsl2的usb读卡器的访问,主要涉及到以下2个步骤:
- wsl2本质是一个虚拟机,无法直接访问宿主主机的USB设备。
- wsl2的内核没有加入USB存储设备的驱动。
一、开启wsl2的usb识别
-
1.1、windows安装
USBIPD-WIN
项目(官方指导教程)-
① 转到 usbipd-win 项目的最新发布页。
-
② 选择 .msi 文件,点击后会进行下载。
-
③ 运行下载的
usbipd-win_x.msi
安装程序文件。
下载完后点击安装就好,安装完后还会要求你重启电脑。
-
-
1.2、wsl2下安装 USBIP 工具和硬件数据库
sudo apt install linux-tools-generic hwdata sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20
如果安装失败,先执行
sudo apt update
,再进行安装。 -
1.3、attach usb设备到wsl2
在attach USB 设备之前,请确保 WSL 命令行已打开。- ① 通过以管理员模式打开 PowerShell 并输入以下命令,列出所有连接到 Windows 的 USB 设备:
usbipd wsl list
如下:
- ② 选择要attach 到 WSL 的设备总线 ID,然后运行此命令:
usbipd wsl attach --busid <busid>
如下:
- ③ 打开 wsl2,使用以下命令列出附加的 USB 设备:
lsusb
如下:
-
1.4、从wsl2 detach usb设备
在wsl2中完成设备使用后,可物理断开 USB 设备,或者在管理员模式下从 PowerShell 运行此命令:usbipd wsl detach --busid <busid>
此步执行完成后,虽然能识别到usb设备了,但是并没有创建块设备节点(/dev/sd*)。下面的操作就是用来解决这个问题。
二、开启wsl2的usb存储设备驱动
这部分需要重新编译wsl2的内核,开启内核的usb存储设备驱动,编译后进行内核替换。
-
2.1、首先到wsl2的内核仓库中获取一份内核源码:
git clone https://github.com/microsoft/WSL2-Linux-Kernel.git
或直接下载zip文件,比较快:
-
2.2、解压源码:
unzip WSL2-Linux-Kernel-linux-msft-wsl-5.15.y.zipcd WSL2-Linux-Kernel-linux-msft-wsl-5.15.y
-
2.3、使用以下命令来配置内核配置:
make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl
-
2.4、进入
Device Drivers
->USB support
->Support for Host-side USB
,选中USB Mass Storage support
( * 号是直接编译进内核,M 是编译为内核模块,内核模块需要手动加载),把下面弹出来的一堆驱动都选上,保存完之后就可以退出了。
-
2.5、执行以下命令开始编译内核:
make -j$(nproc) bzImage KCONFIG_CONFIG=Microsoft/config-wsl
编译完成的内核是bzImage文件,和我们编译时指定的名称一致,文件在arch/x86/boot/文件夹下。
-
2.6、把编译好的内核复制出来,放在 Windows 的用户目录(默认是
C:\Users\{username}
)下创建一个名为 .wslconfig 的文件,内容根据 微软官方文档 来:[wsl2] kernel=path\\to\\kernel
以下是我的配置:
-
2.7、检查新内核是否生效
重启wsl2,使用以下命令来查看内核版本号:uname -a
对比下显示的日期是否和编译日期一样。
三、wsl2访问usb读卡器
- 3.1、usbipd-win的使用,方法也是参考的微软官方文档。
管理员方式打开powershell:# 将usb从windows接入到wsl,此时windows端会断开 usbipd wsl list usbipd wsl attach --busid <busid>
- 3.2、wsl2访问usb
# 查看usb接入情况 lsusb # 查看内核日志 dmesg# 查看对于的块设备节点 ls /dev/sd*
- 3.3、使用完成之后,断开usb
# 此命令执行完成后,usb将从wsl断开,windows端会接入 usbipd wsl detach --busid <busid>
这篇关于编译WSL内核,用于操作usb读卡器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!