Как правильно использовать функцию сокета QEMU?

Как правильно использовать функцию сокета QEMU?

Похоже, я не могу найти где-либо достаточно документации по использованию -serial unix:/path/to/some/fileаргумента to qemu-system-XXXX, поэтому надеюсь, что кто-нибудь здесь сможет пролить свет на это. В частности, мне интересно, как правильно отправлять данные в этот сокет на хосте и получать их на гостевой стороне QEMU.

Обновлять: В качестве теста я использую хост RHEL 8 и гостевую систему Solaris 8. Как и предложил LawrenceC, я добавил аргумент -serial udp::xxxx. Я также написал программу на C для подключения к UDP-порту XXXX и записи чего-либо в него. Однако я не вижу записанных байтов на стороне RHEL 8 через nc -u -l -p xxx. Что я могу упустить?

Похоже, я в корне не понял этот подход, думая, что порт откроется на гостевой системе QEMU, но это просто транслирует данные последовательного порта с гостевой системы на локальный порт UDP на хосте.

решение1

Вы пытаетесь использовать виртуальный последовательный порт интерактивно с терминальной программой? Если да, то, minicomпохоже, может позволить вам взаимодействовать с сокетом вместо устройства последовательного порта. Отhttps://www.man7.org/linux/man-pages/man1/minicom.1.html:

  Serial port setup
     A - Serial device
          /dev/tty1 or /dev/ttyS1 for most people.  [...]
          To use a UNIX socket for communication the device name
          must be prefixed with "unix#" following by the full path
          and the filename of the socket.  Minicom will then try to
          connect to this socket as a client. As long as it cannot
          connect to the socket it stays 'offline'. As soon as the
          connection establishes, minicom goes 'online'. If the
          server closes the socket, minicom switches to 'offline'
          again.

Если вы пытаетесь использовать программу для отправки данных на виртуальный последовательный порт, попробуйте опцию udp, а затем вы можете использовать netcat.

Если вам нужна простая консоль только для чтения, вы можете использовать netcat или nc, запустив QEMU с помощью: -serial udp::4555и ncкак: nc -u -l -p 4555. Каждый раз, когда QEMU что-то записывает в этот порт, это появится в сеансе netconsole.

Если вам абсолютно необходимо подключить виртуальный последовательный порт QEMU к сокету Unix, попробуйте сделать socatтак, как рекомендованоздесь.

решение2

TheПримечания по QEmu-KVM содержит этот раздел Взаимодействие на основе сокетов Unix который суммирует все варианты использования сокетов:

Взаимодействие на основе сокетов Unix

Виртуальные машины QEmu обычно используются либо в графическом режиме с окном QEmu, либо в консольном режиме (опция -nographic) с последовательной консолью, перенаправленной на стандартный ввод/вывод. Третья альтернатива заключается в использовании сокетов Unix для связи с гостем. Этого можно достичь с помощью двух опций QEmu:

-monitor unix:monitor.sock,server,nowait
-serial unix:console.sock,server,nowait

Если гостевая машина работает под управлением Linux, виртуальный последовательный порт будет доступен через устройство ttyS0. Его можно использовать как консоль с ранними сообщениями ядра с этими параметрами командной строки ядра:

console=ttyS0,38400n8 earlyprint=serial,ttyS0,38400n8

Если на гостевой машине запущен systemd, можно автоматически запустить оболочку входа на последовательном порту с помощью следующей команды:

systemctl enable [email protected]

Тогда возможно:

  • подключитесь к консоли монитора QEmu, например, с помощью:

    # Use cfmakeraw to make TAB work and isig=1 to allow using Ctrl+C
    socat STDIO,cfmakeraw,isig=1 UNIX:monitor.sock
    
    # socat<1.7.3.0 does not support cfmakeraw. Use raw instead
    socat STDIO,raw,echo=0,isig=1 UNIX:monitor.sock
    
  • подключитесь к гостевой консоли QEmu, например, с помощью:

    socat STDIO,cfmakeraw UNIX:console.sock
    
    # or, with socat<1.7.3.0
    socat STDIO,raw,echo=0 UNIX:console.sock
    

Связанный контент