USB U 盘与键盘鼠标¶
控制器与设备¶
默认内核内置 xHCI、EHCI 和 UHCI。xHCI 支持根端口或 Hub 后的 USB 3.x SuperSpeed BOT/SCSI 存储,以及 USB 2.0/1.x BOT 存储、boot HID 键盘和相对 鼠标。EHCI 支持 USB 2.0 高速 BOT/SCSI 存储;低速/全速键鼠可由 UHCI companion 提供。VMware 中可选择“USB Controller / USB Compatibility / USB 3.x”使用 xHCI,或选择 USB 2.0 使用 EHCI;两种路径的验证结果分别记录。 USB 的 Linux 块设备与 evdev 接口由内核提供,不需要修改 BusyBox。
xHCI 支持 USB2/USB3 Hub、多级路由和下游设备热插拔;USB2 的 multi-TT
Hub 使用默认 single-TT 模式。拔掉 Hub 时,下游设备一起断开,旧打开不会
转向重新插入的设备。UAS、stream、等时音视频及非 boot HID 不受支持。
USB4、Type-C/PD 和物理电气认证也不在支持范围内。SuperSpeedPlus
可按已验证的控制器协议能力识别速率,但日志中的 bps 是控制器声明的
链路速率,不是实测吞吐量;10/20 Gb/s 物理链路尚未验证。
接管固件配置的 xHCI 时,驱动只在必要寄存器几何推导出的边界内访问扩展 能力,不对正在使用的 BAR 做破坏性尺寸探测。这依赖固件对必要寄存器和 BAR 范围的描述真实;无法确认边界内的能力会被拒绝。
存储当前要求 512 字节逻辑扇区,支持 GPT、MBR/扩展分区和直接在整个设备上 创建的文件系统。没有介质的读卡器、更换介质需重新拔插。不是所有 USB 协议都受支持,例如 UAS、等时音视频和非 boot HID 设备;文件系统类型还 必须有相应内核实现。
手工挂载¶
设备使用普通 /dev/sdX 名称,分区带数字后缀;编号取决于机器原有磁盘,
不可假定所有 U 盘都是 sdb。先用 lsblk 查看设备、容量和文件系统,
确认目标后以 root 执行。重新连接后名称可能改变,应再次确认设备。
下面的 sdX1 是占位符,必须换成实际分区:
lsblk
mkdir -p /mnt/usb
mount -t vfat /dev/sdX1 /mnt/usb
ls /mnt/usb
sync
umount /mnt/usb
ext4/exFAT 介质分别使用 -t ext4 或 -t exfat;整个设备上直接创建的
文件系统使用 /dev/sdX。写保护介质使用 mount -o ro。卸载完成后再
断开 VMware 可移动设备或拔出 U 盘;突然拔出后的旧打开返回 ENODEV,
重新插入不会把旧句柄转向新设备。
如果设备无法证明写入已落盘,并且拒绝缓存同步命令,umount 会报告错误。
应保留设备连接并检查日志;不能把文件能够读回当成安全断电的证明。
此类设备重新连接后,可使用 mount -o ro 读取;从未尝试写入的设备无需
提交本驱动的写缓存,读取后的卸载不会被不支持的同步命令阻断。
使用模块配置时¶
make defconfig 默认将驱动内置。选择 CONFIG_USB_XHCI_HCD=m 或
CONFIG_USB_EHCI_HCD=m 后,镜像分别携带 xhci.ko 或 ehci.ko 和
对应 PCI alias,由现有模块冷插拔策略加载。EHCI 的低速/全速根端口键鼠还
需要 UHCI companion;相应设置和其他模块管理步骤见 内核模块的系统管理。
USB 设备的使用者持有对应控制器模块;有挂载或打开的 USB 块设备时卸载
该控制器会返回忙。应先卸载文件系统、关闭使用者,不强制卸载。重新连接
后的 /dev/sdX 名称可能变化,旧打开不会被重新绑定。
集成验证¶
tools/test_usb2_qemu.py 消费 ReliefNT 的原生输入/移除探针,在关闭 PS/2
控制器的 QEMU 中检查 USB 键盘登录、相对鼠标精确事件、U 盘读写和写保护、
MBR/GPT/整盘 FAT、拔插后旧 FD 的 ENODEV、新设备名及可选模块装卸。
离线核对写入字节;镜像使用只读快照,测试 U 盘与输出目录新建,不接管宿主机
物理 USB。探针哈希、内核 release、固件、控制器、QMP 设备树及每个设备的
端口与协商速率记录在输出中;xHCI 检查要求每个 U 盘实际协商 SUPER,
不能仅凭设备连接到 xHCI 或其他设备的速率判定成功。
默认仍是 --topology highspeed --firmware bios;companion 保留 EHCI /
UHCI 行为。选择 qemu-xhci 或 nec-usb-xhci 时,各配置八个 USB2 和
八个 USB3 根端口;--hid-usb-version 1 和 2 分别检查 FULL 和 HIGH
键鼠,默认使用 2。--modules 检查所选控制器模块,需使用对应模块化
镜像。xHCI 测试要求独立探针身份 JSON 中的 probe_sha256 与实际探针
一致;默认查找探针同目录下的 probe-identity.json,也可用
--probe-identity 指定。必须为每行选择全新的输出目录:
python3 tools/test_usb2_qemu.py --image /path/to/reliefos.raw \
--manifest /path/to/install.bundle.json --probe /path/to/usb-input-probe \
--output /path/to/new-evidence --topology qemu-xhci --hid-usb-version 2
python3 tools/test_usb2_qemu.py --image /path/to/reliefos.raw \
--manifest /path/to/install.bundle.json --probe /path/to/usb-input-probe \
--output /path/to/another-new-evidence --topology nec-usb-xhci \
--firmware uefi --hid-usb-version 1
UEFI 使用 QEMU_FIRMWARE 指定的 OVMF 镜像,默认
/usr/share/edk2/x64/OVMF.4m.fd,通过 -bios 只读取共享固件文件。
测试设置 opt/ovmf/X-PciMmio64Mb=0,使 NVMe 64 位 BAR 放入低 MMIO
窗口,与 tools/test_dual_boot_qemu.py 的低 MMIO 模式一致。BIOS 使用
SeaBIOS 的对应低地址设置。结果文件记录原始镜像运行前后的 SHA-256;
只有 guest 检查、离线字节检查和镜像不变均通过,整行才通过。
完整验收矩阵包括 builtin 的 qemu-xhci/BIOS/HIGH HID、
nec-usb-xhci/UEFI/FULL HID,模块化 qemu-xhci/BIOS/FULL HID,以及原有
EHCI/UHCI companion 回归。各行是否运行和通过以其 results.json 为准。
真实 VMware xHCI 曾观察到虚拟 SuperSpeed 存储及 FULL 键鼠枚举,但当前集成
验证未完成,不能据此声称存储、输入和缓存同步全部成功;以往 VMware USB2
失败仍按原结果记录。物理 USB 直通和实体硬件尚未验证。QEMU 的
-vga vmware 也不代表真实 VMware 验证。
tools/test_xhci_hub_qemu.py 另行验证两级全速 Hub 后的 U 盘、USB 键盘
登录和相对鼠标、单独 U 盘拔插、整棵 Hub 树移除/重建,以及可选
--modules 的挂载阻止卸载和卸载后重新枚举。使用 console backend 的测试
副本,避免 XDM 在 TTY 键盘验证期间切换焦点。该脚本同样消费匹配镜像的
--manifest、内核仓原生 --probe,并要求新建 --output:
python3 tools/test_xhci_hub_qemu.py --image /path/to/reliefos.raw \
--manifest /path/to/install.bundle.json --probe /path/to/usb-input-probe \
--output /path/to/new-hub-evidence --controller qemu-xhci
QEMU 的 usb-hub 只支持全速,不能用它证明高速 Hub 的 TT 或 USB3 Hub
物理链路。内核支持边界和硬件协议验证归属 ReliefNT 文档;Hub 的 VMware
验证未完成,物理 USB 直通和实体 Hub 也尚未验证。
VMware 的 USB 兼容性和可移动设备操作见 Workstation Pro 官方手册。