檢索 libvirt 域的串列埠資訊?
我正在嘗試檢索串列埠資訊,也就是
Source Path
libvirt 域(使用 qemu/KVM 機器):Serial Device 1 (Primary Console) Device type: pty Source path: /dev/pts/2
但是我在這裡檢查了 API 參考,它似乎不支持
Source Path
.有沒有這樣
VBoxManage
的命令可以直接列出這些資訊?奇怪,我在
libvirt
群裡,我可以用 控制(啟動、停止等)KVM 機器virt-manager
,virsh
還會顯示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
您會看到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"}]}
(看看那些
qom-list
和qom-get
(qom 代表 qemu 對像模型)是如何讓人想起在 Linux 機器上做的)ls
。cat``/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。您可以使用
xmllint
或xmlstarlet
您選擇的任何 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"}