daggs <daggs(a)gmx.com> writes:
I'd assume that saying vm running you mean that the os is up and
running too. I have similar need, I was able to get something as such
to work using virsh console when the guest was a linux with serial
console support enabled. I wasn't able to get this to work in a
script as I was never able to terminate the console seesion as virsh
console wasn't able to send the termination combination properly.
I wouldn't have assumed this meaning, but running off the tangent
anyway: I think installing a guest agent could help solving this
problem. However, if you want something extremely lightweight, the
following (a custom one-line guest agent if you wish) worked for me:
1. Add a channel with a descriptive name to the guest config:
<channel type="unix">
<target type="virtio" name="startup_signal"/>
</channel>
2. After starting the domain, query the assigned socket path:
virsh dumpxml $domain | xmllint --nonet --xpath \
"string(/domain/devices/channel[@type='unix' and
target/@name='startup_signal']/source/@path)" -)
3. Then wait for the signal (and optionally acknowledge it):
socat UNIX-CONNECT:"$socket_path" \
SYSTEM:'read msg id && [ $msg = ready ] && echo ack $id'
This will wait until you send the signal from the chosen point of the
guest bootup procedure via something like:
port=/dev/virtio-ports/startup_signal
msg=foobar
reply="$(echo "ready $msg" | socat STDIO "$port")"
[ "($reply)" = "(ack $msg)" ] # for checking proper acknowledgment
I folded this into a oneshot systemd service on Linux, but the
implementation should be similarly simple under any OS.
--
Feri