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

liguang lig.fnst at cn.fujitsu.com
Tue Aug 7 08:00:18 UTC 2012


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 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