Эмулятор QEMU и работа с USB в гостевой системе

Ситуация: в эмуляторе QEMU требуется работать с USB-устройствами в гостевой (эмулируемой) машине; при этом USB-устройства подключены к хост-машине (т.е. к реальному компьютеру).
Решение: немного чёрной магии, параметр -usb и lsusb спасут отца русской демократии.

Рабочий пример: Windows XP, которая установлена в эмуляторе QEMU, который установлен в Debian GNU/Linux Etch. Для примера затащим в QEMU USB-флешку и будем работать с ней в Windows, которая в QEMU, который в Debian.

Запускаем виртуальную машину QEMU, например, с такими параметрами:

qemu -usb -m 200 -hda mustdiexp.img -boot c -localtime
красным помечен обязательный параметр -usb, т.е. нужно явно указать QEMU, что мы хотим использовать USB. Далее включаем флешку, и в консоли узнаём, куда подключилась наша флешка. В этом нам поможет сначала dmesg, а потом lsusb. При этом dmesg нам скажет адрес устройства, а lsusb - его точный идентификатор.

Как узнать адрес устройства в Linux? Легко - спросим dmesg, и он ответит:

usb 1-6: new high speed USB device using ehci_hcd and address 15
usb 1-6: configuration #1 chosen from 1 choice
scsi9 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 15
usb-storage: waiting for device to settle before scanning
scsi 9:0:0:0: Direct-Access JetFlash TS4GJFV35 8.07 PQ: 0 ANSI: 2
sd 9:0:0:0: [sde] 7987200 512-byte hardware sectors (4089 MB)
sd 9:0:0:0: [sde] Write Protect is off
sd 9:0:0:0: [sde] Mode Sense: 03 00 00 00
sd 9:0:0:0: [sde] Assuming drive cache: write through
sd 9:0:0:0: [sde] 7987200 512-byte hardware sectors (4089 MB)
sd 9:0:0:0: [sde] Write Protect is off
sd 9:0:0:0: [sde] Mode Sense: 03 00 00 00
sd 9:0:0:0: [sde] Assuming drive cache: write through
sde: sde1
sd 9:0:0:0: [sde] Attached SCSI removable disk
sd 9:0:0:0: Attached scsi generic sg4 type 0
usb-storage: device scan complete
Красным я подсветил искомое - адрес нашего устройства 15. Теперь интересуемся у lsusb насчёт идентификатора устройства, и он нам всё выдаст:
penta4@penta4rce:~$ lsusb
Bus 005 Device 005: ID 046d:c03e Logitech, Inc. Premium Optical Wheel Mouse
Bus 005 Device 003: ID 046e:5500 Behavior Tech. Computer Corp.
Bus 005 Device 001: ID 0000:0000
Bus 004 Device 004: ID 03f0:1204 Hewlett-Packard DeskJet 930c
Bus 004 Device 001: ID 0000:0000
Bus 003 Device 001: ID 0000:0000
Bus 002 Device 001: ID 0000:0000
Bus 001 Device 015: ID 058f:6387 Alcor Micro Corp.
Bus 001 Device 014: ID 04fc:0c15 Sunplus Technology Co., Ltd
Bus 001 Device 001: ID 0000:0000
Готово: идентификатор нашего устройства 15 есть 058f:6387 С этими данными идём в эмулятор QEMU, заходим в гостевую систему, нажимаем CTRL+ALT+2 и попадаем в консольный режим QEMU. Там мы пишем:
usb_add host:058f:6387
Если QEMU пишет, что не может добавить ваше устройство, а вы уверены, что всё сделано правильно - проверьте права на файл-устройство, оно должно быть с полными (777) правами. В консоли, откуда запущен QEMU, увидите:
/proc/bus/usb/001/015: Permission denied
Стало быть, идём и делаем так:
penta4rce:/proc/bus/usb# chmod -R 777 001/
Не очень изящно, зато работает :-) Можно ещё править udev.rules, но мне под вечер с этим было откровенно лень заниматься.

После этого Windows (или что вы там эмулируете) радостно найдёт ваше устройство (в данном случае флешку) и будет злостно грузить процессор в мучительных раздумьях "что же это было!?" В случае с Windows XP виртуальным диском оно шуршать будет порядочно - по всей видимости, для этого чуда редмонтовской мысли это нормально. После этого работаете с устройством как обычно.

Ссылки
Пост был написан, когда мне пришлось снова вспоминать, как я врубал USB в годы моей ударной молодости :-) Дабы не гуглить, вот несколько интересных ссылок по теме "USB в QEMU", особенно на замечательную Книгу Слаки (Slackbook).

11 комментариев: |высказаться!| RSS-лента дискуссии.|
e-yes комментирует...

К сожалению, не всё так гладко, в случае c сложными "составными" устройствами типа HID + камера etc. qemu просто отказывается с ними работать и "мативирует" пользователя на :/

Tigro комментирует...

Слушай, а есть возможность в Qemu попасть в тектовую Линуксовую консоль? А то Ctrl-Alt деают своё нехорошее дело...

virens комментирует...

2 e-yes пишет...

К сожалению, не всё так гладко, в случае c сложными "составными" устройствами типа HID + камера etc
У меня таких нет, не пробовал. Моя камера, которая умеет перекачивать фотографии только виндовым софтом, в QEMU работает.

qemu просто отказывается с ними работать и "мативирует" пользователя на :/
Можно пнуть разработчика, что-то он давно свежих сборок не выкладывал.

