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
여전히 루트 권한으로 실행해야 합니다.
답변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를 수동으로 직접 호출하는 것이 아니라 많은 가상화 관리 인프라 중 하나인 libvirt
qemu를 사용하고 있음을 나타냅니다. libvirt
qemu(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"}