Вопрос или проблема
У меня установлена виртуальная машина Mac с использованием QEMU/KVM, и я не могу перенаправить свой телефон на виртуальную ОС.
Постоянно выдает сообщение:
spice-client-error-quark: Не удалось перенаправить ... на 1-13: Устройство используется другим приложением (0)
После некоторого гугления я попробовал sudo fuser /dev/bus/usb/001/013
, чтобы узнать, какие процессы обращаются к этому USB-устройству. Затем я убил два pid, которые появились в доке.
Я проследил один из этих pid и обнаружил, что это gvsfd-gphoto2
. Поэтому я убил все процессы, связанные с gvsf/d. Оба значка, которые раньше были на моем доке из-за подключения телефона, исчезли.
Когда я пытаюсь перенаправить USB-устройство через меню “Виртуальная машина” в Virt-Manager, на этот раз ошибка не появляется, но оно просто не перенаправляет, и моему телефону присваивается новый номер. Это похоже на то, что он отключился, а затем снова подключился.
Как я могу это исправить?
Это невозможно!
Чтобы предотвратить gvsfd.
systemctl --user mask gvfs-daemon.service
systemctl --user stop gvfs-daemon.service
Далее вы увидите модуль apple-mfi-fastcharge
. Затем внесите его в черный список.
Но iPhone сбрасывается сам при повторном подключении к Mac OS.
[ 804.700882] usb 1-2: сброс высокоскоростного USB-устройства номер 46 с помощью xhci_hcd
[ 804.852888] usb 1-2: изменено программное обеспечение устройства
[ 804.853033] usb 1-2: отключение USB, номер устройства 46
[ 804.980778] usb 1-2: новое высокоскоростное USB-устройство номер 47 с помощью xhci_hcd
На этом этапе канал Libusb для гостя поврежден, и iPhone повторно подключается к хост-ОС.
Для подключения iPhone вам нужно купить PCI-USB адаптер и передать PCI гостю.
Я нашел работающее решение для назначения карты USB-контроллера виртуальной машине из Ubuntu 24.04.
xHCI_hcd скомпилирован в ядро, а не как модуль. Поэтому, когда вы вставляете идентификатор USB-контроллера в GRUB_CMDLINE_LINUX_DEFAULT, USB-контроллер все равно будет связываться с xhci_hcd, так как он уже внутри ядра. Чтобы подтвердить, содержит ли ваше ядро xhci_hcd:
modprobe -D xhci_hcd
Если ваш вывод:
builtin xhci_hcd
тогда ваше ядро содержит xhci_hcd.
Итак, вы указываете:
sudo apt-get -y install driverctl
sudo driverctl -v set-override 0000:2d:00.3 vfio-pci
Как только вы выполните эту команду, любое USB-устройство, подключенное к этой USB-картe, больше не будет доступно для Linux (клавиатура, мышь, камера, iPhone и т. д.). По какой-то причине мой MSI B350 PC-Mate (с последним BIOS сентябрь 2024) помещает все мои карты USB-контроллеров вместе с SATA, Ethernet, nVidia GTX 1050 в группу IOMMU 15, а группы IOMMU нельзя разделить. Однако он поместил контроллер USB 3.0 материнской платы MSI отдельно в группу IOMMU 23 (и это USB 3.0 порты, выходящие из I/O-экранки на задней панели компьютера). Так что, проехали. У меня были клавиатура, мышь, приемник контроллера Xbox 360, приемник 3d connexion spacemouse и веб-камеры, подключенные к хабу, вставленному в USB 2 разъемы: они подключены к группе IOMMU 15 и не изменены.
Ответ или решение
USB-редирекция iPhone в Virt-Manager при использовании QEMU/KVM на Mac
Проблема
Вы столкнулись с трудностью при попытке перенаправить USB-устройство (iPhone) в виртуальную машину, работающую на базе QEMU/KVM. Сообщение об ошибке, которое вы получаете:
spice-client-error-quark: Could not redirect ... at 1-13: Device is in use by another application (0)
Это указывает на то, что устройство уже используется другой программой. После попыток завершения процессов и манипуляций, связанных с gvfs
и другими зависимостями, ваше устройство подключается вновь, и ссылка на USB изменяется, как будто оно было отключено.
Решения
-
Остановка и маскировка GVFS (GNOME Virtual File System)
Первым шагом стоит остановить и задействовать маскировку для
gvfs-daemon.service
, который может блокировать доступ к вашему USB-устройству. Это можно сделать с помощью следующих команд:systemctl --user mask gvfs-daemon.service systemctl --user stop gvfs-daemon.service
-
Черный список для модуля
apple-mfi-fastcharge
Если у вас есть подключение устройства через специальный модуль для зарядки Apple, его тоже следует заблокировать. Для этого можете редактировать файл модуля. Добавьте в файл
/etc/modprobe.d/blacklist.conf
следующее:blacklist apple-mfi-fastcharge
-
Использование PCI-USB адаптера для перенаправления
Если предыдущие шаги не помогли, настоятельно рекомендуется рассмотреть возможность использования PCI-USB адаптера. Это позволит передать контроллер USB в виртуальную машину, предоставляя прямой доступ к вашему iPhone.
Для этого выполните следующие шаги:
- Убедитесь, что ваш контроллер USB находится в отдельной IOMMU группе. Используйте команду:
find /sys/kernel/iommu_groups/ -type l
- После идентификации группы получите ID контроллера, например,
0000:2d:00.3
. - Далее, используйте
driverctl
для перенаправления устройства:sudo apt-get -y install driverctl sudo driverctl -v set-override 0000:2d:00.3 vfio-pci
- Убедитесь, что ваш контроллер USB находится в отдельной IOMMU группе. Используйте команду:
-
Проверка компиляции xhci_hcd в ядре
Убедитесь, что модуль
xhci_hcd
встроен в ваше ядро. Используйте следующую команду:modprobe -D xhci_hcd
Если вывод подтверждает, что он встроен (например,
builtin xhci_hcd
), вы можете продолжить с вышеуказанными шагами. -
Перезагрузка и подключение
После выполнения всех упомянутых шагов выполните перезагрузку системы и попробуйте снова подключить iPhone к виртуальной машине через Virt-Manager.
Заключение
Решение проблемы с редирекцией USB для iPhone в виртуальной машине требует многопрофильного подхода, включая корректную настройку служб, блокировку потенциальных конфликтов и в некоторых случаях использование дополнительного оборудования, такого как PCI-USB адаптер. Следуя вышеизложенным шагам, вы сможете предоставить вашему iPhone возможность подключения к виртуальной машине на основе QEMU/KVM.