From fadfcd91649507ff8e785520b4a2bf83b3aa77d2 Mon Sep 17 00:00:00 2001 From: Tomoki Sekiyama Date: Fri, 21 Nov 2014 20:27:52 -0500 Subject: [PATCH] virsh: expose virDomainGetFSInfo Add a "domfsinfo" command that shows a list of filesystems info mounted in the guest. For example: virsh # domfsinfo vm1 Mountpoint Name Type Target ------------------------------------------------------------------- / sda1 ext4 hdc /opt dm-2 vfat vda,vdb /mnt/test sdb1 xfs sda Signed-off-by: Tomoki Sekiyama --- tools/virsh-domain.c | 70 ++++++++++++++++++++++++++++++++++++++++++++ tools/virsh.pod | 9 ++++++ 2 files changed, 79 insertions(+) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 4f03956e30..750411b826 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -12225,6 +12225,70 @@ cmdDomFSThaw(vshControl *ctl, const vshCmd *cmd) return ret >= 0; } +static const vshCmdInfo info_domfsinfo[] = { + {.name = "help", + .data = N_("Get information of domain's mounted filesystems.") + }, + {.name = "desc", + .data = N_("Get information of domain's mounted filesystems.") + }, + {.name = NULL} +}; + +static const vshCmdOptDef opts_domfsinfo[] = { + {.name = "domain", + .type = VSH_OT_DATA, + .flags = VSH_OFLAG_REQ, + .help = N_("domain name, id or uuid") + }, + {.name = NULL} +}; + +static bool +cmdDomFSInfo(vshControl *ctl, const vshCmd *cmd) +{ + virDomainPtr dom = NULL; + int ret = -1; + size_t i, j; + virDomainFSInfoPtr *info; + + if (!(dom = vshCommandOptDomain(ctl, cmd, NULL))) + return false; + + ret = virDomainGetFSInfo(dom, &info, 0); + if (ret < 0) { + vshError(ctl, _("Unable to get filesystem information")); + goto cleanup; + } + if (ret == 0) { + vshError(ctl, _("No filesystems are mounted in the domain")); + goto cleanup; + } + + if (info) { + vshPrintExtra(ctl, "%-36s %-8s %-8s %s\n", + _("Mountpoint"), _("Name"), _("Type"), _("Target")); + vshPrintExtra(ctl, "-------------------------------------------------------------------\n"); + for (i = 0; i < ret; i++) { + vshPrintExtra(ctl, "%-36s %-8s %-8s ", + info[i]->mountpoint, info[i]->name, info[i]->fstype); + for (j = 0; j < info[i]->ndevAlias; j++) { + vshPrintExtra(ctl, "%s", info[i]->devAlias[j]); + if (j != info[i]->ndevAlias - 1) + vshPrint(ctl, ","); + } + vshPrint(ctl, "\n"); + + virDomainFSInfoFree(info[i]); + } + VIR_FREE(info); + } + + cleanup: + virDomainFree(dom); + return ret >= 0; +} + const vshCmdDef domManagementCmds[] = { {.name = "attach-device", .handler = cmdAttachDevice, @@ -12384,6 +12448,12 @@ const vshCmdDef domManagementCmds[] = { .info = info_domfsthaw, .flags = 0 }, + {.name = "domfsinfo", + .handler = cmdDomFSInfo, + .opts = opts_domfsinfo, + .info = info_domfsinfo, + .flags = 0 + }, {.name = "domfstrim", .handler = cmdDomFSTrim, .opts = opts_domfstrim, diff --git a/tools/virsh.pod b/tools/virsh.pod index 5a577f631e..da9c894690 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -1146,6 +1146,15 @@ be selected using the B parameter (e.g. "vnc", "spice", "rdp"). If I<--include-password> is specified, the SPICE channel password will be included in the URI. +=item B I + +Show a list of mounted filesystems within the running domain. The list contains +mountpoints, names of a mounted device in the guest, filesystem types, and +unique target names used in the domain XML (). + +Note that this command requires a guest agent configured and running in the +domain's guest OS. + =item B I [[I<--mountpoint>] B...] Freeze mounted filesystems within a running domain to prepare for consistent