[Pkg-libvirt-commits] [libguestfs] 41/66: v2v: Add -o qemu output mode and --qemu-boot flag.
Hilko Bengen
bengen at moszumanska.debian.org
Fri Oct 3 14:47:45 UTC 2014
This is an automated email from the git hooks/post-receive script.
bengen pushed a commit to annotated tag debian/1%1.27.54-1
in repository libguestfs.
commit d1145f20cbba96dab728b04e50a4cb074193ee89
Author: Richard W.M. Jones <rjones at redhat.com>
Date: Tue Sep 23 12:22:26 2014 +0100
v2v: Add -o qemu output mode and --qemu-boot flag.
This lets you write a shell script that runs the guest under qemu.
Specifying the --qemu-boot flag also boots the guest after conversion.
---
po/POTFILES-ml | 1 +
v2v/Makefile.am | 3 ++
v2v/cmdline.ml | 22 +++++++++++
v2v/output_qemu.ml | 103 +++++++++++++++++++++++++++++++++++++++++++++++++
v2v/output_qemu.mli | 24 ++++++++++++
v2v/test-v2v-o-qemu.sh | 64 ++++++++++++++++++++++++++++++
v2v/virt-v2v.pod | 42 ++++++++++++++++----
7 files changed, 251 insertions(+), 8 deletions(-)
diff --git a/po/POTFILES-ml b/po/POTFILES-ml
index de37bf7..8fd0f86 100644
--- a/po/POTFILES-ml
+++ b/po/POTFILES-ml
@@ -102,6 +102,7 @@ v2v/output_glance.ml
v2v/output_libvirt.ml
v2v/output_local.ml
v2v/output_null.ml
+v2v/output_qemu.ml
v2v/output_rhev.ml
v2v/output_vdsm.ml
v2v/stringMap.ml
diff --git a/v2v/Makefile.am b/v2v/Makefile.am
index 4b57aca..e9620bd 100644
--- a/v2v/Makefile.am
+++ b/v2v/Makefile.am
@@ -47,6 +47,7 @@ SOURCES_MLI = \
output_libvirt.mli \
output_local.mli \
output_null.mli \
+ output_qemu.mli \
output_rhev.mli \
output_vdsm.mli \
stringMap.mli \
@@ -77,6 +78,7 @@ SOURCES_ML = \
output_glance.ml \
output_libvirt.ml \
output_local.ml \
+ output_qemu.ml \
output_rhev.ml \
output_vdsm.ml \
cmdline.ml \
@@ -222,6 +224,7 @@ TESTS = \
test-v2v-o-glance.sh \
test-v2v-o-libvirt.sh \
test-v2v-o-null.sh \
+ test-v2v-o-qemu.sh \
test-v2v-o-rhev.sh \
test-v2v-o-vdsm-options.sh \
test-v2v-of-option.sh \
diff --git a/v2v/cmdline.ml b/v2v/cmdline.ml
index 67927a1..1e059fc 100644
--- a/v2v/cmdline.ml
+++ b/v2v/cmdline.ml
@@ -42,6 +42,7 @@ let parse_cmdline () =
let output_name = ref "" in
let output_storage = ref "" in
let print_source = ref false in
+ let qemu_boot = ref false in
let quiet = ref false in
let vdsm_image_uuid = ref "" in
let vdsm_vm_uuid = ref "" in
@@ -85,6 +86,7 @@ let parse_cmdline () =
| "disk" | "local" -> output_mode := `Local
| "null" -> output_mode := `Null
| "ovirt" | "rhev" -> output_mode := `RHEV
+ | "qemu" -> output_mode := `QEmu
| "vdsm" -> output_mode := `VDSM
| s ->
error (f_"unknown -o option: %s") s
@@ -135,6 +137,7 @@ let parse_cmdline () =
"-on", Arg.Set_string output_name, "name " ^ s_"Rename guest when converting";
"-os", Arg.Set_string output_storage, "storage " ^ s_"Set output storage location";
"--print-source", Arg.Set print_source, " " ^ s_"Print source and stop";
+ "--qemu-boot", Arg.Set qemu_boot, " " ^ s_"Boot in qemu (-o qemu only)";
"-q", Arg.Set quiet, " " ^ s_"Quiet output";
"--quiet", Arg.Set quiet, ditto;
"--root", Arg.String set_root_choice,"ask|... " ^ s_"How to choose root filesystem";
@@ -194,6 +197,7 @@ read the man page virt-v2v(1).
let output_name = match !output_name with "" -> None | s -> Some s in
let output_storage = !output_storage in
let print_source = !print_source in
+ let qemu_boot = !qemu_boot in
let quiet = !quiet in
let root_choice = !root_choice in
let vdsm_image_uuid = !vdsm_image_uuid in
@@ -271,6 +275,8 @@ read the man page virt-v2v(1).
error (f_"-o glance: -oc option cannot be used in this output mode");
if output_storage <> "" then
error (f_"-o glance: -os option cannot be used in this output mode");
+ if qemu_boot then
+ error (f_"-o glance: --qemu-boot option cannot be used in this output mode");
if vmtype <> None then
error (f_"--vmtype option cannot be used with '-o glance'");
if not do_copy then
@@ -281,6 +287,8 @@ read the man page virt-v2v(1).
| `Libvirt ->
let output_storage =
if output_storage = "" then "default" else output_storage in
+ if qemu_boot then
+ error (f_"-o libvirt: --qemu-boot option cannot be used in this output mode");
if vmtype <> None then
error (f_"--vmtype option cannot be used with '-o libvirt'");
if not do_copy then
@@ -293,6 +301,8 @@ read the man page virt-v2v(1).
if not (is_directory output_storage) then
error (f_"-os %s: output directory does not exist or is not a directory")
output_storage;
+ if qemu_boot then
+ error (f_"-o local: --qemu-boot option cannot be used in this output mode");
if vmtype <> None then
error (f_"--vmtype option cannot be used with '-o local'");
Output_local.output_local verbose output_storage
@@ -302,18 +312,30 @@ read the man page virt-v2v(1).
error (f_"-o null: -oc option cannot be used in this output mode");
if output_storage <> "" then
error (f_"-o null: -os option cannot be used in this output mode");
+ if qemu_boot then
+ error (f_"-o null: --qemu-boot option cannot be used in this output mode");
if vmtype <> None then
error (f_"--vmtype option cannot be used with '-o null'");
Output_null.output_null verbose
+ | `QEmu ->
+ if not (is_directory output_storage) then
+ error (f_"-os %s: output directory does not exist or is not a directory")
+ output_storage;
+ Output_qemu.output_qemu verbose output_storage qemu_boot
+
| `RHEV ->
if output_storage = "" then
error (f_"-o rhev: output storage was not specified, use '-os'");
+ if qemu_boot then
+ error (f_"-o rhev: --qemu-boot option cannot be used in this output mode");
Output_rhev.output_rhev verbose output_storage vmtype output_alloc
| `VDSM ->
if output_storage = "" then
error (f_"-o vdsm: output storage was not specified, use '-os'");
+ if qemu_boot then
+ error (f_"-o vdsm: --qemu-boot option cannot be used in this output mode");
if vdsm_image_uuid = "" || vdsm_vm_uuid = "" then
error (f_"-o vdsm: either --vdsm-image-uuid or --vdsm-vm-uuid was not specified");
let vdsm_params = {
diff --git a/v2v/output_qemu.ml b/v2v/output_qemu.ml
new file mode 100644
index 0000000..fafc9b8
--- /dev/null
+++ b/v2v/output_qemu.ml
@@ -0,0 +1,103 @@
+(* virt-v2v
+ * Copyright (C) 2009-2014 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+open Printf
+
+open Common_gettext.Gettext
+open Common_utils
+
+open Types
+open Utils
+
+class output_qemu verbose dir qemu_boot =
+object
+ inherit output verbose
+
+ method as_options =
+ sprintf "-o qemu -os %s%s" dir (if qemu_boot then " --qemu-boot" else "")
+
+ method prepare_targets source targets =
+ List.map (
+ fun t ->
+ let target_file = dir // source.s_name ^ "-" ^ t.target_overlay.ov_sd in
+ { t with target_file = target_file }
+ ) targets
+
+ method create_metadata source targets guestcaps _ =
+ let name = source.s_name in
+ let file = dir // name ^ ".sh" in
+
+ let chan = open_out file in
+
+ let fpf fs = fprintf chan fs in
+ fpf "#!/bin/sh -\n";
+ fpf "\n";
+ fpf "qemu-system-%s \\\n" guestcaps.gcaps_arch;
+ fpf "\t-no-user-config -nodefaults \\\n";
+ fpf "\t-name %s \\\n" (quote source.s_name);
+ fpf "\t-machine accel=kvm:tcg \\\n";
+ fpf "\t-m %Ld \\\n" (source.s_memory /^ 1024L /^ 1024L);
+ if source.s_vcpu > 1 then
+ fpf "\t-smp %d \\\n" source.s_vcpu;
+
+ let block_bus =
+ match guestcaps.gcaps_block_bus with
+ | Virtio_blk -> "virtio"
+ | IDE -> "ide" in
+ List.iter (
+ fun t ->
+ let qemu_quoted_filename = replace_str t.target_file "," ",," in
+ let drive_param =
+ sprintf "file=%s,format=%s,if=%s"
+ qemu_quoted_filename t.target_format block_bus in
+ fpf "\t-drive %s\\\n" (quote drive_param)
+ ) targets;
+
+ let net_bus =
+ match guestcaps.gcaps_net_bus with
+ | Virtio_net -> "virtio-net-pci"
+ | E1000 -> "e1000"
+ | RTL8139 -> "rtl8139" in
+ List.iteri (
+ fun i nic ->
+ fpf "\t-netdev user,id=net%d \\\n" i;
+ fpf "\t-device %s,netdev=net%d%s \\\n"
+ net_bus i (match nic.s_mac with None -> "" | Some mac -> ",mac=" ^ mac)
+ ) source.s_nics;
+
+ (* Add a serial console. *)
+ fpf "\t-serial stdio\n";
+
+ (* XXX Missing:
+ * - removable devices
+ * - display
+ *)
+
+ close_out chan;
+
+ Unix.chmod file 0o755;
+
+ (* If --qemu-boot option was specified then we should boot the guest. *)
+ if qemu_boot then (
+ let cmd = sprintf "%s &" (quote file) in
+ ignore (Sys.command cmd)
+ )
+end
+
+let output_qemu = new output_qemu
+let () = Modules_list.register_output_module "qemu"
diff --git a/v2v/output_qemu.mli b/v2v/output_qemu.mli
new file mode 100644
index 0000000..91c37c5
--- /dev/null
+++ b/v2v/output_qemu.mli
@@ -0,0 +1,24 @@
+(* virt-v2v
+ * Copyright (C) 2009-2014 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ *)
+
+(** [-o qemu] target. *)
+
+val output_qemu : bool -> string -> bool -> Types.output
+(** [output_qemu verbose filename qemu_boot] creates and returns a new
+ {!Types.output} object specialized for writing output to local
+ files with a qemu script to start the guest locally. *)
diff --git a/v2v/test-v2v-o-qemu.sh b/v2v/test-v2v-o-qemu.sh
new file mode 100755
index 0000000..9de2b56
--- /dev/null
+++ b/v2v/test-v2v-o-qemu.sh
@@ -0,0 +1,64 @@
+#!/bin/bash -
+# libguestfs virt-v2v test script
+# Copyright (C) 2014 Red Hat Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+# Test -o qemu.
+
+unset CDPATH
+export LANG=C
+set -e
+
+if [ -n "$SKIP_TEST_V2V_O_QEMU_SH" ]; then
+ echo "$0: test skipped because environment variable is set"
+ exit 77
+fi
+
+if [ "$(guestfish get-backend)" = "uml" ]; then
+ echo "$0: test skipped because UML backend does not support network"
+ exit 77
+fi
+
+abs_top_builddir="$(cd ..; pwd)"
+libvirt_uri="test://$abs_top_builddir/tests/guests/guests.xml"
+
+f=../tests/guests/windows.img
+if ! test -f $f || ! test -s $f; then
+ echo "$0: test skipped because phony Windows image was not created"
+ exit 77
+fi
+
+virt_tools_data_dir=${VIRT_TOOLS_DATA_DIR:-/usr/share/virt-tools}
+if ! test -r $virt_tools_data_dir/rhsrvany.exe; then
+ echo "$0: test skipped because rhsrvany.exe is not installed"
+ exit 77
+fi
+
+d=test-v2v-o-qemu.d
+rm -rf $d
+mkdir $d
+
+$VG virt-v2v --debug-gc \
+ -i libvirt -ic "$libvirt_uri" windows \
+ -o qemu -os $d
+
+# Test that the disk was created.
+test -f $d/windows-sda
+
+# Test that the script was created and is executable.
+test -x $d/windows.sh
+
+rm -r $d
diff --git a/v2v/virt-v2v.pod b/v2v/virt-v2v.pod
index 1230fe4..d90ad1b 100644
--- a/v2v/virt-v2v.pod
+++ b/v2v/virt-v2v.pod
@@ -31,12 +31,12 @@ libguestfs E<ge> 1.28.
=head1 INPUT AND OUTPUT MODES
┌────────────┐ ┌─────────▶ -o null
- -i disk ───────────┐ │ │ │┌───────▶ -o local
- -i ova ─────────┐ └──▶ │ virt-v2v │ ─┘│
- └────▶ │ conversion │ ──┘┌────────────┐
- ESX ──▶┌────────────┐ │ server │ ───▶ -o libvirt │─▶ KVM
- Xen ──▶│ -i libvirt ──▶ │ │ │ (default) │
- ... ──▶│ (default) │ │ │ ──┐└────────────┘
+ -i disk ───────────┐ │ │ ─┘┌───────▶ -o local
+ -i ova ─────────┐ └──▶ │ virt-v2v │ ──┘┌───────▶ -o qemu
+ └────▶ │ conversion │ ───┘┌────────────┐
+ ESX ──▶┌────────────┐ │ server │ ────▶ -o libvirt │─▶ KVM
+ Xen ──▶│ -i libvirt ──▶ │ │ │ (default) │
+ ... ──▶│ (default) │ │ │ ──┐ └────────────┘
└────────────┘ │ │ ─┐└──────▶ -o glance
-i libvirtxml ────────▶ │ │ ┐└─────────▶ -o rhev
└────────────┘ └──────────▶ -o vdsm
@@ -64,7 +64,11 @@ I<-o libvirt> is used for writing to any libvirt target. Libvirt can
connect to local or remote KVM hypervisors. The I<-oc> option selects
the precise libvirt target.
-I<-o local> is used to write to a local disk image (mainly for testing).
+I<-o local> is used to write to a local disk image with a local
+libvirt configuration file (mainly for testing).
+
+I<-o qemu> writes to a local disk image with a shell script for
+booting the guest directly in qemu (mainly for testing).
I<-o rhev> is used to write to a RHEV-M / oVirt target. I<-o vdsm>
is only used when virt-v2v runs under VDSM control.
@@ -134,6 +138,11 @@ Since C<guest-domain.xml> contains the path(s) to the guest disk
image(s) you do not need to specify the name of the disk image on the
command line.
+To convert a local disk image and immediately boot it in local
+qemu, do:
+
+ virt-v2v -i disk disk.img -o qemu -os /var/tmp --qemu-boot
+
=head1 OPTIONS
=over 4
@@ -293,6 +302,17 @@ written.
This is the same as I<-o rhev>.
+=item B<-o qemu>
+
+Set the output method to I<qemu>.
+
+This is similar to I<-o local>, except that a shell script is written
+which you can use to boot the guest in qemu. The converted disks and
+shell script are written to the directory specified by I<-os>.
+
+When using this output mode, you can also specify the I<--qemu-boot>
+option which boots the guest under qemu immediately.
+
=item B<-o rhev>
Set the output method to I<rhev>.
@@ -341,7 +361,8 @@ The location of the storage for the converted guest.
For I<-o libvirt>, this is a libvirt directory pool
(see S<C<virsh pool-list>>) or pool UUID.
-For I<-o local>, this is a directory name. The directory must exist.
+For I<-o local> and I<-o qemu>, this is a directory name. The
+directory must exist.
For I<-o rhev>, this can be an NFS path of the Export Storage Domain
of the form C<E<lt>hostE<gt>:E<lt>pathE<gt>>, eg:
@@ -366,6 +387,11 @@ Print information about the source guest and stop. This option is
useful when you are setting up network and bridge maps.
See L</NETWORKS AND BRIDGES>.
+=item B<--qemu-boot>
+
+When using I<-o qemu> only, this boots the guest immediately after
+virt-v2v finishes.
+
=item B<-q>
=item B<--quiet>
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-libvirt/libguestfs.git
More information about the Pkg-libvirt-commits
mailing list