Hi, Eric
what do you think of this kludged way of
off-line migration?
在 2012-08-02四的 17:02 +0800,liguang写道:
From: liguang <lig.fnst(a)cn.fujitsu.com>
a roughly way for offline-migrate (domain defined,
not started yet), now can do like this:
migrate --hard-migrate --xml dom.xml dom qemu+ssh://target/system
this patch will push dom.xml and all disk images to target
Signed-off-by: liguang <lig.fnst(a)cn.fujitsu.com>
---
tools/virsh.c | 76
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 76 insertions(+), 0 deletions(-)
diff --git a/tools/virsh.c b/tools/virsh.c
index 53d1825..5793233 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -7344,9 +7344,75 @@ static const vshCmdOptDef opts_migrate[] = {
{"dname", VSH_OT_DATA, 0, N_("rename to new name during migration
(if supported)")},
{"timeout", VSH_OT_INT, 0, N_("force guest to suspend if live
migration exceeds timeout (in seconds)")},
{"xml", VSH_OT_STRING, 0, N_("filename containing updated XML for
the target")},
+ {"hard-migrate", VSH_OT_BOOL, 0, N_("migration when there's no
domain")},
{NULL, 0, 0, NULL}
};
+#define VIR_MIGRATE_HARD 1 << 10
+#define push_file(file) { \
+ virAsprintf(&topath, "%s:%s", to, file); \
+ cmd = virCommandNewArgList("scp", file, topath, NULL); \
+ vshPrint(ctl, "pushing %s to %s\n", file, to); \
+ if (virCommandRunAsync(cmd, NULL) < 0 || \
+ virCommandWait(cmd, NULL) < 0) { \
+ virshReportError(ctl); \
+ goto cleanup; \
+ } \
+}
+
+static void
+vshMigrateHard(vshControl *ctl, char *doc, char dst[])
+{
+ xmlDocPtr xml = NULL;
+ xmlXPathObjectPtr obj= NULL;
+ xmlXPathContextPtr ctxt = NULL;
+ xmlNodePtr *disks = NULL;
+ virCommandPtr cmd;
+ int i = 0, ret = 0;
+ int outfd = STDOUT_FILENO;
+ int errfd = STDERR_FILENO;
+ char *src[] = {NULL}, *to, *topath;
+
+ if (!vshConnectionUsability(ctl, ctl->conn))
+ return;
+
+ xml = virXMLParseFileCtxt(doc, &ctxt);
+ if (!xml) {
+ vshError(NULL, "%s", _("Fail to get domain information
from"));
+ goto cleanup;
+ }
+
+ ret = virXPathNodeSet("./devices/disk", ctxt, &disks);
+ if (ret < 0) {
+ vshError(NULL, "%s", _("Fail to get disk node"));
+ goto cleanup;
+ }
+
+ to = strtok(dst, "/");
+ to = strtok(NULL, "/");
+ virCommandSetInputFD(cmd, STDIN_FILENO);
+ virCommandSetOutputFD(cmd, &outfd);
+ virCommandSetErrorFD(cmd, &errfd);
+
+ push_file(doc);
+
+ for (i = 0 ; i < ret ; i++) {
+ ctxt->node = disks[i];
+ src[i] = virXPathString("string(./source/@file"
+ "|./source/@dir"
+ "|./source/@name)", ctxt);
+ push_file(src[i]);
+ }
+
+cleanup:
+ xmlXPathFreeObject(obj);
+ xmlXPathFreeContext(ctxt);
+ xmlFreeDoc(xml);
+ virCommandFree(cmd);
+ if (src)
+ VIR_FREE(src); return;
+}
+
static void
doMigrate (void *opaque)
{
@@ -7413,12 +7479,22 @@ doMigrate (void *opaque)
if (vshCommandOptBool(cmd, "unsafe"))
flags |= VIR_MIGRATE_UNSAFE;
+ if (vshCommandOptBool(cmd, "hard-migrate")) {
+ flags |= VIR_MIGRATE_HARD;
+ if (xmlfile == NULL)
+ vshError(ctl, _("please specify xmlfile for
hard-migrate"));
+ }
if (xmlfile &&
virFileReadAll(xmlfile, 8192, &xml) < 0) {
vshError(ctl, _("file '%s' doesn't exist"), xmlfile);
goto out;
}
+ if (flags & VIR_MIGRATE_HARD) {
+ vshMigrateHard(ctl, (char *)xmlfile, (char *)desturi);
+ goto out;
+ }
+
if ((flags & VIR_MIGRATE_PEER2PEER) ||
vshCommandOptBool(cmd, "direct")) {
/* For peer2peer migration or direct migration we only expect
one URI
--
1.7.2.5
在 2012-08-01三的 06:13 -0600,Eric Blake写道:
> On 07/31/2012 09:30 PM, liguang wrote:
> > Hi, All
> >
> > If a VM domain defined, but not started yet,
> > and I want to migrate it to another server,
> > so that It can be started at there, what's
> > should i do? or is it rational?
>
> Yes it is rational, and you're not the first to request it.
> Unfortunately, we haven't yet taught 'virsh migrate' to support offline
> migration, even though (or because?) it is dead simple to cobble
> together yourself:
>
> source$ virsh dumpxml $dom > file.xml
> dest$ virsh define file.xml
>
> optionally followed by
> source$ virsh undefine $dom
>
> Patches are welcome to make 'virsh migrate' automatically handle an
> offline migration.
>