项目场景在使用嵌入式 Linux 开发板RK3568搭建NAS时我们经常会外接各种 USB 存储设备。通常情况下插上 U 盘或硬盘敲一行lsblk就能直接挂载使用。但最近我遇到了一个极其顽固的问题系统明明通过 lsusb 认出了硬盘盒但在 lsblk 里就是死活刷不出磁盘节点如 /dev/sda。问题描述硬件环境与初始症状操作系统Ubuntu 20.04 (内核版本 5.10.160)外接设备搭载 JMicron JMS583 主控的 M.2 NVMe 转 USB 硬盘盒一块机械硬盘症状表现执行 lsblk只能看到板载的 eMMC (mmcblk0, mmcblk1)完全没有 /dev/sda。执行 lsusb设备赫然在列显示 Bus 001 Device 002: ID 152d:0583 JMicron Technology…甚至在详细信息中显示已经成功以 USB 2.0 高速模式握手。硬件层认出来了块设备层却没认出来。排查过程第一阶段排查供电与协议冲突由于我使用单独电源给这个SATA转USB磁盘供电所以排除是电源问题然后检查UAS 协议不匹配问题。JMicron JMS583 主控在 Linux 下的 UAS协议兼容性臭名昭著。在 USB 2.0 环境下极易出现响应超时导致内核不断重置设备。随后尝试通过sudo modprobe usb-storage quirks152d:0583:u这个152d:0583是lsusb获取命令临时屏蔽 UAS 协议。但是系统无情报错FATAL: Module usb-storage not found...这意味着我的系统内核并没有将 USB 存储驱动编译成可动态加载的 .ko 模块。第二阶段绕过 Udev 机制通过 new_id 强制重定向驱动我开始怀疑是USB存储驱动有问题然后通过ls /sys/bus/usb/drivers发现usb-storage 和 uas 都在列表里这说明驱动并没有被阉割而是被静态编译在了内核中。真正原因是系统底层虽然有 usb-storage 驱动但它拒绝自动去接管这个新插入的 JMicron 硬盘盒。所以我通过下面指令强行让usb-storage 驱动接管152d:0583存储设备# 将设备 ID 强行写入 usb-storage 的接管列表中echo152d 0583|sudotee/sys/bus/usb/drivers/usb-storage/new_id最终解决方案编辑 /etc/rc.local 文件sudonano/etc/rc.local在文件末尾的 exit 0 上一行添加以下内容echo152d 0583/sys/bus/usb/drivers/usb-storage/new_id这个152d 0583换成自己的设备