Я пытаюсь установить канал связи между хостом и одной из его гостевых виртуальных машин, используя kvm в качестве гипервизора. Для этого я использую virtio-serial.
Чтобы создать виртуальную машину, я выполнил следующую команду:
qemu-system-x86_64 \
-m 2048 -name ubuntu \
-hda ubuntu_image \
-device virtio-serial \
-chardev socket,path=/tmp/foo,server,nowait,id=foo \
-device virtconsole,name=jobsfoo,chardev=foo,name=org.ubuntu.foo \
А затем для общения с гостем я использую:
socat /dev/hvc0 -
И на хосте:
socat /tmp/foo -
Я пришел к пониманию этого /tmp/foo
это розетка и /dev/hvc0
устройство персонажа.
Почему существует симметричный интерфейс для связи: сокет на хосте и символьное устройство на гостевой системе?
У вас есть символьное устройство в гостевой системе, потому что Unix и Unix-подобные операционные системы представляют последовательные порты как символьные устройства, и делали это примерно столько же, сколько существует Unix, и вы явно запросили виртуальный последовательный порт в гостевой системе. Порт создается драйвером устройства ядра, поэтому он должен быть специальным символьным устройством.
У вас есть сокет на хосте, потому что вы его явно запросили. Предположительно вы хотите двустороннюю связь от какой-то программы на хосте с какой-то программой на гостевой машине, которая понимает последовательные порты. Другой конец этого сокета, конечно же, обрабатывается процессом qemu, выполняющим виртуальную машину. Вы также можете подключить это к pty для эмуляции последовательной консоли или к простому файлу, чтобы просто регистрировать все, что выходит из порта.