X-Git-Url: http://git.annexia.org/?p=libguestfs.git;a=blobdiff_plain;f=tools%2Fvirt-resize;h=1e8a6c7b4a9f44a153f7e3bf18ce9e0db4a80b46;hp=6e11d475ac7c4000eb29525d28e035e7e22e20d2;hb=a6054bf90f39a84c1a8f8f7d3b9e81e84cb13696;hpb=0dc1f8e7aeb390e72125f459930850b8050318df diff --git a/tools/virt-resize b/tools/virt-resize index 6e11d47..1e8a6c7 100755 --- a/tools/virt-resize +++ b/tools/virt-resize @@ -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). @@ -230,6 +234,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 @@ -419,7 +442,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 +515,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 +564,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,8 +593,13 @@ sub launch_guestfs { $g = Sys::Guestfs->new (); $g->set_trace (1) if $debug; - $g->add_drive_ro ($infile); - $g->add_drive ($outfile); + 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_progress_callback (\&progress_callback) unless $quiet; $g->launch (); } @@ -1180,7 +1240,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 +1393,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"; } $_; @@ -1380,6 +1442,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 @@ -1396,10 +1475,16 @@ hand-calculating sector offsets, which is something that virt-resize was designed to avoid. If you want to see the guestfish-equivalent commands that virt-resize runs, use the C<--debug> flag. +=head1 SHELL QUOTING + +Libvirt guest names can contain arbitrary characters, some of which +have meaning to the shell such as C<#> and space. You may need to +quote or escape these characters on the command line. See the shell +manual page L for details. + =head1 SEE ALSO -L, -L, +L, L, L, L, @@ -1410,6 +1495,11 @@ L, L, L, L, +L, +L, +L, +L, +L, L, L.