Получить информацию о последовательном порте libvirt домена?

Несколько примечаний из статьи GLX Wikipedia:

GLX [является] расширением X-протокола, который позволяет клиенту (приложение OpenGL) отправлять 3D команды рендеринга на X-сервер (программное обеспечение, ответственное за дисплей). Программное обеспечение клиента и сервера может работать на различных компьютерах.

и

Если клиент и сервер работает на том же компьютере, и ускоренная 3D видеокарта с помощью подходящего драйвера доступна, бывшие два компонента могут быть обойдены DRI. В этом случае клиентскому приложению затем позволяют непосредственно получить доступ к видеооборудованию через несколько уровней API.

Я полагаю, что точка кулака отвечает на Ваш вопрос о том, возможно ли это или нет: это должно, конечно, быть возможно. Второе может дать объяснение того, почему Ваша клиентская программа настаивает на том, чтобы использовать функции своего локального X-сервера (драйвер NV GLX) - возможно, это думает это localhost:10.0 тот же компьютер и так делал попытку соединения направления.

Вещи попробовать:

  1. Вместо gazebo, попробовать glxdemo.
  2. Если возможно, получите эти два компьютера в той же сети и выньте ssh из изображения
  3. Большая пушка: strace Ваш gazebo вызов и фигура, почему это загружает nv-glx

Удачи!

5
06.07.2014, 11:43
1 ответ

KVM - это API ядра для виртуализации. Он не работает с последовательными портами . qemu - это эмулятор машины (ПК и др.), Который может использовать kvm для повышения производительности виртуализации. Он может эмулировать стандартный последовательный порт 8250 UART ( isa-serial ) или паравиртуализированный последовательный порт ( virtio-serial ).

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

Для последовательных портов вы обычно сопоставляете их с тем, что qemu вызывает chardevs .

Существует множество возможных вариантов, обычно все, что может отправлять и получать байты, например каналы, сокеты, файловые дескрипторы, псевдотерминалы.

Например, если вы запускаете qemu как:

qemu ... -device isa-serial,chardev=c,id=s -chardev pty,id=c 

qemu выделяет псевдотерминал, сообщает, что на stdout при запуске:

char device redirected to /dev/pts/18 (label c)

и сопоставляет его с новым последовательным портом isa , добавленным к виртуальной машине. . При загрузке виртуальной машины Linux вы увидите в журналах ее ядра:

[    3.636092] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
[    3.658666] 00:05: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A

И если вы напишете что-то в / dev / ttyS0 в гостевой системе, вы сможете прочитать это на / dev / pts / 18 на хосте.

После запуска виртуальной машины qemu вы можете управлять ею с помощью интерфейсов, которые qemu вызывает monitor . Существует два типа интерфейсов монитора :

  • Человек-монитор: оболочка CLI
  • Машинный монитор: более дружественный к машине интерфейс, реализующий текстовый (json) протокол, называемый машинным протоколом qemu (QMP) .

Если вы ничего не укажете и используете консоль SDL по умолчанию, вы получите человеческий монитор в консоли SDL, нажав Ctrl + Alt + 2 .

Но вы также можете указать для этого любой chardev бэкэнд (pty, socket, stdio ...). Обычно я использую там stdio :

qemu ... -monitor stdio

Чтобы получить монитор на терминале, я запускаю qemu при запуске qemu для тестов.

В интерфейсе монитора вы можете запустить команду info qtree , чтобы получить информацию об устройствах вашего компьютера:

(qemu) info qtree
bus: main-system-bus
[...]
  dev: i440FX-pcihost, id ""
[...]
bus: pci.0
[...]
  dev: PIIX3, id ""
    class ISA bridge, addr 00:01.0, pci id 8086:7000 (sub 1af4:1100)
    bus: isa.0
      type ISA
      dev: isa-serial, id "s"
    index = 0 (0)
    iobase = 1016 (0x3f8)
    irq = 4 (0x4)
    chardev = "c"

