libvirtドメインのシリアルポート情報を取得しますか?

libvirtドメインのシリアルポート情報を取得しますか?

Source Pathlibvirtドメイン(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権限で実行する必要があります。

ベストアンサー1

KVMは仮想化のためのカーネルAPIです。それは含まれませんシリアルポート。仮想化のパフォーマンスを向上させるqemuために使用できるマシン(PCなど)エミュレータ。kvm標準の8250 UARTシリアルポート(isa-serial)または半仮想化シリアルポート(virtio-serial)をエミュレートできます。

qemuは、マシンに追加するデバイスと追加するエントリを指定するコマンドライン引数を使用してマシンを定義します。リアこれらのデバイスはマッピングされます(たとえば、シミュレートされたハードディスクからイメージファイルへ、ネットワークアダプタからデバイスへtap...)。

シリアルポートの場合、通常はqemuが呼び出すポートにマッピングします。チャデブ

パイプ、ソケット、ファイル記述子、擬似端末など、通常バイトを送受信できるすべてが可能です。

たとえば、qemuを実行している場合:

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

qemuは疑似端末を割り当て、起動時にstdoutについて報告します。

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

そしてそれを新しいマッピングにマッピングします。取締役仮想マシンにシリアルポートを追加します。 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 VMが起動すると、qemu呼び出しを介して制御できます。監視装置相互作用。 2種類あります監視装置相互作用:

  • ボディモニタ:シェルに似たCLI
  • Machine Monitor: QMP (qemu Machine Protocol) というテキスト (json) プロトコルを実装する、より機械に優しいインターフェースです。

何も指定せずにデフォルトのSDLコンソールを使用すると、次の結果が表示されます。ボディモニターSDLコンソールでを押しますCtrl+Alt+2

ただし、必要に応じて指定することもできます。チャデブバックエンド(pty、ソケット、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から情報を取得できますinfo chardev

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

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を手動で直接呼び出すのではなく、多くの仮想化管理インフラストラクチャの1つであるlibvirtqemuを使用していることを示しています。libvirtqemu(kvmを含むまたは除く)、xen、またはvirtualbox(少なくとも)VMを管理できます。

qemu VMの場合、libvirtでVMを定義すると(virt-managerなどを使用して)、これはqemuコマンドに渡される引数に変換され、libvirtは通常起動後にqmpモニターを使用してVMを制御します。

ドメインの場合、libvirt以下を使用してドメインの現在の構成を取得できます。

virsh dumpxml the-domain

構成をXMLにダンプします。必要なXML解析ソリューションをxmllint使用して情報を抽出できます。xmlstarlet

$ 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"}

おすすめ記事