[嵌入式Linux] 配置WSL2 Ubuntu24.04 连接USB设备 识别SD卡

IMX6ULL的程序烧录可以通过官方的烧录工具直接烧录到SD卡中, 但是需要在Linux环境下运行烧录脚本,这就需要SD卡可以被WSL2识别到。而WSL2中连接外部usb存储设备存在两个坑

1.WSL2本质是一个虚拟机,无法直接访问宿主机的USB设备。

2.WSL2的内核没有加入USB存储设备的驱动

我们来逐一解决

系统:Win11 23H2

WSL2: Ubuntu24.04

一、WSL连接USB设备

通过查阅资料,发现微软提供了usbipd-win来解决WSL连接usb的问题

usbipd-win:USB/IP项目旨在开发一种通用的通过IP网络共享USB设备的系统。为了让计算机之间能够共享USB设备并完全发挥它们的功能。实现的方式是用TCP将USB封装一下,再通过网络传输。

1.在windows中安装usbipd

  打开管理员终端,使用如下命令安装usbipd,安装完成后重启计算机。

winget install --interactive --exact dorssel.usbipd-win

2.在Ubuntu安装usbipd

  进入Ubuntu中,键入如下命令,安装所需工具。安装前先更新最新的包信息索引列表。

sudo apt update
sudo apt-get install usbutils hwdata linux-tools-generic
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/*-generic/usbip 20

  安装完成后在windows终端中重启wsl

wsl --shutdown
wsl

3.验证

  插入usb设备,windows终端中输入usbipd list,列出所有连接到Windows的usb设备

usbipd list

  

  我插入的是SD卡,也就是BUSID为2-3的设备,可以看到状态为Not shared,未分享。下面键入命令usbipd bind -b <busid>来分享此设备

usbipd bind -b <busid>

  

  状态变为Shared后,键入命令usbipd attach --wsl -b <busid>,将设备添加到WSL中

usbipd attach --wsl -b <busid>

   

  若添加不成功则重新共享,多试几次,直到状态变为Attached。添加成功后在ubuntu中键入lsusb命令,获取USB设备列表,查看是否添加成功。

lsusb

  

  发现ID与windows中的USB大容量存储设备一致,说明WSL中已经可以识别到这个USB。至此我们已经成功了一半。

  通过sudo fdisk -l命令,列出所有Ubuntu识别到的磁盘分区表。

sudo fdisk -l

  发现分区表中并未如预期出现ssd设备,这是因为WSL的内核中默认并未添加相关的USB驱动,需要我们重新编译一下WSL内核,加入USB驱动。

4.扩展(与本文主要内容无关)

#从WSL中断开指定的usb
usbipd detach --busid <busid>

#停止共享指定的usb设备
usbipd unbind -b <busid>

二、WSL添加USB驱动

1.从WSL2的内核仓库中获取内核源码,并安装必要工具

  将内核源码clone到Ubuntu中。

git clone https://github.com/microsoft/WSL2-Linux-Kernel.git

  注意,源码包当前分支默认内核版本和最新的Linux内核相同,若使用的不是Ubuntu最新版本(Ubuntu24.04),还需在下载完成后执行如下命令,checkout对应的内核版本。

cd WSL2-Linux-Kernel
git checkout linux-msft-wsl-$(uname -r | cut -d- -f1)

  安装必要的编译工具,安装前先更新最新的包信息索引列表。

sudo apt update
sudo apt install libncurses-dev build-essential flex bison libssl-dev libelf-dev dwarves

2.修改内核编译选项,编译WSL内核

  在源码Makefile所在目录中执行make menuconfig,编辑内核配置文件

make menuconfig KCONFIG_CONFIG=Microsoft/config-wsl

  进入 Device Drivers -> USB support -> Support for Host-side USB ,选中 USB Mass Storage support(* 号是直接编译进内核,M 是编译为内核模块,内核模块需要手动加载)

  把下面弹出来的一堆驱动都选上*,保存完之后就可以退出了,注意左上角的内核版本,之后验证时会用到。

  键入如下命令,开始编译内核,编译完成的内核是bzImage文件,文件名称在编译命令中可配置,编译出的内核文件在arch/x86/boot/文件夹下。编译完成后将编译好的内核copy到windows目录。

make -j$(nproc) bzImage KCONFIG_CONFIG=Microsoft/config-wsl

3.修改wsl配置文件,加载指定的内核

  修改用户目录(C:\Users\{username})下的.wslconfig文件(没有则新建),添加如下内容,其中的<bzImage path>替换为刚刚copy到windows的内核所在文件路径。

[wsl2]
kernel=<bzImage path>

4.验证结果

  首先在Windows终端中重启WSL

wsl --shutdown
wsl

  进入Ubuntu后输入uname -r命令,查看当前内核版本,是否与编译的内核版本对应(编译的内核版本可在前文中选择USB驱动的图片中找到)。

uname -r

  

  可以看到获取到的内核版本与编译的版本一致。再次将SD卡通过usbipd添加到WSL中,执行sudo fdisk -l命令,列出所有磁盘分区表,此时便发现我们的SD卡被列出来了。

sudo fdisk -l

  

至此,usb的配置已完成。

  • 55
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值