我的电脑上插了 3 个完全一样的 usb 蓝牙接收器,有时我需要把其中一个通过 spice 的 usb 重定向分配给虚拟机用,但是因为设备名称完全一样,在我使用 virt-viewer 时我无法区分哪个设备是我想要重定向给虚拟机的设备,比如我电脑上 lsusb 有以下输出
d@desktop:~$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0b05:19af ASUSTek Computer, Inc. AURA LED Controller
Bus 001 Device 005: ID 2b89:8761 Realtek Bluetooth Radio
Bus 001 Device 006: ID 2b89:8761 Realtek Bluetooth Radio
Bus 001 Device 007: ID 32c2:0012 HS6209 2.4G Wireless Receiver
Bus 001 Device 009: ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hub
Bus 001 Device 012: ID 413c:301c Dell Computer Corp. Dell Universal Receiver
Bus 001 Device 013: ID 17ef:6047 Lenovo ThinkPad Compact Keyboard with TrackPoint
Bus 001 Device 018: ID 2b89:8761 Realtek Bluetooth Radio
Bus 001 Device 021: ID 17ef:60ee Lenovo TrackPoint Keyboard II
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 002: ID 174c:3074 ASMedia Technology Inc. ASM1074 SuperSpeed hub
有 3 个设备的名称都是“Realtek Bluetooth Radio”,我希望有办法让这里的名称后面跟上这个设备的 Device 号,比如 “Realtek Bluetooth Radio 5”,“Realtek Bluetooth Radio 6”,“Realtek Bluetooth Radio 18”
我觉得这应该需要给 udev 添加一些规则才能实现,但是我对 udev 也不是很熟悉,想请教一下有经验的老哥这个要怎么实现
2
wniming OP @Cooky 感谢回复,我并不是不知道哪个设备在哪个接口下,因为在 virt-viewer 里选择 usb 设备时只显示 usb 设备的名称,所以即便知道 usb 设备再那个接口下也无法判断。
|
![]() |
3
oott123 6 小时 0 分钟前
听起来可以给 virt-viewer 做个 filesystem namespace ,再把里面的 sysfs 重新挂载成自己魔改的?
|
![]() |
5
jasonyang9 5 小时 49 分钟前 via Android
udev 就是匹配一些属性然后重命名设备,做过对网口的重命名,匹配的是 mac 地址
|
6
wniming OP @oott123 如果有办法让 virt-viewer 运行在自己魔改的 filesystem namespace 那当然更好,但是我不知道要怎么搞,如果能在自己魔改的 filesystem namespace 里把不想重定向到另外两个 usb 设备都屏蔽掉,那我就可以用更方便的方式给虚拟机重定向 usb 设备了,比如可以用下面的命令:
virt-viewer --connect qemu+ssh://[email protected]/session fedora41 --spice-usbredir-redirect-on-connect="0x03,0x17ef,0x60ee,-1,-1|0x03,0x32c2,0x0012,-1,-1" 这样还能一步到位,都不用点鼠标操作重定向了,但目前因为有 3 个同样的 usb 设备,所以这种通过 vendor:product 的方式是不行的 |
7
wniming OP @julyclyde 我觉得是有关系的,例如:
d@desktop:/sys/bus/usb/devices/usb1/1-10$ cat /sys/devices/pci0000:00/0000:00:14.0/usb1/1-10/1-10:1.2/0003:17EF:60EE.00D5/uevent DRIVER=lenovo HID_ID=0003:000017EF:000060EE HID_NAME=Lenovo TrackPoint Keyboard II HID_PHYS=usb-0000:00:14.0-10/input2 HID_UNIQ= MODALIAS=hid:b0003g0001v000017EFp000060EE d@desktop:/sys/bus/usb/devices/usb1/1-10$ 我觉得 lsusb 就是根据这里的 HID_NAME 来获取到 usb 设备的名称的 |
8
wniming OP @oott123 看了下面这个帖子,感觉 linux 是不支持自己做一个魔改的 sysfs 的,因为内核不支持设备命名空间,任何进程都能看到系统上的所有设备,尽管进程不一定有权限使用设备。
https://discuss.linuxcontainers.org/t/how-to-hide-of-host-root-device-from-container-lsblk/6103 |
![]() |
11
Rorysky 4 小时 21 分钟前
udev 规则了解下
|
![]() |
12
Rorysky 4 小时 19 分钟前
即使是同型号设备,lsusb 看看参数肯定不一样( vendor id prod id 之类)
示例:udevadm info -a -p $(udevadm info -q path -n /dev/sdb1) https://wiki.debian.org/udev |
13
diivL 4 小时 8 分钟前
src/virt-viewer-session-spice.c:859
|
14
diivL 4 小时 3 分钟前 ![]() src/virt-viewer-session-spice.c:859
```c usb_device_widget = spice_usb_device_widget_new(self->session, "%s %s"); ``` spice-gtk/src/usb-backend.c:1438 ```c description = g_strdup_printf(format, manufacturer ? manufacturer : "", product, descriptor, bus, address); ``` |
15
wniming OP @Rorysky #12 你看一下我这个帖子正文里的 lsusb 的输出,有 3 个 usb 设备的 vendor id prod id 是完全一样的:
"ID 2b89:8761 Realtek Bluetooth Radio" |
16
boser1u 3 小时 31 分钟前
换成 3 个牌子吧
|
![]() |
17
adoal 1 小时 59 分钟前
如果你的设备插的 USB 端口固定不变,那 devnum 、devpath 是固定的,可以跟 vid/pid 结合起来判断。
|