diff options
author | Richard Jones <rjones@redhat.com> | 2010-03-22 18:38:31 +0000 |
---|---|---|
committer | Richard Jones <rjones@redhat.com> | 2010-03-23 21:56:14 +0000 |
commit | def627e4daf2d32cebf91f5e01f44a0b7e512129 (patch) | |
tree | fef108dc2be0d7ac95d0b15317d49bedf2109aa6 /tools/virt-list-partitions | |
parent | b6483061c25e90ae1b9e016812dea8e3756d6c23 (diff) | |
download | libguestfs-def627e4daf2d32cebf91f5e01f44a0b7e512129.tar.gz libguestfs-def627e4daf2d32cebf91f5e01f44a0b7e512129.tar.xz libguestfs-def627e4daf2d32cebf91f5e01f44a0b7e512129.zip |
New tools: virt-resize and virt-list-partitions.
Virt-resize is the main contribution here, a program which can
be used to expand and shrink partitions in disk images.
Virt-list-partitions is used as an ancillary tool for planning
resize operations.
Diffstat (limited to 'tools/virt-list-partitions')
-rwxr-xr-x | tools/virt-list-partitions | 224 |
1 files changed, 224 insertions, 0 deletions
diff --git a/tools/virt-list-partitions b/tools/virt-list-partitions new file mode 100755 index 00000000..b8bc0cc1 --- /dev/null +++ b/tools/virt-list-partitions @@ -0,0 +1,224 @@ +#!/usr/bin/perl -w +# virt-list-partitions +# Copyright (C) 2010 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +use warnings; +use strict; + +use Sys::Guestfs; +use Sys::Guestfs::Lib qw(open_guest); +use Pod::Usage; +use Getopt::Long; +use Locale::TextDomain 'libguestfs'; + +=encoding utf8 + +=head1 NAME + +virt-list-partitions - List partitions in a virtual machine or disk image + +=head1 SYNOPSIS + + virt-list-partitions [--options] domname + + virt-list-partitions [--options] disk.img [disk.img ...] + +=head1 DESCRIPTION + +C<virt-list-partitions> is a command line tool to list +the partitions that are contained in a virtual machine or +disk image. It is mainly useful as a first step to using +L<virt-resize(1)>. + +C<virt-list-partitions> is just a simple wrapper around +L<libguestfs(3)> functionality. For more complex cases you should +look at the L<guestfish(1)> tool. + +=head1 OPTIONS + +=over 4 + +=cut + +my $help; + +=item B<--help> + +Display brief help. + +=cut + +my $version; + +=item B<--version> + +Display version number and exit. + +=cut + +my $uri; + +=item B<--connect URI> | B<-c URI> + +If using libvirt, connect to the given I<URI>. If omitted, then we +connect to the default libvirt hypervisor. + +If you specify guest block devices directly, then libvirt is not used +at all. + +=cut + +my $long; + +=item B<-l> | B<--long> + +With this option, C<virt-list-partitions> displays the type +and size of each partition too (where "type" means C<ext3>, C<pv> etc.) + +=cut + +my $human; + +=item B<-h> | B<--human-readable> + +Show sizes in human-readable form (eg. "1G"). + +=back + +=cut + +# Configure bundling, otherwise '-lh' is unrecognized. +Getopt::Long::Configure ("bundling"); + +GetOptions ("help|?" => \$help, + "version" => \$version, + "connect|c=s" => \$uri, + "long|l" => \$long, + "human-readable|h" => \$human, + ) or pod2usage (2); +pod2usage (1) if $help; +if ($version) { + my $g = Sys::Guestfs->new (); + my %h = $g->version (); + print "$h{major}.$h{minor}.$h{release}$h{extra}\n"; + exit +} + +pod2usage (__"virt-list-partitions: no image or VM name given") + if @ARGV <= 0; + +my $g; +if ($uri) { + $g = open_guest (\@ARGV, address => $uri); +} else { + $g = open_guest (\@ARGV); +} + +$g->launch (); + +# List of partitions and sizes. +my @partitions; +my @devices = $g->list_devices (); +foreach my $dev (@devices) { + my @p = $g->part_list ($dev); + foreach (@p) { + $_->{name} = canonicalize ("$dev" . $_->{part_num}); + push @partitions, $_; + } +} + +# Print them. +foreach my $part (@partitions) { + print $part->{name}; + + if ($long) { + my $type; + eval { + $type = $g->vfs_type ($part->{name}); + }; + $type ||= "unknown"; + $type = "pv" if $type eq "LVM2_member"; + print " $type "; + if ($human) { + print (human_size($part->{part_size})); + } else { + print $part->{part_size}; + } + } + print "\n"; +} + +# The reverse of device name translation, see +# BLOCK DEVICE NAMING in guestfs(3). +sub canonicalize +{ + local $_ = shift; + + if (m{^/dev/[hv]d([a-z]\d)$}) { + return "/dev/sd$1"; + } + $_; +} + +# Convert a number of bytes to a human-readable number. +sub human_size +{ + local $_ = shift; + + $_ /= 1024; # blocks + + if ($_ < 1024) { + sprintf "%dK", $_; + } elsif ($_ < 1024 * 1024) { + sprintf "%.1fM", ($_ / 1024); + } else { + sprintf "%.1fG", ($_ / 1024 / 1024); + } +} + +=head1 SEE ALSO + +L<guestfs(3)>, +L<guestfish(1)>, +L<virt-list-filesystems(1)>, +L<virt-resize(1)>, +L<Sys::Guestfs(3)>, +L<Sys::Guestfs::Lib(3)>, +L<Sys::Virt(3)>, +L<http://libguestfs.org/>. + +=head1 AUTHOR + +Richard W.M. Jones L<http://et.redhat.com/~rjones/> + +=head1 COPYRIGHT + +Copyright (C) 2009 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., 675 Mass Ave, Cambridge, MA 02139, USA. |