This is trivial for QEMU since you just have to not stop the vm before
starting the dump. And for Xen, you just pass the flag down to xend.
* include/libvirt/libvirt.h.in (virDomainCoreDumpFlags): Add
VIR_DUMP_LIVE.
* src/qemu/qemu_driver.c (qemudDomainCoreDump): Support live dumping.
* src/xen/xend_internal.c (xenDaemonDomainCoreDump): Support live dumping.
* tools/virsh.c (opts_dump): Add --live.
(cmdDump): Map it to VIR_DUMP_LIVE.
---
Since there was consensus, here is the patch with the Xen
driver support. Applies on top of the --crash patch.
include/libvirt/libvirt.h.in | 1 +
src/qemu/qemu_driver.c | 7 +++----
src/xen/xend_internal.c | 3 ++-
tools/virsh.c | 3 +++
4 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index c04b552..b4a7ef1 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
@@ -337,6 +337,7 @@ typedef virDomainInterfaceStatsStruct *virDomainInterfaceStatsPtr;
/* Domain core dump flags. */
typedef enum {
VIR_DUMP_CRASH = (1 << 0), /* crash after dump */
+ VIR_DUMP_LIVE = (1 << 1), /* live dump */
} virDomainCoreDumpFlags;
/* Domain migration flags. */
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 8e80144..7de3c45 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3597,15 +3597,14 @@ static int qemudDomainCoreDump(virDomainPtr dom,
driver->securityDriver->domainSetSavedStateLabel(dom->conn, vm, path) ==
-1)
goto endjob;
- /* Migrate will always stop the VM, so once we support live dumping
- the resume condition will stay the same, independent of whether
- the stop command is issued. */
+ /* Migrate will always stop the VM, so the resume condition is
+ independent of whether the stop command is issued. */
resume = (vm->state == VIR_DOMAIN_RUNNING);
qemuDomainObjPrivatePtr priv = vm->privateData;
/* Pause domain for non-live dump */
- if (vm->state == VIR_DOMAIN_RUNNING) {
+ if (!(flags & VIR_DUMP_LIVE) && vm->state == VIR_DOMAIN_RUNNING) {
qemuDomainObjEnterMonitor(vm);
if (qemuMonitorStopCPUs(priv->mon) < 0) {
qemuDomainObjExitMonitor(vm);
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
index 360390d..ce7b9db 100644
--- a/src/xen/xend_internal.c
+++ b/src/xen/xend_internal.c
@@ -3244,7 +3244,8 @@ xenDaemonDomainCoreDump(virDomainPtr domain, const char *filename,
}
return xend_op(domain->conn, domain->name,
- "op", "dump", "file", filename, "live",
"0",
+ "op", "dump", "file", filename,
+ "live", (flags & VIR_DUMP_LIVE ? "1" : "0"),
"crash", (flags & VIR_DUMP_CRASH ? "1" : "0"),
NULL);
}
diff --git a/tools/virsh.c b/tools/virsh.c
index 65eaa3b..fcbd4e6 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -1431,6 +1431,7 @@ static const vshCmdInfo info_dump[] = {
};
static const vshCmdOptDef opts_dump[] = {
+ {"live", VSH_OT_BOOL, 0, gettext_noop("perform a live core dump if
supported")},
{"crash", VSH_OT_BOOL, 0, gettext_noop("crash the domain after core
dump")},
{"domain", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("domain name, id
or uuid")},
{"file", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("where to dump the
core")},
@@ -1455,6 +1456,8 @@ cmdDump(vshControl *ctl, const vshCmd *cmd)
if (!(dom = vshCommandOptDomain(ctl, cmd, &name)))
return FALSE;
+ if (vshCommandOptBool (cmd, "live"))
+ flags |= VIR_DUMP_LIVE;
if (vshCommandOptBool (cmd, "crash"))
flags |= VIR_DUMP_CRASH;
--
1.6.5.2