나는 다음을 사용하여 가상 머신을 실행하고 있습니다.
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"'