Qemu

檢索 libvirt 域的串列埠資訊?

  • May 4, 2015

我正在嘗試檢索串列埠資訊,也就是Source Pathlibvirt 域(使用 qemu/KVM 機器):

Serial Device 1 (Primary Console)
 Device type: pty
 Source path: /dev/pts/2

但是我在這裡檢查了 API 參考,它似乎不支持Source Path.

有沒有這樣VBoxManage的命令可以直接列出這些資訊?


奇怪,我在libvirt群裡,我可以用 控制(啟動、停止等)KVM 機器virt-managervirsh還會顯示virsh #提示。

但是我無法通過virsh list --all命令看到任何內容,我仍然必須以 root 權限執行它。

KVM 是用於虛擬化的核心 API。它不處理串列埠qemu是可kvm用於提高虛擬化性能的機器(PC 和其他)模擬器。它可以模擬標準 8250 UART 串​​行埠 ( isa-serial) 或半虛擬化串列埠 ( virtio-serial)。

在 qemu 中,您使用命令行參數定義您的機器,這些參數指定要添加到您的機器的設備以及這些設備映射到的後端(例如模擬硬碟到圖像文件,網路適配器到tap設備……)。

對於串列埠,您通常將其映射到 qemu 呼叫的 chardevs

有很多不同的可能,通常是任何可以發送和接收字節的東西,比如管道、套接字、文件描述符、偽終端。

例如,如果您將 qemu 執行為:

qemu ... -device isa-serial,chardev=c,id=s -chardev pty,id=c 

qemu 分配一個偽終端,在啟動時在標準輸出上報告:

char device redirected to /dev/pts/18 (label c)

並將其映射到添加到 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

如果您/dev/ttyS0在客戶機中寫入內容,您將能夠/dev/pts/18在主機上閱讀它。

啟動 qemu 虛擬機後,您可以使用 qemu 所謂的監控介面來控制它。有兩種類型的監控介面:

  • 人工監視器:類似 shell 的 CLI
  • 機器監視器:一個更機器友好的介面,實現稱為 qemu 機器協議 (QMP) 的文本 (json) 協議。

如果您不指定任何內容並使用預設的 SDL 控制台,您可以通過按 獲得 SDL 控制台中的人工監視器Ctrl+Alt+2

但是您也可以為此指定任何chardev後端(pty、socket、stdio…)。通常,我stdio在那裡使用:

qemu ... -monitor stdio

為了在終端上獲得監視器,我在執行 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"

在上面,您可以看到isa-serial我之前創建的設備,並且它映射到"c" chardev

您可以使用以下命令從該 chardev 獲取資訊info chardev

(qemu) info chardev
parallel0: filename=vc
c: filename=pty:/dev/pts/18
compat_monitor0: filename=stdio

您會看到ptyc的映射。/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"}]}

(看看那些qom-listqom-get(qom 代表 qemu 對像模型)是如何讓人想起在 Linux 機器上做的)lscat``/sys

現在您的問題表明您不是直接手動呼叫 qemu 而是使用libvirt. libvirt是眾多虛擬化管理基礎架構之一。它可以管理 qemu(帶或不帶 kvm)、xen 或 virtualbox(至少)VM。

對於 qemu VM,當您在 libvirt(使用 virt-manager 或其他)中定義 VM 時,這將轉換為要傳遞給 qemu 命令的參數,並且 libvirt 通常會在 VM 啟動後使用 qmp 監視器來控制 VM。

對於libvirt域,您可以通過以下方式獲取域的目前配置:

virsh dumpxml the-domain

它將配置轉儲為 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

與 等價的xmlstarlet

sudo virsh dumpxml domain | xmlstarlet sel -t -c '//serial'
sudo virsh dumpxml domain |
 xmlstarlet sel -t -v '//serial[target/@port=0]/source/@path'

請注意,您還可以使用命令將命令傳遞給 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"}

引用自:https://unix.stackexchange.com/questions/140876