Похоже, я не могу найти где-либо достаточно документации по использованию -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