]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: integrate standalone VNC in domain lifecycle
authorMarc-André Lureau <marcandre.lureau@redhat.com>
Wed, 22 Apr 2026 14:14:35 +0000 (18:14 +0400)
committerMichal Privoznik <mprivozn@redhat.com>
Thu, 4 Jun 2026 12:20:46 +0000 (14:20 +0200)
When both a D-Bus display and a VNC graphics device are configured
and the qemu-vnc binary is available, use the standalone VNC server
instead of QEMU's built-in VNC.

During domain preparation, detect whether the standalone VNC path
applies and allocate the qemuVnc context. Skip the built-in -vnc
command line argument when standalone VNC is active. Start and stop
the qemu-vnc process through the external device hooks.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_domain.c
src/qemu/qemu_extdevice.c
src/qemu/qemu_process.c

index a4445ef17ae007a9407112f2163094c223ad5609..a5350acec2a1b790096788c9c808db970d738719 100644 (file)
@@ -8806,6 +8806,8 @@ qemuBuildGraphicsCommandLine(virQEMUDriverConfig *cfg,
 
             break;
         case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
+            if (QEMU_DOMAIN_GRAPHICS_PRIVATE(graphics)->vnc)
+                break;
             if (qemuBuildGraphicsVNCCommandLine(cfg, def, cmd,
                                                 graphics) < 0)
                 return -1;
index 84c8645259a8e9fc0d871693e0cf6f7a216ff14a..db4b2feb8df1ea9b85104c7e69acebdbc8176398 100644 (file)
@@ -1039,6 +1039,7 @@ qemuDomainGraphicsPrivateDispose(void *obj)
     g_free(priv->tlsAlias);
     g_clear_pointer(&priv->secinfo, qemuDomainSecretInfoFree);
     g_clear_pointer(&priv->rdp, qemuRdpFree);
+    g_clear_pointer(&priv->vnc, qemuVncFree);
 }
 
 
index 6e16c6be29ee9de67e923e9cfbbc4b070fbd36f4..93a070f892ce31d6b5d84c5020cafb8a5711b41b 100644 (file)
@@ -247,8 +247,14 @@ qemuExtDevicesStart(virQEMUDriver *driver,
                 return -1;
             continue;
         }
+        case VIR_DOMAIN_GRAPHICS_TYPE_VNC: {
+            if (QEMU_DOMAIN_GRAPHICS_PRIVATE(graphics)->vnc) {
+                if (qemuVncStart(vm, graphics) < 0)
+                    return -1;
+            }
+            continue;
+        }
         case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
-        case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
         case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
         case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
         case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
@@ -327,9 +333,12 @@ qemuExtDevicesStop(virQEMUDriver *driver,
             qemuRdpStop(vm, graphics);
             continue;
         }
+        case VIR_DOMAIN_GRAPHICS_TYPE_VNC: {
+            qemuVncStop(vm, graphics);
+            continue;
+        }
         case VIR_DOMAIN_GRAPHICS_TYPE_DBUS:
         case VIR_DOMAIN_GRAPHICS_TYPE_SDL:
-        case VIR_DOMAIN_GRAPHICS_TYPE_VNC:
         case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP:
         case VIR_DOMAIN_GRAPHICS_TYPE_SPICE:
         case VIR_DOMAIN_GRAPHICS_TYPE_EGL_HEADLESS:
index 4e59651c25c201979963170fdb8a517cf5e1ee81..530cd442a57d8558a839a5353fe849183db920f6 100644 (file)
@@ -5601,6 +5601,41 @@ qemuProcessGraphicsSetupRenderNode(virDomainGraphicsDef *graphics,
 }
 
 
+static bool
+qemuHasNonP2PDbusGraphics(virDomainDef *def)
+{
+    size_t i;
+
+    for (i = 0; i < def->ngraphics; i++) {
+        virDomainGraphicsDef *g = def->graphics[i];
+
+        if (g->type == VIR_DOMAIN_GRAPHICS_TYPE_DBUS && !g->data.dbus.p2p)
+            return true;
+    }
+
+    return false;
+}
+
+
+static int
+qemuPrepareGraphicsVnc(virQEMUDriver *driver,
+                       virDomainDef *def,
+                       virDomainGraphicsDef *gfx)
+{
+    g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
+
+    if (!qemuHasNonP2PDbusGraphics(def))
+        return 0;
+
+    if (!qemuVncAvailable(cfg->qemuVncName))
+        return 0;
+
+    QEMU_DOMAIN_GRAPHICS_PRIVATE(gfx)->vnc = qemuVncNew();
+
+    return 0;
+}
+
+
 static int
 qemuProcessSetupGraphics(virQEMUDriver *driver,
                          virDomainObj *vm,
@@ -5622,6 +5657,10 @@ qemuProcessSetupGraphics(virQEMUDriver *driver,
 
         if (qemuProcessGraphicsSetupDBus(driver, graphics, vm) < 0)
             return -1;
+
+        if (graphics->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
+            qemuPrepareGraphicsVnc(driver, vm->def, graphics) < 0)
+            return -1;
     }
 
     if (allocate) {
@@ -6186,7 +6225,6 @@ qemuProcessPrepareGraphics(virDomainObj *vm)
         if (gfx->type == VIR_DOMAIN_GRAPHICS_TYPE_RDP &&
             qemuPrepareGraphicsRdp(priv->driver, gfx) < 0)
             return -1;
-
     }
 
     return 0;