- Проброс нескольких устройств USB в виртуальную машину libvirt QEMU подробная инструкция
- Проброс USB Host → Guest: описание проблемы
- Точно понимаю, что нужно!
- Начинаем реализовывать план!
- Проброс USB устройства внутрь гостевой OS используя KVM
- Шаг 1: Создание USB-файла соответствия
- Шаг 2: Изменение конфигурации гостевой операционной системы
- Шаг 3: Подключение USB-устройства
- Шаг 4: Запуск гостевой операционной системы
- Находим на какой шине находится устройство USB
- Используя команду lsusb
- Создаем конфиг для устройства следующего плана с учетом данных полученных ранее
- Конфигурация
- Подключаем к VPS
- Подготовка
- Подключение USB устройства
- Неудачное решение: Linux kvm проброс usb
- Видео:
- QEMU/KVM — Virt-Manager | Folder sharing and USB Redirection
Проброс нескольких устройств USB в виртуальную машину libvirt QEMU подробная инструкция
Если вы работаете в операционной системе Kubuntu и вам нужно пробросить несколько устройств USB в виртуальную машину, то эта инструкция для вас. Мы расскажем, как использовать терминал для этой задачи — это простой и эффективный способ.
Далее находим нужный номер шины и запоминаем его. Теперь, когда у нас есть нужная информация, мы можем пробросить устройства внутрь виртуальной машины.
К сожалению, в libvirt не предусмотрено простого способа для этого, поэтому мы должны использовать немного «костылей». Вместо того, чтобы делать это через графический интерфейс virt-manager или в файле конфигурации XML, мы воспользуемся командой qemu-kvm.
Проброс USB Host → Guest: описание проблемы
Если у вас возникла необходимость пробросить флэшку или другое реальное устройство USB с вашего хост-сервера в гостевую виртуальную машину Kubuntu, используя libvirt+QEMU, но вы не знаете, как это сделать, то вам стоит прочитать этот раздел.
Конкретно, мне было нужно пробросить флэшку из основной машины (host) в виртуальную (guest) Kubuntu.
Я начал искать информацию в интернете и сразу заметил, что многие люди столкнулись с такими же проблемами, как и я. Есть несколько способов решить эту проблему, и я рассмотрел их все. Однако, я не понимаю на 100% каждый метод, и поэтому мечтаю о простом и понятном решении для меня. Я не хочу возвращаться назад и пытаться использовать qemu-kvm вместо QEMU. Именно поэтому я решил остановиться на варианте, который использует virt-manager.
Сейчас я расскажу вам о простом решении для проброса USB-ключей в виртуальной машине Kubuntu, используя libvirt+QEMU с помощью virt-manager.
Точно понимаю, что нужно!
Что именно нужно сделать, чтобы получить доступ к USB-устройствам внутри виртуалки:
- Настроить конфигурацию QEMU для использования проброса USB.
- Поместить виртуалку в dumpxml, посмотреть какая-либо информацию о назначенном (assigned) USB-устройстве.
- Создать скрипт, который будет ресетить шину USB для этой виртуалки.
- Проверить этот скрипт.
- Пробросить флэшку в гостевую машину.
- Проверить, что флэшка появилась в гостевой машине.
Начинаем реализовывать план!
Что же нужно сделать?
1. Воспользуйтесь командой «lsusb» в терминале для того, чтобы увидеть список доступных USB-устройств:
lsusb
2. Выполните следующую команду:
grep cmdline /proc/*/cmdline
Она позволяет получить список запущенных машин KVM.
3. Найдите в этом списке виртуальную машину (guest), в которую вы хотите пробросить USB-устройство.
4. Запустите приведенную ниже команду, чтобы посмотреть конфиг виртуальной машины:
virsh dumpxml <название>
Где <название> — это имя вашей виртуальной машины.
5. После выполнения этой команды найдите нужный вам USB-контроллер. Он будет выглядеть следующим образом:
<controller type='usb' index='0' model='ich9-ehci1' ports='6'>
6. Запишите <controller>:
virt-manager -c qemu:///system
7. В открывшемся окне выберите вашу гостевую машину и нажмите правой кнопкой мыши на ее названии.
8. В контекстом меню выберите «Показать XML-дамп…» и откройте файл, созданный ранее командой «dumpxml».
9. Найдите внутри файла <controller>, находящийся внутри <devices>, и запишите его:
<address type='pci' domain='0x0000' bus='0x00' slot='0x1d' function='0x7'/>
10. Закройте оба окна.
11. Создайте новый текстовый файл и назовите его «reset_usb.sh».
12. Вставьте в него следующий код:
<code> #!/bin/bash HUBBUS=<bus> # Сюда вставьте <address> из шага 9. echo "Нахожу все детишки контроллера HUBBUS=$HUBBUS" for child in $( ls /sys/bus/pci/devices/$HUBBUS/usb* ); do if [ ! -z "$(ls -A $child 2>/dev/null)" ]; then echo "Делал здесь:$child" echo -n "$child" > /sys/bus/pci/drivers/xhci_hcd/unbind echo -n "$child" > /sys/bus/pci/drivers/xhci_hcd/bind fi done echo "Готово!" </code>
13. Сохраните файл и закройте его.
14. Дайте разрешение на выполнение для скрипта:
chmod +x reset_usb.sh
15. Перейдите к настройкам виртуальной машины:
virt-manager
16. В контекстном меню выберите «Показать детали» и перейдите на вкладку «Детали».
17. Найдите раздел «USB». Поставьте галочку на «Подключен к гостевой ОС».
18. Внизу слева нажмите «Добавить новое USB-устройство».
19. В появившемся окне выберите «Устройство, находящееся на хосте» и нажмите «Далее».
20. Выберите вашу флэшку и нажмите «Далее».
21. Нажмите «Применить».
22. Подтвердите изменения и закройте окно.
23. Вернитесь к настройкам гостевой машины.
24. Запустите гостевую машину.
25. Вставьте флэшку в ваш компьютер.
26. Убедитесь, что флэшка появилась на гостевой машине.
Теперь у вас есть решение проблемы проброса USB Host → Guest в виртуальной машине QEMU-KVM с использованием libvirt+QEMU и virt-manager.
Проброс USB устройства внутрь гостевой OS используя KVM
Если вы используете виртуальную машину на VPS с KVM-виртуализацией и хотите пробросить USB устройство внутрь гостевой операционной системы, это руководство поможет вам сделать это подробно и точно.
Для начала, убедитесь, что у вас есть права доступа к хосту и доступ к консоли.
Шаг 1: Создание USB-файла соответствия
Сначала создайте файл usb-mapping.xml, в котором будет содержаться информация о USB-устройствах, которые вы хотите пробросить в гостевую операционную систему. В этом файле вы должны указать идентификаторы Vendor ID и Product ID для каждого устройства. Для этого используйте команду:
lsusb
Выполните эту команду на хостовой машине и найдите USB-устройство, которое вы хотите пробросить. Запишите значения Vendor ID и Product ID. Например, вы можете увидеть строку, которая выглядит так:
Bus 001 Device 006: ID 1234:5678 Vendor Name
В этом случае, Vendor ID равен 1234, а Product ID равен 5678. Запишите значения, они понадобятся вам позже.
Теперь создайте файл usb-mapping.xml с помощью следующей команды:
sudo touch /etc/libvirt/usb-mapping.xml
Откройте файл usb-mapping.xml в текстовом редакторе и добавьте следующую информацию:
<hostdev mode='subsystem' type='usb'>
<source>
<vendor id='Vendor_ID' />
<product id='Product_ID' />
</source>
</hostdev>
Замените Vendor_ID и Product_ID на значения, которые вы записали ранее.
Сохраните файл usb-mapping.xml.
Шаг 2: Изменение конфигурации гостевой операционной системы
Создайте резервную копию конфигурационного файла гостевой операционной системы с помощью команды:
sudo virsh dumpxml <guest> > backup.xml
Замените <guest> на имя вашей гостевой операционной системы.
Откройте резервную копию конфигурационного файла в текстовом редакторе и добавьте следующую информацию:
<hostdev mode='subsystem' type='usb'>
<source>
<vendor id='Vendor_ID' />
<product id='Product_ID' />
</source>
<address type='usb' bus='0' device='0' />
</hostdev>
Здесь также замените Vendor_ID и Product_ID на значения, которые вы записали ранее.
Сохраните изменения в файле.
Шаг 3: Подключение USB-устройства
Теперь вам нужно выполнить несколько команд, чтобы пробросить USB-устройство в гостевую операционную систему.
Сначала выполните команду:
sudo lsusb | grep 'Vendor Name'
Это позволит вам убедиться, что USB-устройство подключено к хостовой машине и распознано.
Затем выполните команду:
sudo qemu-system-x86_64 -nodefaults -nographic -machine accel=kvm -usb -usbdevice host:Vendor_ID:Product_ID
Замените Vendor_ID и Product_ID на значения, которые вы записали ранее.
USB-устройство должно быть подключено к гостевой операционной системе.
Шаг 4: Запуск гостевой операционной системы
Теперь вы можете запустить гостевую операционную систему с помощью virt-manager или другой программы управления виртуализацией.
Убедитесь, что гостевая операционная система видит проброшенное USB-устройство, используя команду:
lsusb
Вы должны увидеть ваше USB-устройство в списке.
Вот и все! Теперь вы можете использовать USB-устройство внутри гостевой операционной системы, используя KVM и проброшенный USB.
Находим на какой шине находится устройство USB
Прежде чем пробросить устройство USB в виртуальную машину, необходимо определить на какой шине оно находится. Для этого можно использовать команду lsusb
в терминале.
Запустите терминал на хост-системе, на которой у вас уже есть виртуальная машина libvirt+QEMU. Если у вас нет графической оболочки на сервере, можно управлять виртуалками через virsh
, virt-manager
или использовать любую другую команду, поддерживающую libvirt библиотеку.
Также убедитесь, что устройство (например, флешка или usb-ключ) уже вставлено в USB-порт вашего компьютера.
Используя команду lsusb
$ lsusb
Bus 001 Device 002: ID 8087:8000 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 003: ID 045e:00cb Microsoft Corp.
Bus 003 Device 002: ID 8087:07d6 Intel Corp.
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Вам нужно будет найти конкретное устройство USB, которое вы хотите пробросить в виртуальную машину. Обратите внимание на номер шины, где находится это устройство (например, Bus 003).
Примечание: Если у вас появлялись проблемы с пробросом USB в виртуальную машину, возможно, вам придется установить дополнительные пакеты на хост-систему, чтобы исправить это. В зависимости от вашей операционной системы и используемого продукта, может потребоваться установка пакетов, таких как libvirt-daemon-driver-qemu
или virt-manager
. Обратитесь к официальной документации вашей ОС и продукта для получения более подробной информации.
Создаем конфиг для устройства следующего плана с учетом данных полученных ранее
Окончательное решение проблемы проброса нескольких устройств USB в виртуальную машину на базе libvirt+QEMU может занять некоторое время. В общем, это не так просто, как просто запустить VPS на Linux-хосте. Но неудачное решение этой задачи может вызвать проблемы в будущем. Хочешь работало, как реальный рулить, но внутрь гостевой OS элементарно вставлена флэшку стала делать это файлом (файл можно подмонтировать например с помощью библиотеки vboxsf) к kvm (например VPS на основе DirectAdmin). Это решение хорошо, но есть некоторые недостатки. Метода 2, но он хорошо работает только если на хосте запущенная виртуальная машина, в которой мы хотим пробросить USB-ключей. Запустите команду grep Bus /tmp/lsusb на хосте (в машине где запущена виртуальная машина) и на госте в консоли точно такую же команду. Номер hub/bus изменится в зависимости от количества пробросов на хосте. Вместо X всегда будет номер USB-концентратора, к которому в шине USB-устройств мы собираемся подключить гостевую ОС. Попробуем разобраться с этой проблемой вручную.
Конфигурация
Для проброса нескольких устройств USB в гостевую виртуальную машину с использованием метода простого проброса, следует использовать следующий ряд действий:
- Подключиться к хосту через терминал.
- Установить пакет qemu-kvm, который позволит управлять виртуальными машинами.
- Найти номер шины USB хоста, на которой находятся нужные устройства. Для этого выполните команду
lsusb
. - Запустить виртуальную машину и добавить пробросы устройств в ее конфигурацию. Для этого выполните команду
virsh edit [имя_виртуальной_машины]
. - В окне редактирования конфигурации найдите элемент
<devices>
, внутри которого будет описание устройств. - Добавьте следующий код для каждого пробрасываемого устройства:
<hostdev mode='subsystem' type='usb' managed='yes'> <source> <vendor id='0x[идентификатор_производителя]' /> <product id='0x[идентификатор_продукта]' /> <address bus='[номер_шины]' device='[номер_устройства]' function='0x0' /> </source> </hostdev>
Замените [идентификатор_производителя]
, [идентификатор_продукта]
, [номер_шины]
и [номер_устройства]
на соответствующие значения для каждого устройства.
После внесения изменений сохраните и закройте файл конфигурации.
Для добавления продукта HUBBUS в гостевую виртуальную машину, используйте следующую команду:
qemu-kvm -m 1024 -hda [путь_к_файлу_с_виртуальной_машиной] -usbdevice host:2.0:[идентификатор_производителя]:[идентификатор_продукта]
Замените [путь_к_файлу_с_виртуальной_машиной]
, [идентификатор_производителя]
и [идентификатор_продукта]
на соответствующие значения.
Теперь у вас есть подробное описание метода проброса нескольких устройств USB в виртуальную машину с использованием библиотеки libvirt+QEMU.
Подключаем к VPS
В данном разделе мы рассмотрим, как подключить устройства USB к виртуальной машине на основе libvirt+QEMU с использованием virt-manager-а.
Подготовка
Перед тем, как приступить к подключению USB устройств к виртуалке, убедитесь, что у вас есть следующее:
- Виртуальная машина на основе libvirt+QEMU, созданная с использованием virt-manager-а;
- Устройства USB, которые вы хотите пробросить в гостевой системе;
- Сервер, на который вы подключаетесь, и на котором установлена QEMU/KVM и libvirt;
- У вас есть доступ к терминалу на сервере;
- Вы можете использовать скрипт VBoxManage для управления вашей виртуальной машиной.
Подключение USB устройства
1. Во-первых, вам нужно найти номер шины USB, на которой находится ваше устройство. Запустите в терминале команду lsusb, чтобы узнать список подключенных устройств USB на вашем сервере. Обратите внимание на нужное вам устройство и запишите его номер шины.
2. Откройте файл конфигурации вашей виртуальной машины (обычно он находится в каталоге /etc/libvirt/qemu/) на сервере с помощью текстового редактора. Найдите строку, которая начинается с <domain (обычно она находится в самом начале файла) и добавьте следующее:
<hostdev mode='subsystem' type='usb' managed='yes'>
<source>
<address bus='номер шины' device='номер устройства' />
</source>
</hostdev>
Замените ‘номер шины’ и ‘номер устройства’ на соответствующие значения, которые вы получили из команды lsusb. Номер шины должен быть указан без точек, например, если ваше устройство находится на шине 3-1.1, то номер шины будет 3-1.1.
3. Сохраните файл конфигурации и закройте редактор.
4. Зайдите в virt-manager и выберите вашу виртуальную машину. Перейдите на вкладку «Устройства» и нажмите кнопку «Добавить новое оборудование».
5. В открывшемся окне выберите «Подключаемое устройство», затем «Виртуальный хост-адаптер USB». Нажмите «Применить» и закройте окно.
6. Теперь вы должны увидеть ваше USB устройство в списке устройств виртуальной машины. Отметьте его галочкой, чтобы пробросить его в гостевую систему.
7. Запустите виртуальную машину и проверьте, работает ли ваше USB устройство в гостевой системе. Если все сделано правильно, устройство должно быть доступно внутри виртуальной машины.
Важно: если у вас возникли проблемы с пробросом, убедитесь, что у вас правильно настроены параметры вашей виртуальной машины, включая права доступа и разрешения для устройств USB.
Это окончательное описание процесса проброса USB устройства в виртуальную машину с использованием libvirt+QEMU и virt-manager-а. Если у вас возникнут трудности или вопросы, не стесняйтесь обращаться за дополнительной помощью.
Неудачное решение: Linux kvm проброс usb
Если ты используешь QEMU/KVM вместе с библиотекой libvirt для создания виртуальных машин и у тебя есть несколько устройств USB, которые требуется пробросить внутрь виртуальной машины, то в этом разделе я расскажу о неудачном решении, которое можно использовать для этой задачи.
Во-первых, я хочу отметить, что это решение не является лучшим способом, и его использование может вызвать некоторые проблемы. Оно было опробовано на моей системе, состоящей из хоста на базе Kubuntu 20.04 и виртуальной машины, работающей под управлением Ubuntu 20.04.
Если у тебя есть флэшка или любое другое USB-устройство, которое ты хочешь пробросить внутрь виртуальной машины, то ты можешь использовать следующий метод.
Для начала, убедись, что флэшка или другое устройство подключено к хосту.
Затем воспользуйся следующей командой в терминале хоста:
qemu-dumpxml vmname > vm.xml
где vmname
— имя твоей виртуальной машины, а vm.xml
— имя файла, в котором будет сохранена конфигурация виртуальной машины.
Далее, используй команду:
grep -i usb vm.xml
Эта команда выведет все полученные данные о USB-устройствах, которые находятся внутри виртуальной машины.
Для того чтобы пробросить флэшку или другое устройство, нужно внести некоторые изменения в конфигурационный файл виртуальной машины.
Открой файл конфигурации виртуальной машины с помощью текстового редактора и найди секцию, относящуюся к USB-устройствам.
Найди следующую строку:
<hostdev mode='subsystem' type='usb'>
И добавь ниже следующий блок кода:
<source><vendor id='0xXXXX'/><product id='0xXXXX'/></source>
где 0xXXXX
— ID устройства, который ты получил ранее при выполнении команды grep
.
После внесения изменений сохраните файл конфигурации и закройте его.
Теперь ты можешь запустить виртуальную машину с обновленным файлом конфигурации, и флэшка или другое устройство должно быть успешно проброшено внутрь.
Однако, хочу отметить, что это решение не является надежным и может вызывать различные проблемы. Поэтому, если у тебя есть возможность использовать другой подход, я рекомендую попробовать его вместо этого метода. Но если тебе необходимо настроить проброс USB-ключей, возможно, этот метод будет для тебя полезным.
Видео:
QEMU/KVM — Virt-Manager | Folder sharing and USB Redirection
QEMU/KVM — Virt-Manager | Folder sharing and USB Redirection by Ton Does Linux and More! 26,652 views 3 years ago 8 minutes, 6 seconds