sg_readcap - send SCSI READ CAPACITY command
sg_readcap [--10] [--16] [--brief]
[--help] [--hex] [--inhex=FN] [--json[=JO]]
[--js-file=JFN] [--lba=LBA] [--long] [--pmi]
[--raw] [--readonly] [--verbose] [--version]
[--zbc] DEVICE
sg_readcap [-16] [-b] [-h] [-H]
[-lba=LBA] [-pmi] [-r] [-R] [-v]
[-V] [-z] DEVICE
The normal action of the SCSI READ CAPACITY command is to fetch
the number of blocks (and block size) from the DEVICE.
The SCSI READ CAPACITY command (both 10 and 16 byte cdbs) actually
yield the block address of the last block and the block size. The number of
blocks is thus one plus the block address of the last block (as blocks are
counted origin zero (i.e. starting at block zero)). This is the source of
many "off by one" errors.
The READ CAPACITY(16) response provides additional information not
found in the READ CAPACITY(10) response. This includes protection and
logical block provisioning information, plus the number of logical blocks
per physical block. So even though the media size may not exceed what READ
CAPACITY(10) can show, it may still be useful to examine the response to
READ CAPACITY(16). Sadly there are horrible SCSI command set implementations
in the wild that crash when the READ CAPACITY(16) command is sent to
them.
Device capacity is the product of the number of blocks by the
block size. This utility outputs this figure in bytes, MiB (1048576 bytes
per MiB), GB (1000000000 bytes per GB) and, if large enough, TB (1000
GB).
If sg_readcap is called without the --long option then the
10 byte cdb version (i.e. READ CAPACITY (10)) is sent to the DEVICE.
If the number of blocks in the response is reported as 0xffffffff (i.e.
(2**32 - 1) ) and the --hex option has not been given, then READ
CAPACITY (16) is called and its response is output.
This utility supports two command line syntaxes, the preferred one
is shown first in the synopsis and explained in this section. A later
section on the old command line syntax outlines the second group of
options.
Arguments to long options are mandatory for short options as well.
The options are arranged in alphabetical order based on the long option
name.
- --10
- Use the 10 byte cdb variant of the READ CAPACITY command. This is
currently the default action of this utility. That default may change to
the 16 byte variant, especially if T10 deprecates the 10 byte
variant.
- --16
- Use the 16 byte cdb variant of the READ CAPACITY command. See the '--long'
option. -b, --brief outputs two hex numbers (prefixed with
'0x' and space separated) to stdout. The first number is the maximum
number of blocks on the device (which is one plus the lba of the last
accessible block). The second number is the size in bytes of each block.
If the operation fails then "0x0 0x0" is written to stdout.
- -h, --help
- print out the usage message then exit.
- -H, --hex
- output the response to the READ CAPACITY command (either the 10 or 16 byte
cdb variant) in ASCII hexadecimal on stdout. Each line starts with a
hexadecimal address or index, starting at 0. If this option is given
twice, and ASCII rendering of the 16 bytes on each line is appended to the
right hand side of each line.
If this option is given three times then 16 bytes of ASCII hexadecimal are
output in each line with no leading address nor ASCII rendering to the
right. This output is suitable for importing into a later invocation of
this utility with the file containing the hex given to the
--inhex=FN option. When given four (or more times) this option adds
a comment line (starting with '#') describing the command that caused the
output.
- -i,
--inhex=FN
- where FN is a file name whose contents are assumed to be ASCII
hexadecimal. If DEVICE is also given then DEVICE is ignored,
a warning is issued and the utility continues, decoding the file named
FN. See the "HEX, BINARY AND JSON FORMATS" section in the
sg3_utils manpage for more information. If the --raw option is also
given then the contents of FN are treated as binary.
- -j[=JO],
--json[=JO]
- output is in JSON format instead of plain text form. Note that arguments
to the short and long form are themselves optional and if present start
with "=" and no whitespace is permitted around that
"=".
See sg3_utils_json manpage or use '?' for JO to get a summary.
- -J,
--js-file=JFN
- output is in JSON format and it is sent to a file named JFN. If
that file exists then it is truncated. By default, the JSON output is sent
to stdout.
When this option is given, the --json[=JO] option is implied and need
not be given. The --json[=JO] option may still be needed to set the
JO parameter to non-default values.
- -L,
--lba=LBA
- used in conjunction with --pmi option. This variant of READ
CAPACITY will yield the last block address after LBA prior to a
delay. For a disk, given a LBA it yields the highest numbered block
on the same cylinder (i.e. before the heads need to move). LBA is
assumed to be decimal unless prefixed by "0x" or it has a
trailing "h". Defaults to 0. This option was made obsolete in
SBC-3 revision 26.
- -l, --long
- Use the 16 byte cdb variant of the READ CAPACITY command. The default
action is to use the 10 byte cdb variant which limits the maximum block
address to (2**32 - 2). When a 10 byte cdb READ CAPACITY command is used
on a device whose size is too large then a last block address of
0xffffffff is returned (if the device complies with SBC-2 or later).
- -O, --old
- Switch to older style options. Please use as first option.
- -p, --pmi
- partial medium indicator: for finding the next block address prior to some
delay (e.g. head movement). In the absence of this option, the total
number of blocks and the block size of the device are output. Used in
conjunction with the --lba=LBA option. This option was made
obsolete in SBC-3 revision 26.
- -r, --raw
- output response in binary to stdout.
- -R,
--readonly
- open the DEVICE read-only (e.g. in Unix with the O_RDONLY flag).
The default for READ CAPACITY(16) is to open it read-write. The default
for READ CAPACITY(10) is to open it read-only so this option does not
change anything for this case.
- -v, --verbose
- increase level of verbosity. Can be used multiple times.
- -V, --version
- outputs version string then exits.
- -z, --zbc
- additionally prints out the extra ZBC field (RC_BASIS) in the READ
CAPACITY response. Using the option implicitly sets the --16
option.
The response to READ CAPACITY(16) contains a LBPRZ bit in the
SBC-3 standard (ANSI INCITS 514-2014). There was also a LBPRZ bit with the
same meaning in the Logical block provisioning VPD page (0xb2). Then
somewhat confusingly T10 expanded the LBPRZ bit to a 3 bit field in SBC-4
draft revision 7, but only in the LB provisioning VPD page. The reason for
the expansion was to report a new "provisioning initialization
pattern" state (when an unmapped logical block is read). The new state
has been assigned LBPRZ=2 in the VPD page and it re-uses LBPRZ=0 in the READ
CAPACITY(16) response. LBPRZ=1 retains the same meaning for both variants,
namely that a block of zeroes will be returned when an unmapped logical
block is read.
The exit status of sg_readcap is 0 when it is successful.
Otherwise see the sg3_utils(8) man page.
The options in this section were the only ones available prior to
sg3_utils version 1.23 . Since then this utility defaults to the newer
command line options which can be overridden by using --old (or
-O) as the first option. See the ENVIRONMENT VARIABLES section for
another way to force the use of these older command line options.
- -16
- Use the 16 byte cdb variant of the READ CAPACITY command. Equivalent to
--long in the main description.
- -b
- utility outputs two hex numbers (prefixed with '0x' and space separated)
to stdout. The first number is the maximum number of blocks on the device
(which is one plus the lba of the last accessible block). The second
number is the size of each block. If the operation fails then "0x0
0x0" is written to stdout. Equivalent to --brief in the main
description.
- -h
- output the usage message then exit. Giving the -? option also
outputs the usage message then exits.
- -H
- output the response to the READ CAPACITY command (either the 10 or 16 byte
cdb variant) in ASCII hexadecimal on stdout.
- -lba=LBA
- used in conjunction with -pmi option. This variant of READ CAPACITY
will yield the last block address after LBA prior to a delay.
Equivalent to --lba=LBA in the main description.
- -N, --new
- Switch to the newer style options.
- -pmi
- partial medium indicator: for finding the next block address prior to some
delay (e.g. head movement). In the absence of this switch, the total
number of blocks and the block size of the device are output. Equivalent
to --pmi in the main description.
- -r
- output response in binary (to stdout).
- -R
- Equivalent to --readonly in the main description.
- -v
- verbose: print out cdb of issued commands prior to execution. '-vv' and
'-vvv' are also accepted yielding greater verbosity.
- -V
- outputs version string then exits.
- -z
- Equivalent to --zbc in the main description.
Since sg3_utils version 1.23 the environment variable
SG3_UTILS_OLD_OPTS can be given. When it is present this utility will expect
the older command line options. So the presence of this environment variable
is equivalent to using --old (or -O) as the first command line
option.
Written by Douglas Gilbert
Copyright © 1999-2023 Douglas Gilbert
This software is distributed under the GPL version 2. There is NO warranty;
not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.