qemu-guest-agent를 사용하여 가상 머신의 호스트 이름과 IP 주소를 얻는 방법

qemu-guest-agent를 사용하여 가상 머신의 호스트 이름과 IP 주소를 얻는 방법

나는 다음을 사용하여 가상 머신을 실행하고 있습니다.

qemu-system-x86_64 -accel kvm,thread=multi -cpu host -smp 1 -m 2048 \
-drive file=ubuntu-server1.qcow2,if=virtio -vga virtio -display none -daemonize \
-nic bridge,model=virtio-net-pci,mac=DE:AD:BE:EF:E0:00

IP 주소를 얻으려면 다음을 사용해야 합니다.

ps -ef | grep qemu
arp | grep -i DE:AD:BE:EF:38:C4
ip neigh | grep -i DE:AD:BE:EF:38:C4

나중에 읽어보세요위키피디아, qemu-guest-agent게스트에서 설치하고 활성화했습니다.

sudo apt install qemu-guest-agent
sudo systemctl start qemu-guest-agent
sudo systemctl enable qemu-guest-agent

나는 다음을 사용하여 가상 머신을 실행했습니다.

qemu-system-x86_64 -accel kvm,thread=multi -cpu host -smp 1 -m 2048 \
-drive file=ubuntu-server1.qcow2,if=virtio -vga virtio -display none -daemonize \
-nic bridge,model=virtio-net-pci,mac=DE:AD:BE:EF:E0:00 \
-chardev socket,path=/tmp/qga.sock,server,nowait,id=qga0 \
-device virtio-serial \
-device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0

따라서 소켓은 에 있습니다 /tmp/qga.sock.

이제 이 소켓을 사용하여 게스트의 호스트 이름과 IP를 얻는 방법을 이해할 수 없습니다.

명확성을 위해 확인했습니다.SSH를 통해 연결할 수 있는 KVM 가상 머신의 IP 주소를 어떻게 찾나요?하지만 나는 그것을 사용하는 데 관심이 없습니다 virt-manager.

답변1

~에서QEMU 문서예를 들어 socat소켓을 통해 게스트 에이전트를 쿼리하는 데 사용할 수 있는 API가 있습니다. 모든 것이 JSON 형식인 것 같으므로 jq해당 도구도 설치하는 것이 좋습니다 .

mdroth@illuin:~$ sudo socat unix-connect:/tmp/qga.sock readline

[...]

{"execute": "guest-info"}

[...]

위의 명령은 무엇보다도 보낼 수 있는 모든 가능한 명령 목록을 제공합니다.

내 데비안 시스템에서는독서선다음에 대한 기능이 비활성화되었습니다.socat, 매뉴얼 페이지에서는 대신 stdio(alias -)를 사용하라고 지시합니다. 아쉽게도 출력이 발생하지 않거나 불완전한 경우가 있는데, socat이 경우 EOF 조건이 최적으로 처리되지 않는 것 같습니다. 왼쪽에 지연을 추가하면 문제가 해결되는 것 같습니다.

이는 다음과 같습니다(루트 또는 적절한 사용자로서).

{ echo '{"execute": "guest-info"}'; sleep 2; } | socat unix-connect:/tmp/qga.sock -| jq .

[...]
      {
        "enabled": true,
        "name": "guest-network-get-interfaces",
        "success-response": true
      },
[...]

이제 {"execute": "guest-network-get-interfaces"}일부 필터를 보내고 사용할 수 있습니다(그리고약간의 훈련) 사용 jq:

# { echo '{"execute": "guest-network-get-interfaces"}'; sleep 2; } |
      socat unix-connect:/tmp/qga.sock - |
      jq -j '."return"[] | ."name", (."ip-addresses"[] | " ", ."ip-address","/",."prefix"),"\n"'
lo 127.0.0.1/8 ::1/128
ens3 192.0.2.2/24

null 값(주소가 없는 인터페이스)에 대한 오류 처리는 연습으로 남겨 둡니다.

호스트 이름 부분에는 더 간단하고 값이 있습니다. 명령은 다음과 "guest-get-host-name"같습니다

{ echo '{"execute": "guest-get-host-name"}'; sleep 2; } | socat unix-connect:/tmp/qga.sock - | jq  -r '."return"."host-name"'

관련 정보