检索 libvirt 域的串口信息?

dai*_*isy 5 qemu libvirt

我正在尝试检索串行端口信息,又名Source Pathlibvirt 域(使用 qemu/KVM 机器):

Serial Device 1 (Primary Console)
  Device type: pty
  Source path: /dev/pts/2
Run Code Online (Sandbox Code Playgroud)

但是我在这里检查了API 参考,它似乎不支持Source Path.

有没有类似的命令VBoxManage可以直接列出这些信息?


奇怪,我在libvirt群里,可以用 控制(启动、停止等)KVM机器virt-managervirsh还显示virsh #提示。

但是我看不到任何virsh list --all命令,我仍然必须以 root 权限运行它。

Sté*_*las 10

KVM 是用于虚拟化的内核 API。它不处理串行端口qemu是一种机器(PC 和其他)模拟器,可kvm用于提高虚拟化性能。它可以模拟标准的 8250 UART 串​​行端口 ( isa-serial) 或半虚拟化串行端口 ( virtio-serial)。

在 qemu 中,您使用命令行参数定义您的机器,这些参数指定要添加到您的机器的设备以及这些设备映射到的后端(例如,模拟硬盘到图像文件,网络适配器到tap设备......)。

对于串行端口,您通常将其映射到 qemu 调用的chardevs

有很多不同的可能,通常是任何可以发送和接收字节的东西,比如管道、套接字、文件描述符、伪终端。

例如,如果您将 qemu 运行为:

qemu ... -device isa-serial,chardev=c,id=s -chardev pty,id=c 
Run Code Online (Sandbox Code Playgroud)

qemu 分配一个伪终端,在启动时在 stdout 上报告:

char device redirected to /dev/pts/18 (label c)
Run Code Online (Sandbox Code Playgroud)

并将其映射到添加到 VM的新isa串行端口。如果启动 Linux VM,您将在其内核日志中看到:

[    3.636092] Serial: 8250/16550 driver, 32 ports, IRQ sharing enabled
[    3.658666] 00:05: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
Run Code Online (Sandbox Code Playgroud)

如果您/dev/ttyS0在来宾中写入一些内容,您将能够/dev/pts/18在主机上读取它。

qemu VM 启动后,您可以使用 qemu 调用的监视器接口来控制它。有两种类型的监视器接口:

  • 人类监视器:一个类似 shell 的 CLI
  • 机器监视器:一个对机器更友好的界面,实现了称为 qemu 机器协议 (QMP) 的文本 (json) 协议。

如果您没有指定任何内容并使用默认的 SDL 控制台,则可以通过按 来在 SDL 控制台中获得一个人工监视器Ctrl+Alt+2

但是您也可以为此指定任何chardev后端(pty、socket、stdio...)。通常,我stdio在那里使用:

qemu ... -monitor stdio
Run Code Online (Sandbox Code Playgroud)

为了在终端上获得监视器,我在运行 qemu 进行测试时启动 qemu。

在该监视器界面中,您可以运行以下info qtree命令来获取有关您机器设备的信息:

(qemu) info qtree
bus: main-system-bus
[...]
  dev: i440FX-pcihost, id ""
[...]
bus: pci.0
[...]
  dev: PIIX3, id ""
    class ISA bridge, addr 00:01.0, pci id 8086:7000 (sub 1af4:1100)
    bus: isa.0
      type ISA
      dev: isa-serial, id "s"
    index = 0 (0)
    iobase = 1016 (0x3f8)
    irq = 4 (0x4)
    chardev = "c"
Run Code Online (Sandbox Code Playgroud)

在上面,您可以看到isa-serial我之前创建的设备并且它映射到"c" chardev

您可以使用info chardev以下命令从该 chardev 获取信息:

(qemu) info chardev
parallel0: filename=vc
c: filename=pty:/dev/pts/18
compat_monitor0: filename=stdio
Run Code Online (Sandbox Code Playgroud)

您会看到pty 的c映射。/dev/pts/18

您可以使用 QMP 监视器以编程方式获取相同的信息。如果你用 启动你的虚拟机-qmp stdio,你可以在那里传递命令:

{"execute":"qmp_capabilities"} # enable commands
{"return": {}}   # return value

{"execute":"qom-list","arguments":{"path":"/machine/peripheral/s"}}
{"return": [{"name": "parent_bus", "type": "link<bus>"}, {"name": "wakeup", "type": "uint32"}, {"name": "chardev", "type": "str"}, {"name": "irq", "type": "uint32"}, {"name": "iobase", "type": "uint32"}, {"name": "index", "type": "uint32"}, {"name": "hotpluggable", "type": "bool"}, {"name": "realized", "type": "bool"}, {"name": "type", "type": "string"}]}

# query chardev for "s":
{"execute":"qom-get","arguments":{"path":"/machine/peripheral/s","property":"chardev"}}
{"return": "c"}

# query chardevs:
{"execute":"query-chardev"}
{"return": [{"filename": "vc", "label": "parallel0"}, {"filename": "pty:/dev/pts/18", "label": "c"}, {"filename": "stdio", "label": "compat_monitor0"}]}
Run Code Online (Sandbox Code Playgroud)

(看看那些qom-listqom-get(库姆站立QEMU对象模型)是回忆做的ls,并cat/sysLinux机器上)。

现在您的问题表明您不是直接手动调用 qemu,而是使用libvirt. libvirt是众多虚拟化管理基础设施之一。它可以管理 qemu(有或没有 kvm)、xen 或 virtualbox(至少)VM。

对于 qemu VM,当您在 libvirt(使用 virt-manager 或其他)中定义 VM 时,这将转换为要传递给 qemu 命令的参数,并且 libvirt 通常会在 VM 启动后使用 qmp 监视器来控制 VM。

对于libvirt域,您可以通过以下方式获取域的当前配置:

virsh dumpxml the-domain
Run Code Online (Sandbox Code Playgroud)

它将配置转储为 XML。您可以使用xmllintxmlstarlet或您选择的任何 XML 解析解决方案从中提取信息。

$ virsh dumpxml domain | xmllint --xpath '//serial' -
<serial type="pty">
  <source path="/dev/pts/4"/>
  <target port="0"/>
  <alias name="serial0"/>
</serial><serial type="pty">
  <source path="/dev/pts/5"/>
  <target port="1"/>
  <alias name="serial1"/>
</serial><serial type="pty">
  <source path="/dev/pts/6"/>
  <target port="2"/>
  <alias name="serial2"/>
</serial>
$ virsh dumpxml domain |
  xmllint --xpath 'string(//serial[target/@port=0]/source/@path)' -
/dev/pts/4
Run Code Online (Sandbox Code Playgroud)

等效于xmlstarlet

sudo virsh dumpxml domain | xmlstarlet sel -t -c '//serial'
sudo virsh dumpxml domain |
  xmlstarlet sel -t -v '//serial[target/@port=0]/source/@path'
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以使用命令将命令传递给 QMP 监视器virsh qemu-monitor-command

例如:

$ virsh qemu-monitor-command domain '{"execute":"qom-get","arguments":
{"path":"/machine/peripheral/serial0","property":"chardev"}}'
{"return":"charserial0","id":"libvirt-84"}
Run Code Online (Sandbox Code Playgroud)