Как подключиться к процессу, работающему в недоступном терминале?

Я часто использую несколько «консолей» на своих виртуальных машинах -одну для интерактивной консоли, показывающую загрузку -и заканчивающуюся приглашением для входа в систему, а другую для записи всего этого в текстовый файл (обычно/var/lib/libvirt/consoles/<domain>.log)

Я не знаю, можно ли иметь несколько интерактивных «консолей» на виртуальной машине, но вы можете добавить столько последовательных портов, сколько захотите, а затем запустить gettyна них в виртуальной машине для приглашения на вход.

Эти последовательные порты в виртуальной машине могут быть подключены, например, к файлу, сокету или порту TCP на узле, использующем протокол telnet. Вероятно, проще всего работать с портом telnet.

напр. чтобы добавить последовательный порт ttyS1, к которому можно получить доступ через telnet, сохраните следующий фрагмент XML в/tmp/serial1.xml:

<serial type='tcp'>
  <source mode='bind' host='127.0.0.1' service='4555' tls='no'/>
  <protocol type='telnet'/>
  <target port='1'/>
  <alias name='serial1'/>
</serial>

Затем запустите virsh attach-device --config <domain> /tmp/serial1.xml.

Это добавит к виртуальной машине устройство с последовательным портом, которое будет активировано при следующем перезапуске виртуальной машины. (Может быть какой-то способ добавить его как USB-устройство -с возможностью «горячего» подключения, а не последовательный порт USB без -и избежать необходимости перезапускать виртуальную машину. Я никогда не интересовался этим ).

После перезагрузки виртуальной машины запустите getty для порта. например. с помощью sysvinit отредактируйте /etc/inittabи запустите telinit q.

С помощью systemd:

systemctl enable getty@ttyS1.service
systemctl start getty@ttyS1.service

Чтобы подключиться к последовательному порту виртуальной машины с хоста KVM, запустите telnet 127.0.0.1 4555.

Вы можете создать столько последовательных портов, сколько захотите, каждый из которых будет прослушивать другой порт. Просто измените номер TCP-порта (service=), целевой порт и псевдоним во фрагменте XML.

Если вам нужен доступ к нему с другой машины, вы можете заставить его прослушивать другой IP-адрес (, хотя вы, вероятно, хотите tls='yes'в этом случае, и использовать клиент tls -с поддержкой telnetдля connect, для чего потребуется настроить сертификат для использования qemu ).

Например, я добавил два последовательных порта в виртуальную машину Debian Stretch:

Во-первых, ttyS1 на локальном хосте :4555

$ telnet localhost 4555
Trying 127.0.0.1...
Connected to localhost.mydomain.
Escape character is '^]'.

Debian GNU/Linux 9 stretch ttyS1

stretch login: 
telnet> quit
Connection closed.

Затем ttyS2 на локальном хосте :4556

$ telnet localhost 4556
Trying 127.0.0.1...
Connected to localhost.mydomain.
Escape character is '^]'.

Debian GNU/Linux 9 stretch ttyS2

stretch login: 
telnet> quit
Connection closed.
1
16.11.2019, 13:09
1 ответ

рептир может достичь этого.

Используя этот синтаксис,:reptyr -Ts <pid>я смог подключиться к процессу, запущенному в недоступном терминале, и одновременно видеть его стандартный вывод и писать в его стандартный ввод (, включая выполнение того, что я написал ).

-1
28.01.2020, 02:11

Теги

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