我有一个适用于没有图形的 centos7 客户机的串行控制台,我可以使用virsh console vm
.来宾具有适当的console=ttyS0,115200n8
内核命令行参数。
是否可以配置额外的控制台,以便我可以说出virsh console vm --devname vc1
并获得登录提示?
本能地,我正在考虑以某种方式连接到访客的前 6 个虚拟控制台的字符设备;我调查过libvirt 域格式和virtio串行看来我应该朝那个方向走,但无法让它发挥作用。
背景: 我们遇到了网络问题,需要花费大量时间来修复,在此期间,我们需要一名团队成员处理网络问题,另一名团队成员不间断地继续在虚拟机上工作,因此需要在没有网络的情况下使用多个控制台。
我知道有
<graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>
<listen type='address' address='127.0.0.1'/>
</graphics>
允许使用 6 个虚拟终端进行 VNC 访问,我只是想知道是否可以通过语法virsh console <domain> --device <device>
以任何合理的方式拥有这样的 6 个虚拟终端,因为这样virsh console
要方便得多。
软件:
# cat /etc/fedora-release # host
Fedora release 24 (Twenty Four)
# virsh --version
1.3.3.3
# qemu-system-x86_64 --version
QEMU emulator version 2.6.2 (qemu-2.6.2-8.fc24), Copyright (c) 2003-2008 Fabrice Bellard
# cat /etc/centos-release # guest
CentOS Linux release 7.3.1611 (Core)
答案1
我经常在虚拟机上使用多个“控制台” - 一个用于交互式控制台,显示启动并以登录提示结束,另一个用于将所有这些记录到文本文件中(通常/var/lib/libvirt/consoles/<domain>.log
)
不知道是否可以多发交互的虚拟机中的“控制台”,但是您能添加任意数量的串行端口,然后getty
在虚拟机中运行它们以获得登录提示。
VM中的这些串行端口可以连接到例如使用telnet
协议的主机上的文件、套接字或TCP端口。最容易使用的可能是 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
。
这会将串行端口设备添加到 VM,该设备将在 VM 下次重新启动时激活。 (可能有某种方法可以将其添加为热插拔 USB 设备而不是非 USB 串行端口,并避免重新启动虚拟机的需要。我从来没有足够关心去发现)。
VM 重新启动后,在端口上运行 getty。例如,使用 sysvinit,编辑/etc/inittab
并运行telinit q
.
使用系统:
systemctl enable [email protected]
systemctl start [email protected]
要从 KVM 主机连接到 VM 的串行端口,请运行telnet 127.0.0.1 4555
。
您可以根据需要创建任意多个串行端口,每个端口监听不同的端口。只需更改 XML 片段中的 TCP 端口号 ( service=
)、目标端口和别名即可。
如果您需要从另一台机器访问它,您可以让它侦听不同的 IP 地址(尽管tls='yes'
在这种情况下您可能需要,并使用启用 tls 的telnet
客户端进行连接,这将需要设置一个证书供 qemu 使用)。
例如,我向 Debian Stretch VM 添加了两个串行端口:
首先,本地主机上的 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 在 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.
答案2
由于OP描述的类似原因,我偶然发现了这个线程。不需要采用所ua-
描述的形式的域范围别名项目文件。
只需将一个或多个控制台添加为<target type='virtio' port='N'/>
.然后使用以下命令访问hvc0
, hvc1
, ... 控制台
虚拟控制台虚拟机名称安慰氮
N
从 开始计数1
。来宾端getty
设置留给读者作为练习。
答案3
我刚刚在尝试找出与此类似的内容时发现了此线程。我设法找到一种方法来完全满足原始帖子的要求。向访客添加额外的控制台并使用virsh console
.
这最适合具有 virtio 功能(现代 Linux 发行版)并启用它的来宾。
首先为要附加的控制台设备创建一个 xml。应该看起来像这样:
<console type='pty'>
<target type='virtio' port='1'/>
<alias name='ua-hvc0'/>
</console>
Virtio 在来宾中提供 8 个虚拟控制台,/dev/hvc{0..7}
它们应对应于端口 1 到 8。别名必须以 开头,ua-
否则 libvirt 会忽略它并且必须是唯一的。如果您愿意,可以将其设置为其他内容。
接下来,您将设备连接到来宾,为了virsh attach-device <domain> /path/to/xml
能够登录到控制台,您必须在相应的 hvc 上启用 getty。对于 systemd 来说,这看起来像这样systemctl enable --now getty@hvc0
。
之后,您应该能够使用virsh console <domain> ua-hvc0
您选择的任何别名从主机进行连接。
我没有在没有 virtio 的情况下进行测试,但过程应该类似。您可以添加串行设备,而不是控制台设备,例如:
<serial type='pty'>
<target port='1'/>
<alias name='ua-ttyS1'/>
</serial>
这应该添加串行端口 1,它应该是客户机 /dev/ttyS1。在 ttyS1(来宾上)上启用 gettysystemct enable getty@ttyS1
并连接virsh console <domain> ua-ttyS1