runtime: Start QEMU undaemonized

QEMU has always been started daemonized since the beginning. I
could not find any justification for that though, but it certainly
introduces a problem : QEMU stops logging errors when started this
way, which isn't accaptable from a support standpoint. The QEMU
community discourages the use of -daemonize ; mostly because
libvirt, QEMU's primary consummer, doesn't use this option and
prefers getting errors from QEMU's stderr through a pipe in order
to enforce rollover.

Now that virtcontainers knows how to start QEMU with a pre-
established QMP connection, let's start QEMU without -daemonize.
This requires to handle the reaping of QEMU when it terminates.
Since cmd.Wait() is blocking, call it from a goroutine.

Signed-off-by: Greg Kurz <groug@kaod.org>
This commit is contained in:
Greg Kurz 2022-11-15 17:13:25 +01:00
parent bf4e3a618f
commit a5319c6be6

View File

@ -531,7 +531,7 @@ func (q *qemu) CreateVM(ctx context.Context, id string, network Network, hypervi
NoDefaults: true, NoDefaults: true,
NoGraphic: true, NoGraphic: true,
NoReboot: true, NoReboot: true,
Daemonize: true, Daemonize: false,
MemPrealloc: q.config.MemPrealloc, MemPrealloc: q.config.MemPrealloc,
HugePages: q.config.HugePages, HugePages: q.config.HugePages,
IOMMUPlatform: q.config.IOMMUPlatform, IOMMUPlatform: q.config.IOMMUPlatform,
@ -951,6 +951,11 @@ func (q *qemu) StartVM(ctx context.Context, timeout int) error {
// Wait for it to exit to assume that the QEMU daemon was // Wait for it to exit to assume that the QEMU daemon was
// actually started. // actually started.
qemuCmd.Wait() qemuCmd.Wait()
} else {
// Ensure the QEMU process is reaped after termination
go func() {
qemuCmd.Wait()
}()
} }
err = q.waitVM(ctx, qmpConn, timeout) err = q.waitVM(ctx, qmpConn, timeout)