Выше вы видите isa- устройство serial , которое я создал ранее, и которое соответствует "c" chardev .

Вы можете получить информацию из этого chardev, используя info chardev :

(qemu) info chardev
parallel0: filename=vc
c: filename=pty:/dev/pts/18
compat_monitor0: filename=stdio

Вы видите, что c отображается на / dev / pts / 18 pty ].

Вы можете получить ту же информацию программно с помощью монитора QMP.Если вы запустите свою виртуальную машину с помощью -qmp stdio , вы можете передать туда команды:

{"execute":"qmp_capabilities"} # enable commands
{"return": {}}   # return value

{"execute":"qom-list","arguments":{"path":"/machine/peripheral/s"}}
{"return": [{"name": "parent_bus", "type": "link<bus>"}, {"name": "wakeup", "type": "uint32"}, {"name": "chardev", "type": "str"}, {"name": "irq", "type": "uint32"}, {"name": "iobase", "type": "uint32"}, {"name": "index", "type": "uint32"}, {"name": "hotpluggable", "type": "bool"}, {"name": "realized", "type": "bool"}, {"name": "type", "type": "string"}]}

# query chardev for "s":
{"execute":"qom-get","arguments":{"path":"/machine/peripheral/s","property":"chardev"}}
{"return": "c"}

# query chardevs:
{"execute":"query-chardev"}
{"return": [{"filename": "vc", "label": "parallel0"}, {"filename": "pty:/dev/pts/18", "label": "c"}, {"filename": "stdio", "label": "compat_monitor0"}]}

(посмотрите, как эти qom-list и qom-get ( qom, обозначающее объектную модель qemu) напоминают выполнение ls и cat в / sys на машине Linux).

Теперь ваш вопрос предполагает, что вы не вызываете qemu напрямую вручную, а вместо этого используете libvirt . libvirt - одна из многих инфраструктур управления виртуализацией. Он может управлять виртуальными машинами qemu (с kvm или без), xen или virtualbox (по крайней мере).

Для виртуальных машин qemu, когда вы определяете виртуальную машину в libvirt (с помощью virt-manager или др.), Это преобразуется в аргументы, передаваемые команде qemu, а libvirt обычно использует монитор qmp для управления виртуальной машиной после ее завершения. было начато.

Для домена libvirt вы можете получить текущую конфигурацию домена с помощью:

virsh dumpxml the-domain

Которая выгружает конфигурацию как XML. Вы можете извлечь из него информацию, используя xmllint или xmlstarlet или любое решение для синтаксического анализа XML по вашему выбору.

$ virsh dumpxml domain | xmllint --xpath '//serial' -
<serial type="pty">
  <source path="/dev/pts/4"/>
  <target port="0"/>
  <alias name="serial0"/>
</serial><serial type="pty">
  <source path="/dev/pts/5"/>
  <target port="1"/>
  <alias name="serial1"/>
</serial><serial type="pty">
  <source path="/dev/pts/6"/>
  <target port="2"/>
  <alias name="serial2"/>
</serial>
$ virsh dumpxml domain |
  xmllint --xpath 'string(//serial[target/@port=0]/source/@path)' -
/dev/pts/4

Эквивалентные с xmlstarlet :

sudo virsh dumpxml domain | xmlstarlet sel -t -c '//serial'
sudo virsh dumpxml domain |
  xmlstarlet sel -t -v '//serial[target/@port=0]/source/@path'

Обратите внимание, что вы также можете передавать команды монитору QMP с помощью команды virsh qemu-monitor-command .

Например:

$ virsh qemu-monitor-command domain '{"execute":"qom-get","arguments":
{"path":"/machine/peripheral/serial0","property":"chardev"}}'
{"return":"charserial0","id":"libvirt-84"}
8
27.01.2020, 20:36

Теги

Похожие вопросы