From 6b2e32019ec34d0c4e79397fe16b97c877ad8abc Mon Sep 17 00:00:00 2001 From: Manoj Joseph Date: Thu, 6 Jan 2022 10:54:32 -0800 Subject: [PATCH] Long opts for zdb This change introduces long options for zdb. It updates the usage message as well to include the long options. Reviewed-by: Matthew Ahrens Reviewed-by: Brian Behlendorf Signed-off-by: Manoj Joseph Closes #12818 --- cmd/zdb/zdb.c | 181 +++++++++++++++++++++++++++++++++---------------- man/man8/zdb.8 | 68 +++++++++---------- 2 files changed, 157 insertions(+), 92 deletions(-) diff --git a/cmd/zdb/zdb.c b/cmd/zdb/zdb.c index 2d64ce6ef..a40bf4742 100644 --- a/cmd/zdb/zdb.c +++ b/cmd/zdb/zdb.c @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -820,65 +821,87 @@ usage(void) " z ZAPs\n" " - Negate effect of next flag\n\n"); (void) fprintf(stderr, " Options to control amount of output:\n"); - (void) fprintf(stderr, " -b block statistics\n"); - (void) fprintf(stderr, " -c checksum all metadata (twice for " - "all data) blocks\n"); - (void) fprintf(stderr, " -C config (or cachefile if alone)\n"); - (void) fprintf(stderr, " -d dataset(s)\n"); - (void) fprintf(stderr, " -D dedup statistics\n"); - (void) fprintf(stderr, " -E decode and display block from an " - "embedded block pointer\n"); - (void) fprintf(stderr, " -h pool history\n"); - (void) fprintf(stderr, " -i intent logs\n"); - (void) fprintf(stderr, " -l read label contents\n"); - (void) fprintf(stderr, " -k examine the checkpointed state " - "of the pool\n"); - (void) fprintf(stderr, " -L disable leak tracking (do not " - "load spacemaps)\n"); - (void) fprintf(stderr, " -m metaslabs\n"); - (void) fprintf(stderr, " -M metaslab groups\n"); - (void) fprintf(stderr, " -O perform object lookups by path\n"); - (void) fprintf(stderr, " -r copy an object by path to file\n"); - (void) fprintf(stderr, " -R read and display block from a " - "device\n"); - (void) fprintf(stderr, " -s report stats on zdb's I/O\n"); - (void) fprintf(stderr, " -S simulate dedup to measure effect\n"); - (void) fprintf(stderr, " -v verbose (applies to all " - "others)\n"); - (void) fprintf(stderr, " -y perform livelist and metaslab " - "validation on any livelists being deleted\n\n"); + (void) fprintf(stderr, " -b --block-stats " + "block statistics\n"); + (void) fprintf(stderr, " -c --checksum " + "checksum all metadata (twice for all data) blocks\n"); + (void) fprintf(stderr, " -C --config " + "config (or cachefile if alone)\n"); + (void) fprintf(stderr, " -d --datasets " + "dataset(s)\n"); + (void) fprintf(stderr, " -D --dedup-stats " + "dedup statistics\n"); + (void) fprintf(stderr, " -E --embedded-block-pointer=INTEGER\n" + " decode and display block " + "from an embedded block pointer\n"); + (void) fprintf(stderr, " -h --history " + "pool history\n"); + (void) fprintf(stderr, " -i --intent-logs " + "intent logs\n"); + (void) fprintf(stderr, " -l --label " + "read label contents\n"); + (void) fprintf(stderr, " -k --checkpointed-state " + "examine the checkpointed state of the pool\n"); + (void) fprintf(stderr, " -L --disable-leak-tracking " + "disable leak tracking (do not load spacemaps)\n"); + (void) fprintf(stderr, " -m --metaslabs " + "metaslabs\n"); + (void) fprintf(stderr, " -M --metaslab-groups " + "metaslab groups\n"); + (void) fprintf(stderr, " -O --object-lookups " + "perform object lookups by path\n"); + (void) fprintf(stderr, " -r --copy-object " + "copy an object by path to file\n"); + (void) fprintf(stderr, " -R --read-block " + "read and display block from a device\n"); + (void) fprintf(stderr, " -s --io-stats " + "report stats on zdb's I/O\n"); + (void) fprintf(stderr, " -S --simulate-dedup " + "simulate dedup to measure effect\n"); + (void) fprintf(stderr, " -v --verbose " + "verbose (applies to all others)\n"); + (void) fprintf(stderr, " -y --livelist " + "perform livelist and metaslab validation on any livelists being " + "deleted\n\n"); (void) fprintf(stderr, " Below options are intended for use " "with other options:\n"); - (void) fprintf(stderr, " -A ignore assertions (-A), enable " - "panic recovery (-AA) or both (-AAA)\n"); - (void) fprintf(stderr, " -e pool is exported/destroyed/" - "has altroot/not in a cachefile\n"); - (void) fprintf(stderr, " -F attempt automatic rewind within " - "safe range of transaction groups\n"); - (void) fprintf(stderr, " -G dump zfs_dbgmsg buffer before " - "exiting\n"); - (void) fprintf(stderr, " -I -- " - "specify the maximum number of\n " - "checksumming I/Os [default is 200]\n"); - (void) fprintf(stderr, " -o = set global " - "variable to an unsigned 32-bit integer\n"); - (void) fprintf(stderr, " -p -- use one or more with " - "-e to specify path to vdev dir\n"); - (void) fprintf(stderr, " -P print numbers in parseable form\n"); - (void) fprintf(stderr, " -q don't print label contents\n"); - (void) fprintf(stderr, " -t -- highest txg to use when " - "searching for uberblocks\n"); - (void) fprintf(stderr, " -u uberblock\n"); - (void) fprintf(stderr, " -U -- use alternate " - "cachefile\n"); - (void) fprintf(stderr, " -V do verbatim import\n"); - (void) fprintf(stderr, " -x -- " + (void) fprintf(stderr, " -A --ignore-assertions " + "ignore assertions (-A), enable panic recovery (-AA) or both " + "(-AAA)\n"); + (void) fprintf(stderr, " -e --exported " + "pool is exported/destroyed/has altroot/not in a cachefile\n"); + (void) fprintf(stderr, " -F --automatic-rewind " + "attempt automatic rewind within safe range of transaction " + "groups\n"); + (void) fprintf(stderr, " -G --dump-debug-msg " + "dump zfs_dbgmsg buffer before exiting\n"); + (void) fprintf(stderr, " -I --inflight=INTEGER " + "specify the maximum number of checksumming I/Os " + "[default is 200]\n"); + (void) fprintf(stderr, " -o --option=\"OPTION=INTEGER\" " + "set global variable to an unsigned 32-bit integer\n"); + (void) fprintf(stderr, " -p --path==PATH " + "use one or more with -e to specify path to vdev dir\n"); + (void) fprintf(stderr, " -P --parseable " + "print numbers in parseable form\n"); + (void) fprintf(stderr, " -q --skip-label " + "don't print label contents\n"); + (void) fprintf(stderr, " -t --txg=INTEGER " + "highest txg to use when searching for uberblocks\n"); + (void) fprintf(stderr, " -u --uberblock " + "uberblock\n"); + (void) fprintf(stderr, " -U --cachefile=PATH " + "use alternate cachefile\n"); + (void) fprintf(stderr, " -V --verbatim " + "do verbatim import\n"); + (void) fprintf(stderr, " -x --dump-blocks=PATH " "dump all read blocks into specified directory\n"); - (void) fprintf(stderr, " -X attempt extreme rewind (does not " - "work with dataset)\n"); - (void) fprintf(stderr, " -Y attempt all reconstruction " - "combinations for split blocks\n"); - (void) fprintf(stderr, " -Z show ZSTD headers \n"); + (void) fprintf(stderr, " -X --extreme-rewind " + "attempt extreme rewind (does not work with dataset)\n"); + (void) fprintf(stderr, " -Y --all-reconstruction " + "attempt all reconstruction combinations for split blocks\n"); + (void) fprintf(stderr, " -Z --zstd-headers " + "show ZSTD headers \n"); (void) fprintf(stderr, "Specify an option more than once (e.g. -bb) " "to make only that option verbose\n"); (void) fprintf(stderr, "Default is to dump everything non-verbosely\n"); @@ -8410,8 +8433,50 @@ main(int argc, char **argv) */ zfs_btree_verify_intensity = 3; - while ((c = getopt(argc, argv, - "AbcCdDeEFGhiI:klLmMo:Op:PqrRsSt:uU:vVx:XYyZ")) != -1) { + struct option long_options[] = { + {"ignore-assertions", no_argument, NULL, 'A'}, + {"block-stats", no_argument, NULL, 'b'}, + {"checksum", no_argument, NULL, 'c'}, + {"config", no_argument, NULL, 'C'}, + {"datasets", no_argument, NULL, 'd'}, + {"dedup-stats", no_argument, NULL, 'D'}, + {"exported", no_argument, NULL, 'e'}, + {"embedded-block-pointer", no_argument, NULL, 'E'}, + {"automatic-rewind", no_argument, NULL, 'F'}, + {"dump-debug-msg", no_argument, NULL, 'G'}, + {"history", no_argument, NULL, 'h'}, + {"intent-logs", no_argument, NULL, 'i'}, + {"inflight", required_argument, NULL, 'I'}, + {"checkpointed-state", no_argument, NULL, 'k'}, + {"label", no_argument, NULL, 'l'}, + {"disable-leak-tracking", no_argument, NULL, 'L'}, + {"metaslabs", no_argument, NULL, 'm'}, + {"metaslab-groups", no_argument, NULL, 'M'}, + {"option", required_argument, NULL, 'o'}, + {"object-lookups", no_argument, NULL, 'O'}, + {"path", required_argument, NULL, 'p'}, + {"parseable", no_argument, NULL, 'P'}, + {"skip-label", no_argument, NULL, 'q'}, + {"copy-object", no_argument, NULL, 'r'}, + {"read-block", no_argument, NULL, 'R'}, + {"io-stats", no_argument, NULL, 's'}, + {"simulate-dedup", no_argument, NULL, 'S'}, + {"txg", required_argument, NULL, 't'}, + {"uberblock", no_argument, NULL, 'u'}, + {"cachefile", required_argument, NULL, 'U'}, + {"verbose", no_argument, NULL, 'v'}, + {"verbatim", no_argument, NULL, 'V'}, + {"dump-blocks", required_argument, NULL, 'x'}, + {"extreme-rewind", no_argument, NULL, 'X'}, + {"all-reconstruction", no_argument, NULL, 'Y'}, + {"livelist", no_argument, NULL, 'y'}, + {"zstd-headers", no_argument, NULL, 'Z'}, + {0, 0, 0, 0} + }; + + while ((c = getopt_long(argc, argv, + "AbcCdDeEFGhiI:klLmMo:Op:PqrRsSt:uU:vVx:XYyZ", + long_options, NULL)) != -1) { switch (c) { case 'b': case 'c': diff --git a/man/man8/zdb.8 b/man/man8/zdb.8 index 2b0471cc9..9e9197084 100644 --- a/man/man8/zdb.8 +++ b/man/man8/zdb.8 @@ -109,18 +109,18 @@ that zdb may interpret inconsistent pool data and behave erratically. .Sh OPTIONS Display options: .Bl -tag -width Ds -.It Fl b +.It Fl b , -block-stats Display statistics regarding the number, size .Pq logical, physical and allocated and deduplication of blocks. -.It Fl c +.It Fl c , -checksum Verify the checksum of all metadata blocks while printing block statistics .Po see .Fl b .Pc . .Pp If specified multiple times, verify the checksums of all blocks. -.It Fl C +.It Fl C , -config Display information about the configuration. If specified with no other options, instead display information about the cache file @@ -133,7 +133,7 @@ cached configuration and the on-disk configuration. If specified multiple times with .Fl e also display the configuration that would be used were the pool to be imported. -.It Fl d +.It Fl d , -datasets Display information about datasets. Specified once, displays basic dataset information: ID, create transaction, size, and object count. @@ -182,7 +182,7 @@ Dump ZAP objects .It Sy - Negate the effect of next flag .El -.It Fl D +.It Fl D , -dedup-stats Display deduplication statistics, including the deduplication ratio .Pq Sy dedup , compression ratio @@ -203,23 +203,23 @@ Display the statistics independently for each deduplication table. Dump the contents of the deduplication tables describing duplicate blocks. .It Fl DDDDD Also dump the contents of the deduplication tables describing unique blocks. -.It Fl E Ar word0 : Ns Ar word1 Ns :…: Ns Ar word15 +.It Fl E , -embedded-block-pointer Ns = Ns Ar word0 : Ns Ar word1 Ns :…: Ns Ar word15 Decode and display block from an embedded block pointer specified by the .Ar word arguments. -.It Fl h +.It Fl h , -history Display pool history similar to .Nm zpool Cm history , but include internal changes, transaction, and dataset information. -.It Fl i +.It Fl i , -intent-logs Display information about intent log .Pq ZIL entries relating to each dataset. If specified multiple times, display counts of each intent log transaction type. -.It Fl k +.It Fl k , -checkpointed-state Examine the checkpointed state of the pool. Note, the on disk format of the pool is not reverted to the checkpointed state. -.It Fl l Ar device +.It Fl l , -label Ns = Ns Ar device Read the vdev labels and L2ARC header from the specified device. .Nm Fl l will return 0 if valid label was found, 1 if error occurred, and 2 if no valid @@ -249,12 +249,12 @@ If the .Fl u option is also specified, also display the uberblocks on this device. Specify multiple times to increase verbosity. -.It Fl L +.It Fl L , -disable-leak-tracking Disable leak detection and the loading of space maps. By default, .Nm verifies that all non-free blocks are referenced, which can be very expensive. -.It Fl m +.It Fl m , -metaslabs Display the offset, spacemap, free space of each metaslab, all the log spacemaps and their obsolete entry statistics. .It Fl mm @@ -265,12 +265,12 @@ Display the maximum contiguous free space, the in-core free space histogram, and the percentage of free space in each space map. .It Fl mmmm Display every spacemap record. -.It Fl M +.It Fl M , -metaslab-groups Display all "normal" vdev metaslab group information - per-vdev metaslab count, fragmentation, and free space histogram, as well as overall pool fragmentation and histogram. .It Fl MM "Special" vdevs are added to -M's normal output. -.It Fl O Ar dataset path +.It Fl O , -object-lookups Ns = Ns Ar dataset path Look up the specified .Ar path inside of the @@ -283,7 +283,7 @@ must be relative to the root of This option can be combined with .Fl v for increasing verbosity. -.It Fl r Ar dataset path destination +.It Fl r , -copy-object Ns = Ns Ar dataset path destination Copy the specified .Ar path inside of the @@ -297,7 +297,7 @@ This option can be combined with .Fl v for increasing verbosity. .It Xo -.Fl R Ar poolname vdev : Ns Ar offset : Ns Oo Ar lsize Ns / Oc Ns Ar psize Ns Op : Ns Ar flags +.Fl R , -read-block Ns = Ns Ar poolname vdev : Ns Ar offset : Ns Oo Ar lsize Ns / Oc Ns Ar psize Ns Op : Ns Ar flags .Xc Read and display a block from the specified device. By default the block is displayed as a hex dump, but see the description of the @@ -336,36 +336,36 @@ Dump raw uninterpreted block data .It Sy v Verbose output for guessing compression algorithm .El -.It Fl s +.It Fl s , -io-stats Report statistics on .Nm zdb I/O. Display operation counts, bandwidth, and error counts of I/O to the pool from .Nm . -.It Fl S +.It Fl S , -simulate-dedup Simulate the effects of deduplication, constructing a DDT and then display that DDT as with .Fl DD . -.It Fl u +.It Fl u , -uberblock Display the current uberblock. .El .Pp Other options: .Bl -tag -width Ds -.It Fl A +.It Fl A , -ignore-assertions Do not abort should any assertion fail. .It Fl AA Enable panic recovery, certain errors which would otherwise be fatal are demoted to warnings. .It Fl AAA Do not abort if asserts fail and also enable panic recovery. -.It Fl e Oo Fl p Ar path Oc Ns … +.It Fl e , -exported Ns = Ns Oo Fl p Ar path Oc Ns … Operate on an exported pool, not present in .Pa /etc/zfs/zpool.cache . The .Fl p flag specifies the path under which devices are to be searched. -.It Fl x Ar dumpdir +.It Fl x , -dump-blocks Ns = Ns Ar dumpdir All blocks accessed will be copied to files in the specified directory. The blocks will be placed in sparse files whose name is the same as that of the file or device read. @@ -376,30 +376,30 @@ Note that the flags are sufficient to access .Pq and thus copy all metadata on the pool. -.It Fl F +.It Fl F , -automatic-rewind Attempt to make an unreadable pool readable by trying progressively older transactions. -.It Fl G +.It Fl G , -dump-debug-msg Dump the contents of the zfs_dbgmsg buffer before exiting .Nm . zfs_dbgmsg is a buffer used by ZFS to dump advanced debug information. -.It Fl I Ar inflight I/Os +.It Fl I , -inflight Ns = Ns Ar inflight I/Os Limit the number of outstanding checksum I/Os to the specified value. The default value is 200. This option affects the performance of the .Fl c option. -.It Fl o Ar var Ns = Ns Ar value … +.It Fl o , -option Ns = Ns Ar var Ns = Ns Ar value … Set the given global libzpool variable to the provided value. The value must be an unsigned 32-bit integer. Currently only little-endian systems are supported to avoid accidentally setting the high 32 bits of 64-bit variables. -.It Fl P +.It Fl P , -parseable Print numbers in an unscaled form more amenable to parsing, e.g.\& .Sy 1000000 rather than .Sy 1M . -.It Fl t Ar transaction +.It Fl t , -txg Ns = Ns Ar transaction Specify the highest transaction to use when searching for uberblocks. See also the .Fl u @@ -407,28 +407,28 @@ and .Fl l options for a means to see the available uberblocks and their associated transaction numbers. -.It Fl U Ar cachefile +.It Fl U , -cachefile Ns = Ns Ar cachefile Use a cache file other than .Pa /etc/zfs/zpool.cache . -.It Fl v +.It Fl v , -verbose Enable verbosity. Specify multiple times for increased verbosity. -.It Fl V +.It Fl V , -verbatim Attempt verbatim import. This mimics the behavior of the kernel when loading a pool from a cachefile. Only usable with .Fl e . -.It Fl X +.It Fl X , -extreme-rewind Attempt .Qq extreme transaction rewind, that is attempt the same recovery as .Fl F but read transactions otherwise deemed too old. -.It Fl Y +.It Fl Y , -all-reconstruction Attempt all possible combinations when reconstructing indirect split blocks. This flag disables the individual I/O deadman timer in order to allow as much time as required for the attempted reconstruction. -.It Fl y +.It Fl y , -livelist Perform validation for livelists that are being deleted. Scans through the livelist and metaslabs, checking for duplicate entries and compares the two, checking for potential double frees. -- 2.39.2