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.