[libvirt] [HELP] QEMU guest agent via ISA serial port, or shutdown hooks?
Michal Privoznik
mprivozn at redhat.com
Thu Oct 18 08:11:48 UTC 2012
On 18.10.2012 01:27, Thorsten Glaser wrote:
> Hi,
>
> http://www.redhat.com/archives/libvir-list/2012-January/msg00629.html
> added support only for when using the virtio channel to the guest.
>
> However, QEMU Guest Agent support is most useful to guests that do
> not implement ACPI shutdown support; these usually don’t have virtio
> (especially since I was unable to find a how-to-implement-virtio-in-
> a-kernel document, otherwise MirBSD might do virtio-rng at least ☺),
> so the serial transport would be best.
>
> The problem is of course the two lines:
> + if (channel->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO)
> + continue;
>
> I’ve done a bit of hacking to allow the name attribute in the domain
> XML for any character device (probably half wrong, but this was just
> a quick test for me) and commented out these two lines, to see whether
> qga support on ISA ports is doable. (You probably would want to allow
> the attribute only on virtio and ISA serial ports, then.)
That's correct; as long as qga supports just virtio-serial and
isa-serial channels.
>
> Patch follows, NOT FOR APPLYING AS-IS:
>
> --- libvirt-0.9.12.orig/src/conf/domain_conf.c
> +++ libvirt-0.9.12/src/conf/domain_conf.c
> @@ -1266,6 +1266,7 @@ void virDomainChrDefFree(virDomainChrDef
> break;
>
> default:
> + VIR_FREE(def->target.name);
> break;
> }
>
> @@ -4954,6 +4955,7 @@ virDomainChrDefParseTargetXML(virCapsPtr
> break;
>
> default:
> + def->target.name = virXMLPropString(cur, "name");
> portStr = virXMLPropString(cur, "port");
> if (portStr == NULL) {
> /* Set to negative value to indicate we should set it later */
> @@ -11685,11 +11687,16 @@ virDomainChrDefFormat(virBufferPtr buf,
> virDomainChrTargetTypeToString(def->deviceType,
> def->targetType),
> def->target.port);
> + //XXX def->target.name is lost
> break;
>
> default:
> - virBufferAsprintf(buf, " <target port='%d'/>\n",
> + virBufferAsprintf(buf, " <target port='%d'",
> def->target.port);
> + if (def->target.name) {
> + virBufferEscapeString(buf, " name='%s'", def->target.name);
> + }
> + virBufferAddLit(buf, "/>\n");
> break;
> }
>
> --- libvirt-0.9.12.orig/src/qemu/qemu_process.c
> +++ libvirt-0.9.12/src/qemu/qemu_process.c
> @@ -191,8 +191,8 @@ qemuFindAgentConfig(virDomainDefPtr def)
> for (i = 0 ; i < def->nchannels ; i++) {
> virDomainChrDefPtr channel = def->channels[i];
>
> - if (channel->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO)
> - continue;
> +// if (channel->targetType != VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO)
> +// continue;
>
> if (STREQ_NULLABLE(channel->target.name, "org.qemu.guest_agent.0")) {
> config = &channel->source;
>
> Unfortunately, that seems to not be enough: trying to build the
> resulting libvirt package segfaults in the testsuite, so I must
> have some mistakes in the XML part. I’m really not familiar with
> all this, I’d “just” like to have my BSD VMs shut down cleanly
> when the host is shut down, so please advice.
>
> Does libvirt (the dæmon, probably) offer a shutdown hook, e.g.
> I could tell it to run a shellscript that ssh(1)s to the VM with
> a passwordless key to shut it down, instead? (Same for when the
> Shutdown or Restart functions in virt-manager are used, or virsh.)
Not yet.
>
> Thanks in advance,
> //mirabilos
>
I can implement isa-serial channel. But not too soon, though.
Michal
More information about the libvir-list
mailing list