forked from pool/libvirt
- Have systemd terminate the machine as a workaround of fdo#68370
bd773e74-lxc-terminate-machine.patch bnc#842834 OBS-URL: https://build.opensuse.org/package/show/Virtualization/libvirt?expand=0&rev=318
This commit is contained in:
parent
8296f9e96d
commit
65c4cfdc02
247
bd773e74-lxc-terminate-machine.patch
Normal file
247
bd773e74-lxc-terminate-machine.patch
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
commit bd773e74f0d1d1b9ebbfcaa645178316b4f2265c
|
||||||
|
Author: Cédric Bosdonnat <cbosdonnat@suse.com>
|
||||||
|
Date: Mon Sep 30 16:46:29 2013 +0200
|
||||||
|
|
||||||
|
LXC: workaround machined uncleaned data with containers running systemd.
|
||||||
|
|
||||||
|
The problem is described by [0] but its effect on libvirt is that
|
||||||
|
starting a container with a full distro running systemd after having
|
||||||
|
stopped it simply fails.
|
||||||
|
|
||||||
|
The container cleanup now calls the machined Terminate function to make
|
||||||
|
sure that everything is in order for the next run.
|
||||||
|
|
||||||
|
[0]: https://bugs.freedesktop.org/show_bug.cgi?id=68370
|
||||||
|
|
||||||
|
Index: libvirt-1.1.2/src/libvirt_private.syms
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.1.2.orig/src/libvirt_private.syms
|
||||||
|
+++ libvirt-1.1.2/src/libvirt_private.syms
|
||||||
|
@@ -1940,8 +1940,10 @@ virSysinfoSetup;
|
||||||
|
|
||||||
|
# util/virsystemd.h
|
||||||
|
virSystemdCreateMachine;
|
||||||
|
+virSystemdMakeMachineName;
|
||||||
|
virSystemdMakeScopeName;
|
||||||
|
virSystemdMakeSliceName;
|
||||||
|
+virSystemdTerminateMachine;
|
||||||
|
|
||||||
|
|
||||||
|
# util/virthread.h
|
||||||
|
Index: libvirt-1.1.2/src/lxc/lxc_process.c
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.1.2.orig/src/lxc/lxc_process.c
|
||||||
|
+++ libvirt-1.1.2/src/lxc/lxc_process.c
|
||||||
|
@@ -50,6 +50,7 @@
|
||||||
|
#include "virstring.h"
|
||||||
|
#include "viratomic.h"
|
||||||
|
#include "virprocess.h"
|
||||||
|
+#include "virsystemd.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_LXC
|
||||||
|
|
||||||
|
@@ -210,6 +211,13 @@ static void virLXCProcessCleanup(virLXCD
|
||||||
|
virCgroupFree(&priv->cgroup);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ /* Get machined to terminate the machine as it may not have cleaned it
|
||||||
|
+ * properly. See https://bugs.freedesktop.org/show_bug.cgi?id=68370 for
|
||||||
|
+ * the bug we are working around here.
|
||||||
|
+ */
|
||||||
|
+ virSystemdTerminateMachine(vm->def->name, "lxc", true);
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/* now that we know it's stopped call the hook if present */
|
||||||
|
if (virHookPresent(VIR_HOOK_DRIVER_LXC)) {
|
||||||
|
char *xml = virDomainDefFormat(vm->def, 0);
|
||||||
|
Index: libvirt-1.1.2/src/util/virsystemd.c
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.1.2.orig/src/util/virsystemd.c
|
||||||
|
+++ libvirt-1.1.2/src/util/virsystemd.c
|
||||||
|
@@ -116,6 +116,27 @@ char *virSystemdMakeSliceName(const char
|
||||||
|
return virBufferContentAndReset(&buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
+char *virSystemdMakeMachineName(const char *name,
|
||||||
|
+ const char *drivername,
|
||||||
|
+ bool privileged)
|
||||||
|
+{
|
||||||
|
+ char *machinename = NULL;
|
||||||
|
+ char *username = NULL;
|
||||||
|
+ if (privileged) {
|
||||||
|
+ if (virAsprintf(&machinename, "%s-%s", drivername, name) < 0)
|
||||||
|
+ goto cleanup;
|
||||||
|
+ } else {
|
||||||
|
+ if (!(username = virGetUserName(geteuid())))
|
||||||
|
+ goto cleanup;
|
||||||
|
+ if (virAsprintf(&machinename, "%s-%s-%s", username, drivername, name) < 0)
|
||||||
|
+ goto cleanup;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+cleanup:
|
||||||
|
+ VIR_FREE(username);
|
||||||
|
+
|
||||||
|
+ return machinename;
|
||||||
|
+}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* virSystemdCreateMachine:
|
||||||
|
@@ -142,7 +163,6 @@ int virSystemdCreateMachine(const char *
|
||||||
|
DBusConnection *conn;
|
||||||
|
char *machinename = NULL;
|
||||||
|
char *creatorname = NULL;
|
||||||
|
- char *username = NULL;
|
||||||
|
char *slicename = NULL;
|
||||||
|
|
||||||
|
if (!virDBusHasSystemBus())
|
||||||
|
@@ -150,15 +170,8 @@ int virSystemdCreateMachine(const char *
|
||||||
|
|
||||||
|
conn = virDBusGetSystemBus();
|
||||||
|
|
||||||
|
- if (privileged) {
|
||||||
|
- if (virAsprintf(&machinename, "%s-%s", drivername, name) < 0)
|
||||||
|
- goto cleanup;
|
||||||
|
- } else {
|
||||||
|
- if (!(username = virGetUserName(geteuid())))
|
||||||
|
- goto cleanup;
|
||||||
|
- if (virAsprintf(&machinename, "%s-%s-%s", username, drivername, name) < 0)
|
||||||
|
- goto cleanup;
|
||||||
|
- }
|
||||||
|
+ if (!(machinename = virSystemdMakeMachineName(name, drivername, privileged)))
|
||||||
|
+ goto cleanup;
|
||||||
|
|
||||||
|
if (virAsprintf(&creatorname, "libvirt-%s", drivername) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
@@ -241,8 +254,52 @@ int virSystemdCreateMachine(const char *
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
- VIR_FREE(username);
|
||||||
|
VIR_FREE(creatorname);
|
||||||
|
VIR_FREE(machinename);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+int virSystemdTerminateMachine(const char *name,
|
||||||
|
+ const char *drivername,
|
||||||
|
+ bool privileged)
|
||||||
|
+{
|
||||||
|
+ int ret;
|
||||||
|
+ DBusConnection *conn;
|
||||||
|
+ char *machinename = NULL;
|
||||||
|
+
|
||||||
|
+ if(!virDBusHasSystemBus())
|
||||||
|
+ return -2;
|
||||||
|
+
|
||||||
|
+ conn = virDBusGetSystemBus();
|
||||||
|
+
|
||||||
|
+ ret = -1;
|
||||||
|
+ if (!(machinename = virSystemdMakeMachineName(name, drivername, privileged)))
|
||||||
|
+ goto cleanup;
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * The systemd DBus API we're invoking has the
|
||||||
|
+ * following signature
|
||||||
|
+ *
|
||||||
|
+ * TerminateMachine(in s name);
|
||||||
|
+ *
|
||||||
|
+ * @name a host unique name for the machine. shows up
|
||||||
|
+ * in 'ps' listing & similar
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+ VIR_DEBUG("Attempting to terminate machine via systemd");
|
||||||
|
+ if (virDBusCallMethod(conn,
|
||||||
|
+ NULL,
|
||||||
|
+ "org.freedesktop.machine1",
|
||||||
|
+ "/org/freedesktop/machine1",
|
||||||
|
+ "org.freedesktop.machine1.Manager",
|
||||||
|
+ "TerminateMachine",
|
||||||
|
+ "s",
|
||||||
|
+ machinename) < 0)
|
||||||
|
+ goto cleanup;
|
||||||
|
+
|
||||||
|
+ ret = 0;
|
||||||
|
+
|
||||||
|
+cleanup:
|
||||||
|
+ VIR_FREE(machinename);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
Index: libvirt-1.1.2/src/util/virsystemd.h
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.1.2.orig/src/util/virsystemd.h
|
||||||
|
+++ libvirt-1.1.2/src/util/virsystemd.h
|
||||||
|
@@ -29,6 +29,10 @@ char *virSystemdMakeScopeName(const char
|
||||||
|
const char *slicename);
|
||||||
|
char *virSystemdMakeSliceName(const char *partition);
|
||||||
|
|
||||||
|
+char *virSystemdMakeMachineName(const char *name,
|
||||||
|
+ const char *drivername,
|
||||||
|
+ bool privileged);
|
||||||
|
+
|
||||||
|
int virSystemdCreateMachine(const char *name,
|
||||||
|
const char *drivername,
|
||||||
|
bool privileged,
|
||||||
|
@@ -38,4 +42,8 @@ int virSystemdCreateMachine(const char *
|
||||||
|
bool iscontainer,
|
||||||
|
const char *partition);
|
||||||
|
|
||||||
|
+int virSystemdTerminateMachine(const char *name,
|
||||||
|
+ const char *drivername,
|
||||||
|
+ bool privileged);
|
||||||
|
+
|
||||||
|
#endif /* __VIR_SYSTEMD_H__ */
|
||||||
|
Index: libvirt-1.1.2/tests/virsystemdtest.c
|
||||||
|
===================================================================
|
||||||
|
--- libvirt-1.1.2.orig/tests/virsystemdtest.c
|
||||||
|
+++ libvirt-1.1.2/tests/virsystemdtest.c
|
||||||
|
@@ -51,6 +51,18 @@ static int testCreateContainer(const voi
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int testTerminateContainer(const void *opaque ATTRIBUTE_UNUSED)
|
||||||
|
+{
|
||||||
|
+ if (virSystemdTerminateMachine("demo",
|
||||||
|
+ "lxc",
|
||||||
|
+ true) < 0) {
|
||||||
|
+ fprintf(stderr, "%s", "Failed to terminate LXC machine\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int testCreateMachine(const void *opaque ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
unsigned char uuid[VIR_UUID_BUFLEN] = {
|
||||||
|
@@ -74,6 +86,18 @@ static int testCreateMachine(const void
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static int testTerminateMachine(const void *opaque ATTRIBUTE_UNUSED)
|
||||||
|
+{
|
||||||
|
+ if (virSystemdTerminateMachine("demo",
|
||||||
|
+ "qemu",
|
||||||
|
+ false) < 0) {
|
||||||
|
+ fprintf(stderr, "%s", "Failed to terminate KVM machine\n");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static int testCreateNoSystemd(const void *opaque ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
unsigned char uuid[VIR_UUID_BUFLEN] = {
|
||||||
|
@@ -177,8 +201,12 @@ mymain(void)
|
||||||
|
|
||||||
|
if (virtTestRun("Test create container ", 1, testCreateContainer, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
|
+ if (virtTestRun("Test terminate container ", 1, testTerminateContainer, NULL) < 0)
|
||||||
|
+ ret = -1;
|
||||||
|
if (virtTestRun("Test create machine ", 1, testCreateMachine, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
|
+ if (virtTestRun("Test terminate machine ", 1, testTerminateMachine, NULL) < 0)
|
||||||
|
+ ret = -1;
|
||||||
|
if (virtTestRun("Test create no systemd ", 1, testCreateNoSystemd, NULL) < 0)
|
||||||
|
ret = -1;
|
||||||
|
if (virtTestRun("Test create bad systemd ", 1, testCreateBadSystemd, NULL) < 0)
|
@ -1,3 +1,10 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Tue Oct 22 14:37:08 MDT 2013 - cbosdonnat@suse.com
|
||||||
|
|
||||||
|
- Have systemd terminate the machine as a workaround of fdo#68370
|
||||||
|
bd773e74-lxc-terminate-machine.patch
|
||||||
|
bnc#842834
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Tue Oct 22 12:28:03 MDT 2013 - jfehlig@suse.com
|
Tue Oct 22 12:28:03 MDT 2013 - jfehlig@suse.com
|
||||||
|
|
||||||
|
@ -419,6 +419,7 @@ Patch12: b7fcc799a-CVE-2013-4400.patch
|
|||||||
Patch13: 3e2f27e1-CVE-2013-4400.patch
|
Patch13: 3e2f27e1-CVE-2013-4400.patch
|
||||||
Patch14: 5a0ea4b7-CVE-2013-4400.patch
|
Patch14: 5a0ea4b7-CVE-2013-4400.patch
|
||||||
Patch15: 843bdb2f-CVE-2013-4400.patch
|
Patch15: 843bdb2f-CVE-2013-4400.patch
|
||||||
|
Patch16: bd773e74-lxc-terminate-machine.patch
|
||||||
# Need to go upstream
|
# Need to go upstream
|
||||||
Patch100: xen-name-for-devid.patch
|
Patch100: xen-name-for-devid.patch
|
||||||
Patch101: clone.patch
|
Patch101: clone.patch
|
||||||
@ -946,6 +947,7 @@ of recent versions of Linux (and other OSes).
|
|||||||
%patch13 -p1
|
%patch13 -p1
|
||||||
%patch14 -p1
|
%patch14 -p1
|
||||||
%patch15 -p1
|
%patch15 -p1
|
||||||
|
%patch16 -p1
|
||||||
%patch100 -p1
|
%patch100 -p1
|
||||||
%patch101
|
%patch101
|
||||||
%patch102 -p1
|
%patch102 -p1
|
||||||
|
Loading…
Reference in New Issue
Block a user