lvcreate LV3 VG 64
# Phony /boot filesystem.
-mkfs ext2 /dev/sda1
+mkfs-b ext2 4096 /dev/sda1
set-e2label /dev/sda1 BOOT
# Phony root filesystem.
-mkfs ext2 /dev/VG/Root
+mkfs-b ext2 4096 /dev/VG/Root
set-e2label /dev/VG/Root ROOT
# Enough to fool virt-inspector.
mknod 0777 10 10 /bin/test7
# Other filesystems.
-mkfs ext2 /dev/VG/LV1
-mkfs ext2 /dev/VG/LV2
-mkfs ext2 /dev/VG/LV3
+# Note that these should be empty, for testing virt-df.
+mkfs-b ext2 4096 /dev/VG/LV1
+mkfs-b ext2 1024 /dev/VG/LV2
+mkfs-b ext2 2048 /dev/VG/LV3
EOF
rm fstab
set -e
# Run virt-df.
-output=$(./virt-df test.img -h)
-
-# The output will be slightly different from one machine to another.
-# So just do some tests to make sure it looks reasonable.
+output=$(./virt-df test.img)
# Check title is the first line.
-if [[ ! $output =~ ^Filesystem[[:space:]]+Size[[:space:]]+Used[[:space:]]+Available[[:space:]]+Use% ]]; then
+if [[ ! $output =~ ^Filesystem.* ]]; then
echo "$0: error: no title line"
exit 1
fi
echo "$0: error: filesystem /dev/VG/sda1 was not found"
exit 1
fi
+
+# This is what df itself prints for these filesystems (determined
+# by running the test image under virt-rescue):
+#
+# ><rescue> df -h
+# Filesystem Size Used Avail Use% Mounted on
+# /dev/dm-1 31M 28K 30M 1% /sysroot/lv1
+# /dev/dm-2 31M 395K 29M 2% /sysroot/lv2
+# /dev/dm-3 62M 144K 59M 1% /sysroot/lv3
+# ><rescue> df -i
+# Filesystem Inodes IUsed IFree IUse% Mounted on
+# /dev/dm-1 8192 11 8181 1% /sysroot/lv1
+# /dev/dm-2 8192 11 8181 1% /sysroot/lv2
+# /dev/dm-3 16384 11 16373 1% /sysroot/lv3
+# ><rescue> df
+# Filesystem 1K-blocks Used Available Use% Mounted on
+# /dev/dm-1 31728 28 30064 1% /sysroot/lv1
+# /dev/dm-2 31729 395 29696 2% /sysroot/lv2
+# /dev/dm-3 63472 144 60052 1% /sysroot/lv3
+#
+# Only test plain 'df' output at the moment (XXX).
+
+if [ "$(echo "$output" | sort | awk '/VG.LV[123]/ { print $2 " " $3 " " $4 " " $5 }')" != \
+"31728 28 30064 1%
+31729 395 29696 2%
+63472 144 60052 1%" ]; then
+ echo "$0: error: output of virt-df did not match expected (df) output"
+ exit 1
+fi
use Sys::Guestfs::Lib qw(open_guest get_partitions resolve_windows_path
inspect_all_partitions inspect_partition
inspect_operating_systems mount_operating_system inspect_in_detail);
+
use Pod::Usage;
use Getopt::Long;
use Data::Dumper;
use XML::Writer;
+use POSIX qw(ceil);
+
use Locale::TextDomain 'libguestfs';
=encoding utf8
=item B<--csv>
-Write out the results in CSV format (comma-separated values). This
-format can be imported easily into databases and spreadsheets, but
+Write out the results in CSV format (comma-separated values). This format
+can be imported easily into databases and spreadsheets, but
read L</NOTE ABOUT CSV FORMAT> below.
=cut
push @cols, ($blocks-$bfree)*$factor; # total 1K blocks used
push @cols, $bavail*$factor; # total 1K blocks available
- # XXX %used column comes out different from the native 'df'
- # program. Need to check how 'df' calculates this.
- push @cols, 100.0 - 100.0 * $bavail / $blocks;
+ push @cols, 100.0 - 100.0 * $bfree / $blocks;
if ($human) {
$cols[2] = human_size ($cols[2]);
push @cols, $files-$ffree;
push @cols, $ffree;
- # XXX %used column comes out different from the native 'df'
- # program. Need to check how 'df' calculates this.
- push @cols, 100.0 - 100.0 * $favail / $files;
+ push @cols, 100.0 - 100.0 * $ffree / $files;
}
print_cols (@cols);
printf ("%-36s", $label);
print "\n"," "x36 if length ($label) > 36;
- my $percent = sprintf "%3.1f%%", $_[5];
+ # Use 'ceil' on the percentage in order to emulate
+ # what df itself does.
+ my $percent = sprintf "%3d%%", ceil($_[5]);
+
printf ("%10s %10s %10s %5s\n", $_[2], $_[3], $_[4], $percent);
} else {
printf ("\"%s\",\"%s\",%d,%d,%d,%.1f%%\n", @_);