diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 06647743415fd840b8138c922ab5003169d1f4da..f2856a5eda9ed9c481987c8c2284a3ed243992f5 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -4490,6 +4490,10 @@ static const vshCmdOptDef opts_dump[] = { .type = VSH_OT_BOOL, .help = N_("dump domain's memory only") }, + {.name = "format", + .type = VSH_OT_DATA, + .help = N_("specify the format of memory-only dump") + }, {.name = NULL} }; @@ -4505,6 +4509,8 @@ doDump(void *opaque) const char *name = NULL; const char *to = NULL; unsigned int flags = 0; + const char *format = NULL; + unsigned int dumpformat = VIR_DOMAIN_CORE_DUMP_FORMAT_RAW; sigemptyset(&sigmask); sigaddset(&sigmask, SIGINT); @@ -4528,9 +4534,40 @@ doDump(void *opaque) if (vshCommandOptBool(cmd, "memory-only")) flags |= VIR_DUMP_MEMORY_ONLY; - if (virDomainCoreDump(dom, to, flags) < 0) { - vshError(ctl, _("Failed to core dump domain %s to %s"), name, to); - goto out; + if (vshCommandOptBool(cmd, "format")) { + if (!(flags & VIR_DUMP_MEMORY_ONLY)) { + vshError(ctl, "%s", _("--format only works with --memory-only")); + goto out; + } + + if (vshCommandOptString(cmd, "format", &format)) { + if (STREQ(format, "kdump-zlib")) { + dumpformat = VIR_DOMAIN_CORE_DUMP_FORMAT_KDUMP_ZLIB; + } else if (STREQ(format, "kdump-lzo")) { + dumpformat = VIR_DOMAIN_CORE_DUMP_FORMAT_KDUMP_LZO; + } else if (STREQ(format, "kdump-snappy")) { + dumpformat = VIR_DOMAIN_CORE_DUMP_FORMAT_KDUMP_SNAPPY; + } else if (STREQ(format, "elf")) { + dumpformat = VIR_DOMAIN_CORE_DUMP_FORMAT_RAW; + } else { + vshError(ctl, _("format '%s' is not supported, expecting " + "'kdump-zlib', 'kdump-lzo', 'kdump-snappy' " + "or 'elf'"), format); + goto out; + } + } + } + + if (dumpformat != VIR_DOMAIN_CORE_DUMP_FORMAT_RAW) { + if (virDomainCoreDumpWithFormat(dom, to, dumpformat, flags) < 0) { + vshError(ctl, _("Failed to core dump domain %s to %s"), name, to); + goto out; + } + } else { + if (virDomainCoreDump(dom, to, flags) < 0) { + vshError(ctl, _("Failed to core dump domain %s to %s"), name, to); + goto out; + } } ret = '0'; diff --git a/tools/virsh.pod b/tools/virsh.pod index 4645be5c4606a8db23d1d123b231cfc9daaa8c79..20352cb440d208e6c67964c9407ad11546e1511a 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -1010,6 +1010,7 @@ I argument may be B or B. =item B I I [I<--bypass-cache>] { [I<--live>] | [I<--crash>] | [I<--reset>] } [I<--verbose>] [I<--memory-only>] +[I<--format> I] Dumps the core of a domain to a file for analysis. If I<--live> is specified, the domain continues to run until the core @@ -1023,6 +1024,10 @@ cache, although this may slow down the operation. If I<--memory-only> is specified, the file is elf file, and will only include domain's memory and cpu common register value. It is very useful if the domain uses host devices directly. +I<--format> I is used to specify the format of 'memory-only' +dump, and I can be one of them: elf, kdump-zlib(kdump-compressed +format with zlib-compressed), kdump-lzo(kdump-compressed format with +lzo-compressed), kdump-snappy(kdump-compressed format with snappy-compressed). The progress may be monitored using B virsh command and canceled with B command (sent by another virsh instance). Another option