多个没有图形的 virsh/kvm 来宾控制台

多个没有图形的 virsh/kvm 来宾控制台

我有一个适用于没有图形的 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

相关内容