WSL2 挂载 USB 串口设备脚本解析
准备工作确保 WSL2 内核为最新版本 Windows 端以管理员身份安装usbipd-win:
winget install dorssel.usbipd-winWSL2 中安装工具包:
sudo apt install usbutils脚本功能实现自动检测usbipd.exe路径,支持默认安装位置和 PATH 环境变量 交互式列出所有 USB 设备信息(BUSID/VID:PID/描述) 自动执行设备绑定和挂载操作 验证设备节点并设置权限为 666
脚本使用流程保存脚本为mount_serial.sh并赋予执行权限:
chmod +x mount_serial.sh运行脚本并选择设备编号:
./mount_serial.sh成功后会显示设备挂载路径(如/dev/ttyUSB0)
核心代码逻辑设备路径检测采用 fallback 机制:
USBIPD="/mnt/c/Program Files/usbipd-win/usbipd.exe" [ ! -f "$USBIPD" ] && USBIPD="usbipd.exe"设备列表解析使用 awk 处理:
busid=$(echo "$device" | awk '{print $1}') vid_pid=$(echo "$device" | awk '{print $2}') desc=$(echo "$device" | cut -d' ' -f3-)权限设置命令:
sudo chmod 666 /dev/ttyUSB*故障排查方案权限问题解决方案:
Start-Process PowerShell -Verb RunAs -ArgumentList "usbipd bind -b <BUSID>"设备未识别时检查内核日志:
dmesg | grep -i usb确认内核模块支持:
zgrep CONFIG_USB_SERIAL /proc/config.gz自动化改进建议添加设备自动检测逻辑示例:
auto_attach() { for dev in "${devices[@]}"; do if [[ $dev == *"FTDI"* ]]; then busid=$(echo "$dev" | awk '{print $1}') "$USBIPD" attach --wsl -b "$busid" break fi done }持久化配置方法将常用命令添加到.bashrc:
alias mount-arduino='usbipd attach --wsl -b 1-1'创建 udev 规则文件(如需固定设备节点):
echo 'KERNEL=="ttyUSB*", MODE="0666"' | sudo tee /etc/udev/rules.d/99-serial.rules#!/bin/bash # ============================================== # 脚本: mount_serial.sh # 用途: 在 WSL2 中选择一个 USB 串口设备,并挂载到 WSL 中 # 前提: 已在 Windows 端安装 usbipd-win (winget install dorssel.usbipd-win) # ============================================== # usbipd.exe 的路径(通常在这里) USBIPD="/mnt/c/Program Files/usbipd-win/usbipd.exe" # 如果上面的路径不存在,尝试用系统 PATH 中的 usbipd if [ ! -f "$USBIPD" ]; then USBIPD="usbipd.exe" fi echo "==============================" echo " WSL2 USB 串口挂载工具" echo "==============================" # 1. 检查 usbipd 是否可用(修正:使用 --version 参数) echo "[*] 检查 usbipd 是否可用..." if ! "$USBIPD" --version &> /dev/null; then echo "[错误] 无法运行 usbipd.exe,请确认已安装 usbipd-win。" echo "安装命令 (管理员 PowerShell): winget install dorssel.usbipd-win" exit 1 fi echo "[✓] usbipd 正常" # 2. 获取 USB 设备列表 echo "[*] 正在获取 USB 设备列表..." mapfile -t devices < <("$USBIPD" list 2>/dev/null | tail -n +3) # 跳过标题行 if [ ${#devices[@]} -eq 0 ]; then echo "[!] 没有找到任何 USB 设备。请检查设备是否已连接。" exit 1 fi echo "" echo "可用的 USB 设备:" echo "--------------------------------------------------------------" # 打印设备列表并构建选项数组 options=() index=1 for line in "${devices[@]}"; do # 输出格式: BUSID VID:PID 描述 # 例: 1-1 1a86:7523 USB Serial busid=$(echo "$line" | awk '{print $1}') vidpid=$(echo "$line" | awk '{print $2}') desc=$(echo "$line" | cut -d' ' -f3-) echo " [$index] BUSID=$busid $vidpid $desc" options+=("$busid|$desc") ((index++)) done echo "--------------------------------------------------------------" # 3. 让用户选择一个设备 read -p "请输入要挂载的设备编号 [1-$((index-1))]: " choice if ! [[ "$choice" =~ ^[0-9]+$ ]] || [ "$choice" -lt 1 ] || [ "$choice" -ge "$index" ]; then echo "[错误] 无效的选择。" exit 1 fi selected="${options[$((choice-1))]}" busid=${selected%%|*} desc=${selected#*|} echo "你选择了: BUSID=$busid 描述: $desc" # 4. 绑定(bind)设备 —— 需要管理员权限 echo "[*] 正在绑定设备 (可能需要管理员权限)..." if ! "$USBIPD" bind -b "$busid" 2>&1; then echo "[警告] 绑定失败,可能是因为权限不足。" echo "请用管理员身份打开一个新的 PowerShell 窗口,执行以下命令:" echo " usbipd bind -b $busid" echo " usbipd attach --wsl -b $busid" echo "然后在本脚本中直接按回车尝试 attach。" read -p "按回车继续尝试 attach..." fi # 5. 将设备挂载到 WSL echo "[*] 正在挂载设备到 WSL..." if "$USBIPD" attach --wsl -b "$busid" 2>&1; then echo "[✓] 设备已挂载。" else echo "[错误] 挂载失败,请检查设备是否已被其他程序占用,或尝试手动执行:" echo " usbipd attach --wsl -b $busid" exit 1 fi # 6. 验证设备是否出现在 /dev 下 echo "[*] 等待设备就绪..." sleep 2 # 给内核一点时间识别设备 if ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null | grep -q .; then echo "[✓] 检测到以下串口设备:" ls -l /dev/ttyUSB* /dev/ttyACM* 2>/dev/null # 自动赋权(可选) for dev in /dev/ttyUSB* /dev/ttyACM*; do [ -e "$dev" ] && sudo chmod 666 "$dev" 2>/dev/null done echo "[✓] 权限已设置为可读写。" else echo "[!] 未检测到 /dev/ttyUSB* 或 /dev/ttyACM* 设备,但挂载可能已成功。" echo "请运行 'dmesg | tail' 查看内核日志,或检查设备类型。" fi echo "==============================" echo " 操作完成,你现在可以在 WSL 中使用该串口了。" echo "=============================="所有代码: