X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=v2v%2Fvirt-v2v.pl;h=fb1f22049441cc415dd42bf314c0bb22bedc0893;hp=b7d96865537f010867a773b6b9146a69a3794ee7;hb=22eb7fc966bafebedfde437c9b9c9fb903a8bc35;hpb=6e790a9d6b225fad4ab080489bd8226c3adb3506 diff --git a/v2v/virt-v2v.pl b/v2v/virt-v2v.pl index b7d9686..fb1f220 100755 --- a/v2v/virt-v2v.pl +++ b/v2v/virt-v2v.pl @@ -28,21 +28,85 @@ use Getopt::Long; use Data::Dumper; use File::Temp qw/tempdir/; use XML::Writer; +use Locale::TextDomain 'libguestfs'; =encoding utf8 =head1 NAME -virt-v2v - Convert Xen guests to KVM +virt-v2v - Convert Xen or VMWare guests to KVM =head1 SYNOPSIS virt-v2v xen_name -o kvm_name + virt-v2v guest.ovf.zip -o kvm_name + virt-v2v guest.img [guest.img ...] =head1 DESCRIPTION +Virt-v2v converts guests from one virtualization hypervisor to +another. Currently it is limited in what it can convert. See the +table below. + + -------------------------------+---------------------------- + SOURCE | TARGET + -------------------------------+---------------------------- + Xen domain managed by | + libvirt | + | + Xen compatibility: | + - PV or FV kernel | KVM guest managed by + - with or without PV drivers | libvirt + - RHEL 3.9+, 4.8+, 5.3+ | - with virtio drivers + - Windows XP, 2003 | + | + -------------------------------+ + | + VMWare VMDK image with | + OVF metadata, exported from | + vSphere | + | + VMWare compatibility: | + - RHEL 3.9+, 4.8+, 5.3+ | + - VMWare tools | + | + -------------------------------+---------------------------- + +=head2 CONVERTING XEN DOMAINS + +For Xen domains managed by libvirt, perform the initial conversion +using: + + virt-v2v xen_name -o kvm_name + +where C is the libvirt Xen domain name, and C is +the (new) name for the converted KVM guest. + +Then test boot the new guest in KVM: + + virsh start kvm_name + virt-viewer kvm_name + +When you have verified that this works, shut down the new KVM domain +and I the changes by doing: + + virt-v2v --commit kvm_name + +I. + +Or you can I to the original Xen domain by doing: + + virt-v2v --rollback kvm_name + +B Do I try to run both the original Xen +domain and the KVM domain at the same time! This will cause guest +corruption. + +=head2 CONVERTING VMWARE GUESTS + +I @@ -62,6 +126,14 @@ Display brief help. =cut +my $version; + +=item B<--version> + +Display version number and exit. + +=cut + my $uri; =item B<--connect URI> | B<-c URI> @@ -75,47 +147,96 @@ then libvirt is not used at all. =cut +my $output; + +=item B<--output name> | B<-o name> + +Set the output guest name. + +=cut + +=back + +=cut + GetOptions ("help|?" => \$help, + "version" => \$version, "connect|c=s" => \$uri, + "output|o=s" => \$output, ) or pod2usage (2); pod2usage (1) if $help; -pod2usage ("$0: no image or VM names given") if @ARGV == 0; +if ($version) { + my $g = Sys::Guestfs->new (); + my %h = $g->version (); + print "$h{major}.$h{minor}.$h{release}$h{extra}\n"; + exit +} +pod2usage (__"virt-v2v: no image or VM names given") if @ARGV == 0; + +# XXX This should be an option. Disable for now until we get +# downloads working reliably. +my $use_windows_registry = 0; + +my @params = (\@ARGV); +if ($uri) { + push @params, address => $uri; +} +my ($g, $conn, $dom) = open_guest (@params); + +$g->launch (); +$g->wait_ready (); + +# List of possible filesystems. +my @partitions = get_partitions ($g); + +# Now query each one to build up a picture of what's in it. +my %fses = + inspect_all_partitions ($g, \@partitions, + use_windows_registry => $use_windows_registry); + +#print "fses -----------\n"; +#print Dumper(\%fses); + +my $oses = inspect_operating_systems ($g, \%fses); + +#print "oses -----------\n"; +#print Dumper($oses); + +# Only work on single-root operating systems. +my $root_dev; +my @roots = keys %$oses; +die __"no root device found in this operating system image" if @roots == 0; +die __"multiboot operating systems are not supported by v2v" if @roots > 1; +$root_dev = $roots[0]; + +# Mount up the disks and check for applications. + +my $os = $oses->{$root_dev}; +mount_operating_system ($g, $os); +inspect_in_detail ($g, $os); +$g->umount_all (); + + + + + + + + + + + + + -# my $g; -# if ($uri) { -# $g = open_guest (\@ARGV, rw => $rw, address => $uri); -# } else { -# $g = open_guest (\@ARGV, rw => $rw); -# } -# $g->launch (); -# $g->wait_ready (); -# # List of possible filesystems. -# my @partitions = get_partitions ($g); -# # Now query each one to build up a picture of what's in it. -# my %fses = -# inspect_all_partitions ($g, \@partitions, -# use_windows_registry => $windows_registry); -# #print "fses -----------\n"; -# #print Dumper(\%fses); -# my $oses = inspect_operating_systems ($g, \%fses); -# #print "oses -----------\n"; -# #print Dumper($oses); -# # Mount up the disks and check for applications. -# my $root_dev; -# foreach $root_dev (sort keys %$oses) { -# my $os = $oses->{$root_dev}; -# mount_operating_system ($g, $os); -# inspect_in_detail ($g, $os); -# $g->umount_all (); -# } =head1 SEE ALSO @@ -134,6 +255,8 @@ from L. Richard W.M. Jones L +Matthew Booth L + =head1 COPYRIGHT Copyright (C) 2009 Red Hat Inc.