Дата и время публикации:
Дата и время модификации:
Проблема и решение
1. Суть проблемы
Заключается в пробросе последовательного порта в эмуляторе Qemu, запускаемого в окружении сборочной машины Yocto-poky:
Механизм проброса последовательного порта USB хозяйской машины для пользователя эмулятора Qemu достаточно прозрачен и сводится к программной симуляции микросхемы FTDI FT232BM, которая стала доступной с версии ядра Linux-3.0.
Кроме того, также будет показана возможность перенаправление консоли гостевой операционной системы, запущенной на ВМ эмулятора Qemu, на последовательный порт USB хозяйской машины (Host machine), на которой развернут гипервизор KVM c эмулятором Qemu сборочной машины Yocto-poky .
2. Пути решения
В листинг 2.1 показано объявление программной симуляции эмулятором Qemu устройства последовательного порта USB.
Листинг 2.1. Фрагмент файла IMAGE_BASENAME-MACHINE.qemu.conf
... qb_opt_append = ... -chardev serial,path=/dev/ttyUSB1,id=extusbserial -device usb-serial,chardev=extusbserial ...
Как показано в листинге 2.1, к переменной qb_opt_append, используемую механизмом загрузки эмулятора Qemu Boot (QB) сборочной машины Yocto-poky [3.3], последовательно добавляются опции -chardev и -device . В первой, опции -chardev, указывается путь, path=/dev/ttyUSB2, к последовательному порту USB на хозяйской машине (host machine), на которой запущен гипервизор KVM/Qemu, а во второй, опции -device, — сам механизм проброса usb-serial, и идентификатор chardev=extusbserial, реализуемый с помощью программной симуляции микросхемы FTDI FT232BM
В результате , как показано в дампе 2.2, утилита lsusb должна показать наличие драйвера FTDI FT232BM
Дамп 2.2. Выполнение команды lsusb на гостевой ОС
root@qemuarmv5:~# lsusb Bus 001 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC Bus 001 Device 002: ID 0627:0001 Adomax Technology Co., Ltd Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Далее, проверяем вывод ядра Linux в момент конфигурации, который должен содержать что-то похоже, показанное в дампе 2.3
Дамп 2.3. Фрагмент вывода команды dmesg на гостевой ОС
root@qemuarmv5:~# dmesg | more ... [ 7.696751] ftdi_sio 1-2:1.0: FTDI USB Serial Device converter detected [ 7.701975] usb 1-2: Detected FT232BM [ 7.712988] usb 1-2: FTDI USB Serial Device converter now attached to ttyUSB0 ...
В случае, если ничего подобного не будет найдено предлагаю проверить и при необходимости выполнить процедуру настройки конфигурации ядра в сборочной машины Yocto-poky, которая отличается от той, что описывал для версии Linux-5.0 дистрибутива Debian
Дамп 2.4. Вывода всех доступных устройств последовательных портов
root@qemuarmv5:~# ls -l /dev | grep "ttyA\|ttyS\|ttyU" crw------- 1 root tty 204, 64 Oct 14 09:08 ttyAMA0 crw--w---- 1 root root 204, 65 Oct 14 09:06 ttyAMA1 crw-rw---- 1 root dialout 204, 66 Oct 14 09:06 ttyAMA2 crw-rw---- 1 root dialout 204, 67 Oct 14 09:06 ttyAMA3 crw-rw---- 1 root dialout 188, 0 Oct 14 09:06 ttyUSB0
В качестве бонуса — привожу проброс последовательного порта USB консоли гостевой операционной системы, который дает больше информации чем сама консоль управления эмулятора Qemu и выполняется с использованием двух опций -chardev и -serial, как показано в дампе 2.5
Листинг 2.5 Фрагмент файла IMAGE_BASENAME-MACHINE.qemu.conf
... qb_opt_append = ... -chardev serial,path=/dev/ttyUSB0,id=usbhostserial -serial chardev:usbhostserial ... ...
При запуске Qemu от обычного пользователя (qemu:///session), а не суперпользователя (qemu:///system), может возникнуть ошибка, связанная с правами доступа к специальному файлу устройства /dev/ttyUSB0, как показано в дампе 2.6
Дамп 2.5. Фрагмент вывода ошибки с нарушением прав доступа к ttyUSB0
$ runqemu ... runqemu - ERROR - Failed to run qemu: qemu-system-arm: -chardev serial,path=/dev/ttyUSB0,id=usbhostserial: Could not open '/dev/ttyUSB0': Permission denied runqemu - INFO - subnet: "192.168.7", tap0 runqemu - INFO - Cleaning up Set 'tap0' nonpersistent
На гостевой ОС создал файл правил /etc/udev/rules.d/01-ttyusb.rules и добавил в него следуюшее правило `KERNEL=="ttyUSB[0-9]*", OWNER="user" GROUP="dialup"`.
В Qemu поддерживается возможность перенаправления I/O консоли с использованием сетевых технологий — протокола telnet
Листинг 2.1. Фрагмент файла IMAGE_BASENAME-MACHINE.qemu.conf
... QB_OPT_APPEND += "-chardev socket,id=netserial,host=192.168.7.2,port=32123,server,telnet -serial chardev:netserial" ...
В QEMU, на стороне центрального узла, на котором запущена гостевая ОС, с ip:192.168.7.2 и номером сетевого порта 32123 будет поднят сервер, который устанавливает соединения по протоколу telnet и перенаправляет на него весь ввод/вывод с консоли гостевой ОС. При этом, сначала нужно создать бэкенд абстракции "chardev" с id=netserial на центральном узле, которое будет ожидать подключение клиентов со стороны центрального узла по протоколу telnet, а затем фронтентед, в роли которой вытупает последовательный порт "serial" на гостевой ОС.[3.5]
3. Библиография
3.2 FTDI.Virtual COM Port Drivers
3.3 MetaLayer openembedded-core::qemuboot.bbclass
3.4 Technical Note TN_132 Adding FTDI Devices VCP Driver Support to Android[PDF]
3.5 Is it possible to access -chardev without going via -serial in qemu?