mirror of
https://github.com/speed47/btrfs-list
synced 2024-09-28 20:03:32 +00:00
Compare commits
5 commits
f4d929e7ed
...
30bb31e0a7
Author | SHA1 | Date | |
---|---|---|---|
30bb31e0a7 | |||
0b566c655f | |||
93f58739e5 | |||
befde74faa | |||
d2a9bb2548 |
|
@ -1,6 +1,6 @@
|
|||
# Overview
|
||||
|
||||
Btrfs is a great filesystem, but its userland tools are not very user-frienfly yet.
|
||||
Btrfs is a great filesystem, but its userland tools are not very user-friendly yet.
|
||||
As a long-time user, I've developed `btrfs-list` as a wrapper to make sense out of the `btrfs sub list` and `btrfs qgroup show` commands.
|
||||
|
||||
You need `btrfs-list` if either:
|
||||
|
@ -28,7 +28,8 @@ If no mountpoints are specified, display info for all btrfs filesystems.
|
|||
|
||||
-h, --help display this message
|
||||
--debug enable debug output
|
||||
-q, --quiet silence the quota disabled & quota rescan warnings
|
||||
-q, --quiet silence quota disabled & quota rescan warnings,
|
||||
repeat to silence all other warnings.
|
||||
--version display version info
|
||||
--color WHEN colorize the output; WHEN can be 'never',
|
||||
'always', or 'auto' (default is:
|
||||
|
@ -50,6 +51,7 @@ If no mountpoints are specified, display info for all btrfs filesystems.
|
|||
--snap-max-excl SIZE hide snapshots whose exclusively allocated extents
|
||||
take up more space than SIZE
|
||||
-f, --free-space only show free space on the filesystem
|
||||
-u, --used display used space instead of free space
|
||||
|
||||
-p, --profile PROFILE override data profile detection and consider it
|
||||
as 'dup', 'single', 'raid0', 'raid1',
|
||||
|
|
71
btrfs-list
71
btrfs-list
|
@ -26,7 +26,7 @@ use Getopt::Long qw{ :config gnu_getopt no_ignore_case };
|
|||
use Data::Dumper;
|
||||
use Term::ANSIColor;
|
||||
|
||||
my $VERSION = "2.2";
|
||||
my $VERSION = "2.3";
|
||||
|
||||
$Data::Dumper::Sortkeys = 1;
|
||||
$Data::Dumper::Terse = 1;
|
||||
|
@ -51,7 +51,8 @@ If no mountpoints are specified, display info for all btrfs filesystems.
|
|||
|
||||
-h, --help display this message
|
||||
--debug enable debug output
|
||||
-q, --quiet silence warnings
|
||||
-q, --quiet silence quota disabled & quota rescan warnings,
|
||||
repeat to silence all other warnings.
|
||||
--version display version info
|
||||
--color WHEN colorize the output; WHEN can be 'never',
|
||||
'always', or 'auto' (default is:
|
||||
|
@ -73,6 +74,7 @@ If no mountpoints are specified, display info for all btrfs filesystems.
|
|||
--snap-max-excl SIZE hide snapshots whose exclusively allocated extents
|
||||
take up more space than SIZE
|
||||
-f, --free-space only show free space on the filesystem
|
||||
-u, --used display used space instead of free space
|
||||
|
||||
-p, --profile PROFILE override data profile detection and consider it
|
||||
as 'dup', 'single', 'raid0', 'raid1',
|
||||
|
@ -109,7 +111,7 @@ GetOptions(
|
|||
'version' => \my $opt_version,
|
||||
'ignore-version-check' => \my $opt_ignore_version_check,
|
||||
'ignore-root-check' => \my $opt_ignore_root_check,
|
||||
'q|quiet' => \my $opt_quiet,
|
||||
'q|quiet+' => \my $opt_quiet,
|
||||
's|hide-snap' => \my $opt_hide_snapshots,
|
||||
'S|snap-only' => \my $opt_only_snapshots,
|
||||
'f|free-space' => \my $opt_free_space,
|
||||
|
@ -138,14 +140,24 @@ GetOptions(
|
|||
'r|raw' => \my $opt_raw,
|
||||
'btrfs-binary=s' => \my $opt_btrfs_binary,
|
||||
'd|deleted' => \my $opt_deleted,
|
||||
'u|used' => \my $opt_used,
|
||||
) or die "FATAL: Error parsing arguments, aborting\n";
|
||||
|
||||
$opt_quiet ||= 0;
|
||||
|
||||
sub debug {
|
||||
return if !$opt_debug;
|
||||
print STDERR $_ . "\n" for @_;
|
||||
return;
|
||||
}
|
||||
|
||||
sub warning {
|
||||
my ($level, @lines) = @_;
|
||||
return if ($level <= $opt_quiet);
|
||||
print STDERR "WARNING: $_\n" for @lines;
|
||||
return;
|
||||
} ## end sub warning
|
||||
|
||||
sub run_cmd {
|
||||
my %params = @_;
|
||||
my $cmd = $params{'cmd'};
|
||||
|
@ -166,13 +178,13 @@ sub run_cmd {
|
|||
while (<$_stdout>) {
|
||||
chomp;
|
||||
debug("stdout: " . $_);
|
||||
/WARNING:/ and print STDERR $_ . "\n";
|
||||
/WARNING: (.+)/ and warning(2, "btrfs-progs: $1");
|
||||
push @stdout, $_;
|
||||
} ## end while (<$_stdout>)
|
||||
while (<$_stderr>) {
|
||||
chomp;
|
||||
debug("stderr: " . $_);
|
||||
/WARNING: (?!RAID56 detected, not implemented)/ and print STDERR $_ . "\n";
|
||||
/WARNING: (RAID56 detected, not implemented)/ and warning(2, "btrfs-progs: $1");
|
||||
if (!$silent_stderr) {
|
||||
print join(' ', @$cmd) . ": stderr: " . $_ . "\n";
|
||||
}
|
||||
|
@ -452,6 +464,15 @@ if (version->declare($version)->numify lt version->declare("3.18")->numify && !$
|
|||
exit 1;
|
||||
} ## end if (version->declare($version...))
|
||||
|
||||
if ($version_verbatim eq '6.1' && !$opt_ignore_version_check) {
|
||||
warning(2,
|
||||
"the btrfs-progs version you're using, " . "v$version_verbatim, is known to be missing subvolume uuids.");
|
||||
}
|
||||
elsif ($version_verbatim eq '5.15' && !$opt_ignore_version_check) {
|
||||
warning(2,
|
||||
"the btrfs-progs version you're using, " . "v$version_verbatim, is known to report free fs space incorrectly.");
|
||||
}
|
||||
|
||||
if ($< != 0 && !$opt_ignore_root_check) {
|
||||
print STDERR "FATAL: you must be root to use this command\n";
|
||||
print STDERR "If you think this is in error, use --ignore-root-check\n";
|
||||
|
@ -548,6 +569,11 @@ foreach (@fishow) {
|
|||
if (not exists $filesystems{$fuuid}) {
|
||||
$filesystems{$fuuid} = {uuid => $fuuid, label => $label, devices => [], devinfo => {}};
|
||||
}
|
||||
# btrfs-progs v5.10.1 bug workaround: "dm-X" instead of "/dev/dm-X"
|
||||
if ($dev && $dev =~ m{^dm-}) {
|
||||
debug("Applying workaround $dev => /dev/$dev");
|
||||
$dev = "/dev/$dev";
|
||||
}
|
||||
if (-l $dev) {
|
||||
$dev = link2real($dev);
|
||||
}
|
||||
|
@ -672,7 +698,7 @@ foreach my $fuuid (keys %filesystems) {
|
|||
$profile = $opt_profile if defined $opt_profile;
|
||||
|
||||
if (!$profile) {
|
||||
print STDERR "WARNING: No profile found, assuming single\n";
|
||||
warning(2, "No profile found, assuming single");
|
||||
$profile = "single";
|
||||
}
|
||||
|
||||
|
@ -820,7 +846,7 @@ foreach my $fuuid (keys %filesystems) {
|
|||
|
||||
$cmd = run_cmd(silent_stderr => 1, cmd => [qw{ btrfs quota rescan -s }, $mp]);
|
||||
if ($cmd->{stdout}->[0] && $cmd->{stdout}->[0] =~ /operation running|current key/) {
|
||||
print STDERR "WARNING: a quota rescan is running, size information is not correct yet\n" if not $opt_quiet;
|
||||
warning(1, "a quota rescan is running, size information is not correct yet");
|
||||
}
|
||||
|
||||
$cmd = run_cmd(silent_stderr => 1, cmd => [qw{ btrfs qgroup show -pcre --raw }, $mp]);
|
||||
|
@ -829,8 +855,7 @@ foreach my $fuuid (keys %filesystems) {
|
|||
# btrfs-progs v3.18 doesn't support --raw
|
||||
$cmd = run_cmd(silent_stderr => 1, cmd => [qw{ btrfs qgroup show -pcre }, $mp]);
|
||||
if ($cmd->{status} || !@{$cmd->{stdout}}) {
|
||||
print STDERR "WARNING: to get refer/excl size information, please enable qgroups (btrfs quota enable $mp)\n"
|
||||
if not $opt_quiet;
|
||||
warning(1, "to get refer/excl size information, please enable qgroups (btrfs quota enable $mp)");
|
||||
$vol{$fuuid}{df}{noquota} = 1;
|
||||
}
|
||||
} ## end if ($cmd->{status} || ...)
|
||||
|
@ -991,7 +1016,7 @@ foreach my $fuuid (sort keys %filesystems) {
|
|||
# do we still have unseen volumes? (we shouldn't)
|
||||
foreach my $vuuid (keys %{$vol{$fuuid}}) {
|
||||
next if $seen{$vuuid};
|
||||
print STDERR "WARN: we shouldn't have orphaned volumne $vuuid\n";
|
||||
warning(2, "we shouldn't have orphaned volumne $vuuid");
|
||||
push @ordered, $vuuid;
|
||||
}
|
||||
|
||||
|
@ -1102,13 +1127,25 @@ foreach my $line (@orderedAll) {
|
|||
if (exists $line->{free}) {
|
||||
my $displayProfile = $line->{profile};
|
||||
$displayProfile .= "/" . $line->{mprofile} if ($line->{profile} ne $line->{mprofile});
|
||||
$extra = sprintf(
|
||||
"(%s, %s/%s free, %.02f%%",
|
||||
$displayProfile,
|
||||
pretty_print_str($line->{free}, 2),
|
||||
pretty_print_str($line->{fssize}, 2),
|
||||
$line->{free} * 100 / $line->{fssize}
|
||||
);
|
||||
if (!$opt_used) {
|
||||
$extra = sprintf(
|
||||
"(%s, %s/%s free, %.02f%%",
|
||||
$displayProfile,
|
||||
pretty_print_str($line->{free}, 2),
|
||||
pretty_print_str($line->{fssize}, 2),
|
||||
$line->{free} * 100 / $line->{fssize}
|
||||
);
|
||||
} ## end if (!$opt_used)
|
||||
else {
|
||||
my $used = $line->{fssize} - $line->{free};
|
||||
$extra = sprintf(
|
||||
"(%s, %s/%s used, %.02f%%",
|
||||
$displayProfile,
|
||||
pretty_print_str($used, 2),
|
||||
pretty_print_str($line->{fssize}, 2),
|
||||
$used * 100 / $line->{fssize}
|
||||
);
|
||||
} ## end else [ if (!$opt_used) ]
|
||||
if ($line->{unallocatable} && $line->{unallocatable} > MiB) {
|
||||
$extra .= sprintf(', %s unallocatable', pretty_print_str($line->{unallocatable}, 2));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue