Virt-Manager и перенаправление USB iPhone

Вопрос или проблема

У меня установлена виртуальная машина 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 изменяется, как будто оно было отключено.

Решения

  1. Остановка и маскировка GVFS (GNOME Virtual File System)

    Первым шагом стоит остановить и задействовать маскировку для gvfs-daemon.service, который может блокировать доступ к вашему USB-устройству. Это можно сделать с помощью следующих команд:

    systemctl --user mask gvfs-daemon.service
    systemctl --user stop gvfs-daemon.service
  2. Черный список для модуля apple-mfi-fastcharge

    Если у вас есть подключение устройства через специальный модуль для зарядки Apple, его тоже следует заблокировать. Для этого можете редактировать файл модуля. Добавьте в файл /etc/modprobe.d/blacklist.conf следующее:

    blacklist apple-mfi-fastcharge
  3. Использование 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
  4. Проверка компиляции xhci_hcd в ядре

    Убедитесь, что модуль xhci_hcd встроен в ваше ядро. Используйте следующую команду:

    modprobe -D xhci_hcd

    Если вывод подтверждает, что он встроен (например, builtin xhci_hcd), вы можете продолжить с вышеуказанными шагами.

  5. Перезагрузка и подключение

    После выполнения всех упомянутых шагов выполните перезагрузку системы и попробуйте снова подключить iPhone к виртуальной машине через Virt-Manager.

Заключение

Решение проблемы с редирекцией USB для iPhone в виртуальной машине требует многопрофильного подхода, включая корректную настройку служб, блокировку потенциальных конфликтов и в некоторых случаях использование дополнительного оборудования, такого как PCI-USB адаптер. Следуя вышеизложенным шагам, вы сможете предоставить вашему iPhone возможность подключения к виртуальной машине на основе QEMU/KVM.

Оцените материал
Добавить комментарий

Капча загружается...