9/22/2008

Эмулятор 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 комментариев:

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

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

    ОтветитьУдалить
  3. 2 e-yes пишет...

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

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

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

    sendkey ctrl-alt-f2

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

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

    ОтветитьУдалить
  5. 2 Programmaster пишет...

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

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

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

    ОтветитьУдалить
  6. 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

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

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

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

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

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

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

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

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

    ОтветитьУдалить
  9. Мне в свое время подсказали способ попроще:
    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

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

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

    ОтветитьУдалить