[libvirt] [HELP] QEMU guest agent via ISA serial port, or shutdown hooks?

Thorsten Glaser tg at mirbsd.de
Wed Oct 17 23:27:00 UTC 2012


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.)

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.)

Thanks in advance,
//mirabilos
-- 
> Hi, does anyone sell openbsd stickers by themselves and not packaged
> with other products?
No, the only way I've seen them sold is for $40 with a free OpenBSD CD.
	-- Haroon Khalid and Steve Shockley in gmane.os.openbsd.misc




More information about the libvir-list mailing list