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여전히 루트 권한으로 실행해야 합니다.

답변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 호출을 통해 제어할 수 있습니다.감시 장치상호 작용. 두 가지 유형이 있습니다감시 장치상호 작용:

  • 바디 모니터: 쉘과 유사한 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를 수동으로 직접 호출하는 것이 아니라 많은 가상화 관리 인프라 중 하나인 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"}

관련 정보