作为嵌入式开发者,我们经常要在 Windows 宿主机上用 VMware 挂载 SD 卡、串口线或仿真器。但有时候,你会发现硬件像"失踪"了一样,甚至重装虚拟机软件后,Ubuntu 连系统都进不去了。
今天分享一套实战总结的排查逻辑,帮你从"驱动打架"和"系统崩溃"中跳出来。
一、 故障现场:你是不是也遇到了这些?
- 硬件连不上: 插入 SD 读卡器或 USB 串口,Windows 右下角弹出警告。
- 驱动报警告: 打开 Windows "设备管理器",发现设备挂在"其他设备"下,带个黄色感叹号 ,右键属性显示:错误代码 28(驱动未安装)。
- 虚拟机没反应: 以前插入设备会弹窗问"连接到主机还是虚拟机",现在完全不弹窗。
- 系统进不去: 好不容易重装了 VMware,结果 Ubuntu 开机变成黑屏白字,提示进入了 Emergency Mode(紧急模式)。
二、 到底发生了什么?
核心冲突:抢夺所有权。
当你插上 USB 设备时,Windows 驱动和 VMware 驱动在"打架"。
- 正常情况下,VMware 有一个"影子驱动"(vmusb.sys),它会暂时把硬件从 Windows 手里抢过来交给 Ubuntu。
- 如果你装过一些专业的仪器驱动(比如 Keysight、仿真器驱动),它们可能把这个"抢夺权"给封死了。
- Code 28 报错的真相: 说明你电脑里那个"影子驱动"弄丢了 或者被拦截了。没有它,Windows 不知道把设备交给谁,硬件就成了"无主孤魂"。
三、 五步排除故障法:从硬件到系统
第一步:排查"第三方拦截"
看看后台有没有正在运行的硬件管理软件(如 Keysight 通信服务、工控设备监控等)。
- 操作: 暂时停止这些服务,或者直接卸载它们测试。
- 原理: 排除掉那些"霸占"USB 总线的强力驱动。
第二步:找回消失的"影子驱动"
如果你的设备管理器显示 Code 28,且重装驱动无效,说明 VMware 的驱动库坏了。
- 解决办法: 找到 VMware 的安装包(.exe文件),运行它并选择 "修复 (Repair)"。
- 关键点: 只有"修复安装"才能强行把那个丢失的
vmusb.sys塞回系统。修复完后,必须重启电脑。
第三步:验证驱动是否复活
- 操作: 重启后,插入一个简单的 USB 鼠标。
- 判断标准: 如果 Ubuntu 弹出了"连接设备"的询问窗口,恭喜你,链路通了。
第四步:救活崩溃的 Ubuntu(解决 Emergency Mode)
很多人重装 VMware 后发现 Ubuntu 进不去了,这是因为你之前的系统设置了"开机自动挂载 SD 卡"或"共享文件夹",现在环境变了,系统找不到这些东西就会闹情绪。
- 在黑屏界面输入:
mount -o remount,rw /(让系统允许你修改文件)。 - 输入:
nano /etc/fstab。 - 重点: 寻找带
hgfs(共享文件夹)或sdb1(SD卡)的行,在每行开头加个#号注释掉。 - 按下
Ctrl+O保存,Ctrl+X退出,然后输入reboot重启。
第五步:终极硬件挂载技巧
如果 USB 重定向始终不稳定,改用**"物理磁盘挂载"**:
- 在虚拟机设置里:添加硬盘 -> 使用物理磁盘 -> 选择 SD 卡对应的磁盘号。
- 这种方式直接把物理卡映射成虚拟机的
/dev/sdb,绕过了不稳定的 USB 驱动层,效率极高。
四、 总结与建议
- 先软后硬: 先排查后台驱动冲突,再重装软件,最后动系统文件。
- 慎用自动挂载: 除非必要,否则不要在
/etc/fstab里写死外置 SD 卡的挂载,这会让系统在没插卡时直接崩溃。 - 驱动备份: 做嵌入式开发,尽量保持 Windows 宿主机驱动干净,专业软件建议装在另一个虚拟机里。
给你的额外建议:
现在的 Ubuntu 应该能进去了吧?如果你注释掉了 fstab 里的内容,进去之后想挂载 SD 卡,可以手动输入:
sudo mount /dev/sdb1 /mnt (假设你的卡是 sdb1)。