[libvirt] [PATCH V1] on special migration(domain defined, not started yet)

liguang lig.fnst at cn.fujitsu.com
Thu Aug 2 09:02:33 UTC 2012



From: liguang <lig.fnst at 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 at 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.
> 






More information about the libvir-list mailing list