X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=tools%2Fvirt-resize;h=5d0673a3fc422cead8ac05e97c196fecba08c14d;hb=aed8f220d279e910e0f398fea6fa674cc6a63783;hp=0f0679ed4fbc5d374be7b61ac38cb62ca8c80cbe;hpb=94fa736b64591a374e49250173c9cdcc7f4e1211;p=libguestfs.git diff --git a/tools/virt-resize b/tools/virt-resize index 0f0679e..5d0673a 100755 --- a/tools/virt-resize +++ b/tools/virt-resize @@ -1,6 +1,6 @@ #!/usr/bin/perl -w # virt-resize -# Copyright (C) 2010 Red Hat Inc. +# Copyright (C) 2010-2011 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 @@ -58,10 +58,8 @@ B be used on live virtual machines - for consistent results, shut the virtual machine down before resizing it. If you are not familiar with the associated tools: -L, -L and -L, -we recommend you go and read those manual pages first. +L and L, we recommend you go and read +those manual pages first. =head1 EXAMPLES @@ -69,7 +67,7 @@ Copy C to C, extending one of the guest's partitions to fill the extra 5GB of space. truncate -r olddisk newdisk; truncate -s +5G newdisk - virt-list-partitions -lht olddisk + virt-filesystems --long -h --all -a olddisk # Note "/dev/sda2" is a partition inside the "olddisk" file. virt-resize --expand /dev/sda2 olddisk newdisk @@ -78,6 +76,11 @@ remaining space to /dev/sda2: virt-resize --resize /dev/sda1=+200M --expand /dev/sda2 olddisk newdisk +As above, but the output format will be uncompressed qcow2: + + qemu-img create -f qcow2 newdisk.qcow2 15G + virt-resize --expand /dev/sda2 olddisk newdisk.qcow2 + =head1 DETAILED USAGE =head2 EXPANDING A VIRTUAL MACHINE DISK @@ -99,13 +102,14 @@ can use C like this to find the disk image name: =item 3. Look at current sizing -Use L to display the current partitions and +Use L to display the current partitions and sizes: - # virt-list-partitions -lht /dev/vg/lv_guest - /dev/sda1 ext3 101.9M - /dev/sda2 pv 7.9G - /dev/sda device 8.0G + # virt-filesystems --long --parts --blkdevs -h -a /dev/vg/lv_guest + Name Type Size Parent + /dev/sda1 partition 101M /dev/sda + /dev/sda2 partition 7.9G /dev/sda + /dev/sda device 8.0G - (This example is a virtual machine with an 8 GB disk which we would like to expand up to 10 GB). @@ -168,9 +172,7 @@ PV, then if virt-resize knows how, it will resize the contents, the equivalent of calling a command such as L, L or L. However virt-resize does not know how to resize some filesystems, so you would have to online -resize them after booting the guest. And virt-resize also does not -resize anything inside an LVM PV, it just resizes the PV itself and -leaves the user to resize any LVs inside that PV as desired. +resize them after booting the guest. Other options are covered below. @@ -230,6 +232,25 @@ contents of a partition. Deleting a partition removes it completely, but note that it also renumbers any partitions after the one which is deleted, which can leave some guests unbootable. +=head2 QCOW2 AND NON-SPARSE RAW FORMATS + +If the input disk is in qcow2 format, then you may prefer that the +output is in qcow2 format as well. Alternately, virt-resize can +convert the format on the fly. The output format is simply determined +by the format of the empty output container that you provide. Thus to +create qcow2 output, use: + + qemu-img create [-c] -f qcow2 outdisk [size] + +instead of the truncate command (use C<-c> for a compressed disk). + +Similarly, to get non-sparse raw output use: + + fallocate -l size outdisk + +(on older systems that don't have the L command use +C
) + =head1 OPTIONS =over 4 @@ -338,9 +359,9 @@ Windows will check the disk. =item * -LVM PVs (physical volumes). However virt-resize does I -resize anything inside the PV. The user will have to resize -LVs as desired. +LVM PVs (physical volumes). virt-resize does not usually resize +anything inside the PV, but see the C<--LV-expand> option. The user +could also resize LVs as desired after boot. =back @@ -419,7 +440,7 @@ The contents of the LV are also resized if virt-resize knows how to do that. You can stop virt-resize from trying to expand the content by using the option C<--no-expand-content>. -Use L to list the filesystems in +Use L to list the filesystems in the guest. You can give this option multiple times, I it doesn't @@ -492,6 +513,36 @@ my $quiet; Don't print the summary. +=cut + +my $format; + +=item B<--format> raw + +Specify the format of the input disk image. If this flag is not +given then it is auto-detected from the image itself. + +If working with untrusted raw-format guest disk images, you should +ensure the format is always specified. + +Note that this option I affect the output format. +See L. + +=cut + +my $output_format; + +=item B<--output-format> raw + +Specify the format of the output disk image. If this flag is not +given then it is auto-detected from the image itself. + +If working with untrusted raw-format guest disk images, you should +ensure the format is always specified. + +Note that you still need to create the output disk with the right +format. See L. + =back =cut @@ -511,6 +562,8 @@ GetOptions ("help|?" => \$help, "d|debug" => \$debug, "n|dryrun|dry-run" => \$dryrun, "q|quiet" => \$quiet, + "format=s" => \$format, + "output-format=s" => \$output_format, ) or pod2usage (2); pod2usage (1) if $help; if ($version) { @@ -538,9 +591,15 @@ sub launch_guestfs { $g = Sys::Guestfs->new (); $g->set_trace (1) if $debug; - $g->add_drive_ro ($infile); - $g->add_drive ($outfile); - $g->set_progress_callback (\&progress_callback) unless $quiet; + my @args = ($infile); + push @args, readonly => 1; + push @args, format => $format if defined $format; + $g->add_drive_opts (@args); + @args = ($outfile); + push @args, format => $output_format if defined $output_format; + $g->add_drive_opts (@args); + $g->set_event_callback (\&progress_callback, $Sys::Guestfs::EVENT_PROGRESS) + unless $quiet; $g->launch (); } @@ -1180,7 +1239,9 @@ sub restart_appliance $g = Sys::Guestfs->new (); $g->set_trace (1) if $debug; - $g->add_drive ($outfile); + my @args = ($outfile); + push @args, format => $output_format if defined $output_format; + $g->add_drive_opts (@args); $g->launch (); # Target partitions have changed from /dev/sdb to /dev/sda, @@ -1331,7 +1392,7 @@ sub canonicalize { local $_ = shift; - if (m{^/dev/[hv]d([a-z]\d)$}) { + if (m{^/dev/[hv]d([a-z]\d*)$}) { return "/dev/sd$1"; } $_; @@ -1341,10 +1402,15 @@ sub canonicalize # I intend to use an external library for this at some point (XXX). sub progress_callback { - my $proc_nr = shift; - my $serial = shift; - my $position = shift; - my $total = shift; + my $event = shift; + my $event_handle = shift; + my $buf = shift; + my $array = shift; + + my $proc_nr = $array->[0]; + my $serial = $array->[1]; + my $position = $array->[2]; + my $total = $array->[3]; my $ratio = $position / $total; if ($ratio < 0) { $ratio = 0 } @@ -1380,6 +1446,23 @@ Windows may initiate a lengthy "chkdsk" on first boot after a resize, if NTFS partitions have been expanded. This is just a safety check and (unless it find errors) is nothing to worry about. +=head2 GUEST BOOT STUCK AT "GRUB" + +If a Linux guest does not boot after resizing, and the boot is stuck +after printing C on the console, try reinstalling grub. This +sometimes happens on older (RHEL 5-era) guests, for reasons we don't +fully understand, although we think is to do with partition alignment. + + guestfish -i -a newdisk + > cat /boot/grub/device.map + # check the contents of this file are sensible or + # edit the file if necessary + > grub-install / /dev/vda + > exit + +For more flexible guest reconfiguration, including if you need to +specify other parameters to grub-install, use L. + =head1 ALTERNATIVE TOOLS There are several proprietary tools for resizing partitions. We @@ -1405,8 +1488,7 @@ manual page L for details. =head1 SEE ALSO -L, -L, +L, L, L, L, @@ -1418,6 +1500,10 @@ L, L, L, L, +L, +L, +L, +L, L, L.