Eu freqüentemente uso vários "consoles" em minhas VMs - uma para um console interativo mostrando a inicialização e terminando com um prompt de login e outra para registrar tudo isso em um arquivo de texto (geralmente /var/lib/libvirt/consoles/<domain>.log
)
Não sei se você pode ter vários " interactive " consoles "em uma VM, mas pode adicionar quantas portas seriais desejar e, em seguida, executar getty
sobre eles na VM para o prompt de login.
Essas portas seriais na VM podem ser conectadas a, por exemplo, um arquivo ou um soquete, ou uma porta TCP no host que fala telnet
protocol. O mais fácil de trabalhar é provavelmente uma porta telnet.
por exemplo. para adicionar uma porta serial serial ttyS1 que pode ser acessada via telnet
, salve o seguinte fragmento XML em /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>
Em seguida, execute virsh attach-device --config <domain> /tmp/serial1.xml
.
Isso adicionará um dispositivo de porta serial à VM, que será ativado na próxima vez em que a VM for reiniciada. (Pode haver alguma maneira de adicioná-lo como um dispositivo USB hot-pluggable ao invés de uma porta serial não-USB, e evitar a necessidade de reiniciar a VM. Eu nunca me importei o suficiente para descobrir).
Após a reinicialização da VM, execute um getty na porta. por exemplo. com sysvinit, edite /etc/inittab
e execute telinit q
.
com o systemd:
systemctl enable [email protected]
systemctl start [email protected]
Para conectar-se à porta serial da VM a partir do host KVM, execute telnet 127.0.0.1 4555
.
Você pode criar quantas portas seriais quiser, cada uma escutando em uma porta diferente. Basta alterar o número da porta tcp ( service=
), a porta de destino e o nome do alias no fragmento XML.
Se você precisar acessá-lo de outra máquina, poderá fazê-lo ouvir em um endereço IP diferente (embora provavelmente você queira tls='yes'
nesse caso e usar um cliente telnet
habilitado para tls para se conectar, o que requer a configuração de um certificado para qemu usar).
Por exemplo, adicionei duas portas seriais a uma máquina Debian Stretch:
Primeiro, ttyS1 no host local: 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.
Então ttyS2 no localhost: 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.