2 Tigro пишет...
Слушай, а есть возможность в Qemu попасть в тектовую Линуксовую консоль?
Есть. Переходим в режим монитора QEMU (ctrl+alt+2) и там пишем:

sendkey ctrl-alt-f2

Должно перевести гостевую систему в консоль.

Minoru комментирует...

но мне под вечер с этим было откровенно лень заниматься.
Чего-то я в этой фразе недопонял... То ли уважаемый virens банально ошибся при облачении мыслей в слова, то ли после слова заниматься пропущено слово, указывающее, чем именно было "откровенно лень заниматься с этим" :)
Ну а в общем - неплохая статья, у меня даже появилось желание поколупать этот самый qemu (юзаю virtualbox и пока что особого горя не знаю).

virens комментирует...

2 Programmaster пишет...

Можно всё сделать через udev.rules - и вот с этим разбираться было конкретно лень.

желание поколупать этот самый qemu (юзаю virtualbox и пока что особого горя не знаю).
К virtualbox у меня есть несколько претензий, по этому я использую QEMU. В частности, меня не устраивает нечастые, но обидные зависания VBOX2.0 и убогий консольный интерфейс.

QEMU удобен, когда надо быстро поднимать виртуальные машины.

Анонимный комментирует...

2 virens:
>У меня таких нет, не пробовал. Моя камера, которая умеет перекачивать фотографии только виндовым софтом, в QEMU работает.

Возможно, не камера, а usb phone (с точки зрения ядра - yealink который), т.к совмещает клавиатуру (точнее, HID) и usb-audio.
Но не суть. В целом, qemu - вещь.

>Можно пнуть разработчика, что-то он давно свежих сборок не выкладывал.
У меня версия из cvs в /usr/local имеется:)


>QEMU удобен, когда надо быстро поднимать виртуальные машины.
Ага:)
e-yes@phen ~ $ qemu -usb -m 512 -cdrom distr/iso/security/<TAB>
26feb08russix.iso knoppix-std-0.1.iso
anonymos-shmoo.iso knoppix-std-0.1.iso.torrent
AOC_Labrat-ALPHA-0010.iso knoppix-std-0.1.md5
arudius-0.5.iso monowall-cdrom-1.3b5.iso
auditor-250405-01.iso mpentoo/
auditor-250405-01.iso.torrent navynos-2005.01.iso
BACKTRACK3_VMWare.rar nst/
bt2final.iso nst-1.5.0.iso.gz
bt3b141207.iso oliveBSD.iso
bt3b141207.rar Operator.iso
bt3b141207.rar.torrent ophrack/
bt3-final.iso oswa-assistant.iso
bt3final_usb.iso phlak-0.3.iso
cqureap/ plac-2.9.5.iso
deftv3x.iso planb-1.0.iso.tar.bz2
DVL_Strychnine_E605_1_4.iso Protech-ONE-x86.iso
emergency-cd-2.01.iso roo-1.4.hw-20080424215740.iso
fire-0.4a.iso roo-1.4.hw-20080424215740.iso.sums
grml/ samurai.iso
h9l-3.1.2-aur1.iso snarl-1.13.iso
Helix_V1.9-07-13a-2007.iso stagosfse.iso
Helix_V1.9-07-13a-2007.iso.torrent systemrescuecd-x86-1.0.3.iso
hex-i386-1.0.3.iso talos_beta-0.1.iso
INSERT-1.3.9b_en.iso tpm-security-server-1.2.1.iso
INSERT-1.3.9b_en.iso.md5 ubuntutrinux-test-0.tbz
knoppix_nsm-1.2.iso WarLinux-0.5cd.iso
e-yes@phen ~ $ qemu -usb -m 512 -cdrom distr/iso/security/bt3-final.iso

Удобно, вирт. машину создавать не надо:)

Unknown комментирует...

Михаил, а не могли вы описать свои ощущения от Sleeptracker сейчас, после длительного срока использования? Используете ли по-прежнему, все ли так же хорошо?

Просто задумываюсь об их приобретении и хотелось бы узнать о них побольше.

virens комментирует...

2 e-yes пишет...
Возможно, не камера, а usb phone
В общем, те устройства, что у меня есть, я могу затащить в QEMU без особых проблем.

В целом, qemu - вещь.
Так кто ж спорит :-) Фабрис Беллард - это сила! :-)

>QEMU удобен, когда надо быстро поднимать виртуальные машины.
Ага:)

Я именно об этом примере. За это мы QEMU и любим :-)

2 antalar пишет...
Михаил, а не могли вы описать свои ощущения от Sleeptracker сейчас, после длительного срока использования?
Ощущения в общем те же, использую каждый день как наручные часы. Просыпаться утром уже по ходу привык, очень много успеваю сделать до прихода на работу.

Анонимный комментирует...

Мне в свое время подсказали способ попроще:
1. Флешку отмонтировать в линуксе
2. в консоли qemu набрать info usbhost
3. выдаст наподобие
Device 1.2, speed 480 Mb/s
Class 00: USB device 1234:5678, USB DISK
4. дальше как обычно
usb_add host:1234:5678

Анонимный комментирует...

А с обратной ситуацией (хост-система - винды, внутри виртуальной машины - линух) реально?
info usbhost выдает "qemu usb host devices not supported" - значит, под виндой вообще ничего не сделать?

dzen Tiur комментирует...

что-то у меня XP не спешит находить ни флеш, ни второй

Отправить комментарий

Подписаться на RSS-ленту комментариев к этому посту.