X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=v2v%2Fvirt-v2v.pl;h=11d7cfd23710e9557d7741fc81e927be7ebc45d6;hb=3fa23b14d28d8018f71f659d7e5902850695b24b;hp=5895eaa710f6879f8c6855b14f89900808767c6d;hpb=995715ebf9935a64f0321c09a527538706aa3cb7;p=libguestfs.git diff --git a/v2v/virt-v2v.pl b/v2v/virt-v2v.pl index 5895eaa..11d7cfd 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 @@ -83,9 +147,22 @@ 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, + "version" => \$version, + "connect|c=s" => \$uri, + "output|o=s" => \$output, ) or pod2usage (2); pod2usage (1) if $help; if ($version) { @@ -94,43 +171,72 @@ if ($version) { print "$h{major}.$h{minor}.$h{release}$h{extra}\n"; exit } -pod2usage ("$0: no image or VM names given") if @ARGV == 0; +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 @@ -149,6 +255,8 @@ from L. Richard W.M. Jones L +Matthew Booth L + =head1 COPYRIGHT Copyright (C) 2009 Red Hat Inc.