summaryrefslogtreecommitdiffstats
path: root/tools/virt-list-partitions
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-03-22 18:38:31 +0000
committerRichard Jones <rjones@redhat.com>2010-03-23 21:56:14 +0000
commitdef627e4daf2d32cebf91f5e01f44a0b7e512129 (patch)
treefef108dc2be0d7ac95d0b15317d49bedf2109aa6 /tools/virt-list-partitions
parentb6483061c25e90ae1b9e016812dea8e3756d6c23 (diff)
downloadlibguestfs-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-xtools/virt-list-partitions224
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.