# phpman > man > sg3_utils(8)

[SG3_UTILS(8)](https://www.chedong.com/phpMan.php/man/SG3UTILS/8/markdown)                                  SG3_UTILS                                 [SG3_UTILS(8)](https://www.chedong.com/phpMan.php/man/SG3UTILS/8/markdown)



## NAME
       sg3_utils - a package of utilities for sending SCSI commands

## SYNOPSIS
       **sg**___***** [_--dry-run_] [_--enumerate_] [_--help_] [_--hex_] [_--in=FN_] [_--inhex=FN_] [_--maxlen=LEN_] [_--raw_]
       [_--timeout=SECS_] [_--verbose_] [_--version_] [_OTHER_OPTIONS_] _DEVICE_

## DESCRIPTION
       sg3_utils is a package of utilities that send SCSI commands to the given _DEVICE_  via  a  SCSI
       pass through interface provided by the host operating system.

       The  names  of  all utilities start with "sg" and most start with "sg_" often followed by the
       name, or a shortening of the name, of the SCSI  command  that  they  send.  For  example  the
       "sg_verify"  utility  sends  the SCSI VERIFY command. A mapping between SCSI commands and the
       sg3_utils utilities that issue them is shown in the COVERAGE file. The sg_raw utility can  be
       used to send an arbitrary SCSI command (supplied on the command line) to the given _DEVICE_.

       sg_decode_sense can be used to decode SCSI sense data given on the command line or in a file.
       sg_raw -vvv will output the T10 name of a given SCSI CDB which is most often 16 bytes or less
       in length.

       SCSI  draft  standards  can  be found at <http://www.t10.org> . The standards themselves can be
       purchased from ANSI and other standards organizations.  A good overview of various SCSI stan‐
       dards  can  be  seen in <http://www.t10.org/scsi-3.htm> with the SCSI command sets in the upper
       part of the diagram. The highest level (i.e. most abstract) document is the SCSI Architecture
       Model  (SAM)  with  SAM-5 being the most recent standard (ANSI INCITS 515-2016) with the most
       recent draft being SAM-6 revision 4 . SCSI commands in common with all device  types  can  be
       found  in SCSI Primary Commands (SPC) of which SPC-4 is the most recent standard (ANSI INCITS
       513-2015). The most recent SPC draft is SPC-5 revision 21.  Block  device  specific  commands
       (e.g.  as  used by disks) are in SBC, those for tape drives in SSC, those for SCSI enclosures
       in SES and those for CD/DVD/BD drives in MMC.

       It is becoming more common to control ATA disks with the SCSI command set.  This involves the
       translation of SCSI commands to their corresponding ATA equivalents (and that is an imperfect
       mapping in some cases). The relevant standard is called SCSI to ATA Translation  (SAT,  SAT-2
       and  SAT-3) are now standards at INCITS(ANSI) and ISO while SAT-4 is at the draft stage.  The
       logic to perform the command translation is often called a SAT  Layer  or  SATL  and  may  be
       within an operating system, in host bus adapter firmware or in an external device (e.g. asso‐
       ciated with a SAS expander). See <http://www.t10.org> for more information.

       There is some support for SCSI tape devices but not for their basic operation. The reader  is
       referred to the "mt" utility.

       There  are  two  generations of command line option usage. The newer utilities (written since
       July 2004) use the getopt_long() function to parse command line options. With that  function,
       each option has two representations: a short form (e.g. '-v') and a longer form (e.g. '--ver‐
       bose'). If an argument is required then it follows a space (optionally) in the short form and
       a "=" in the longer form (e.g. in the sg_verify utility '-l 2a6h' and '--lba=2a6h' are equiv‐
       alent). Note that with getopt_long(), short form options can be elided, for  example:  '-all'
       is  equivalent  to '-a -l -l'.  The _DEVICE_ argument may appear after, between or prior to any
       options.

       The older utilities, including as sg_inq, sg_logs, sg_modes, sg_opcode,  sg_rbuff,   sg_read‐
       cap,  sg_senddiag, sg_start and sg_turs had individual command line processing code typically
       based on a single "-" followed by one or more characters. If an argument is  needed  then  it
       follows  a  "="  ( e.g. '-p=1f' in sg_modes with its older interface). Various options can be
       elided as long as it is not ambiguous (e.g. '-vv' to increase the verbosity).

       Over time the command line interface of these older utilities  became  messy  and  overloaded
       with  options.  So in sg3_utils version 1.23 the command line interface of these older utili‐
       ties was altered to have both a cleaner getopt_long() interface and their older interface for
       backward  compatibility.   By default these older utilities use their getopt_long() based in‐
       terface.  The getopt_long() is a GNU extension (i.e. not yet POSIX certified) but more recent
       command   line   utilities   tend  to  use  it.  That  can  be  overridden  by  defining  the
       SG3_UTILS_OLD_OPTS environment variable or using '-O' or '--old' as the  first  command  line
       option. The man pages of the older utilities documents the details.

       Several  sg3_utils utilities are based on the Unix dd command (e.g. sg_dd) and permit copying
       data at the level of SCSI READ and WRITE commands. sg_dd is tightly bound to Linux and  hence
       is  not ported to other OSes. A more generic utility (than sg_dd) called ddpt in a package of
       the same name has been ported to other OSes.

## ENVIRONMENT VARIABLES
       The SG3_UTILS_OLD_OPTS environment variable is explained in the previous section. It is  only
       for backward compatibility of the command line options for older utilities.

       The  SG3_UTILS_DSENSE environment variable may be set to a number. It is only used by the em‐
       bedded SNTL within the library used by the utilities in this library. SNTL is a SCSI to  NVMe
       Translation  Layer.  This  environment  variable defaults to 0 which will lead to any utility
       that issues a SCSI command that is translated to a NVMe command (by the embedded  SNTL)  that
       fails at the NVMe dvice, to return SCSI sense in 'fixed' format. If this variable is non-zero
       then then the returned SCSI sense will be in 'descriptor' format.

       Several utilities have their own environment variable setting (e.g.  sg_persist  has  SG_PER‐
       SIST_IN_RDONLY). See individual utility man pages for more information.

       There  is  a  Linux specific environment variable called SG3_UTILS_LINUX_NANO that if defined
       and the sg driver in the system is 4.0.30 or later, will show command durations  in  nanosec‐
       onds  rather  than  the  default milliseconds.  Command durations are typically only shown if
       --verbose is used 3 or more times. Due to an interface problem (a 32 bit integer that  should
       be  64  bits  with  the benefit of hindsight) the maximum duration that can be represented in
       nanoseconds is about 4.2 seconds. If longer durations may occur then don't define this  envi‐
       ronment variable (or undefine it).

## LINUX DEVICE NAMING
       Most  disk  block  devices  have names like /dev/sda, /dev/sdb, /dev/sdc, etc.  SCSI disks in
       Linux have always had names like that but in recent Linux kernels it has become  more  common
       for  many  other  disks (including SATA disks and USB storage devices) to be named like that.
       Partitions within a disk are specified by a number appended to the device name, starting at 1
       (e.g. /dev/sda1 ).

       Tape  drives are named /dev/st<num> or /dev/nst<num> where <num> starts at zero. Additionally
       one letter from this list: "lma" may be appended to the name. CD, DVD  and  BD  readers  (and
       writers)  are  named  /dev/sr<num> where <num> start at zero. There are less used SCSI device
       type names, the dmesg and the lsscsi commands may help to find if any are attached to a  run‐
       ning system.

       There  is also a SCSI device driver which offers alternate generic access to SCSI devices. It
       uses names of the form /dev/sg<num> where <num> starts at zero. The "lsscsi -g"  command  may
       be  useful  in  finding  these and which generic name corresponds to a device type name (e.g.
       /dev/sg2 may correspond to /dev/sda). In the lk 2.6 series a block SCSI  generic  driver  was
       introduced  and its names are of the form /dev/bsg/<h:c:t:l> where h, c, t and l are numbers.
       Again see the lsscsi command to  find  the  correspondence  between  that  SCSI  tuple  (i.e.
       <h:c:t:l>) and alternate device names.

       Prior  to  the  Linux  kernel  2.6 series these utilities could only use generic device names
       (e.g. /dev/sg1 ). In almost all cases in the Linux kernel 2.6 series, any device name can  be
       used by these utilities.

       Very little has changed in Linux device naming in the Linux kernel 3 and 4 series.

## WINDOWS DEVICE NAMING
       Storage and related devices can have several device names in Windows.  Probably the most com‐
       mon in the volume name (e.g. "D:"). There are also a "class" device  names  such  as  "Physi‐
       calDrive<n>",  "CDROM<n>" and "TAPE<n>". <n> is an integer starting at 0 allocated in ascend‐
       ing order as devices are discovered (and sometimes rediscovered).

       Some storage devices have a SCSI lower level device name which starts with  a  SCSI  (pseudo)
       adapter  name  of the form "SCSI<n>:". To this is added sub-addressing in the form of a "bus"
       number, a "target" identifier and a LUN (Logical Unit Number). The "bus" number is also known
       as  a  "PathId".  These are assembled to form a device name of the form: "SCSI<n>:<bus>,<tar‐
       get>,<lun>". The trailing ",<lun>" may be omitted in which case a LUN  of  zero  is  assumed.
       This  lower  level device name cannot often be used directly since Windows blocks attempts to
       use it if a class driver has "claimed" the device. There are SCSI device types (e.g.  Automa‐
       tion/Drive  interface type) for which there is no class driver. At least two transports ("bus
       types" in Windows jargon): USB and IEEE 1394 do not have a "scsi" device names of this form.

       In keeping with DOS file system conventions, the various device names can be given in  upper,
       lower  or  mixed  case.  Since  "PhysicalDrive<n>"  is  tedious to write, a shortened form of
       "PD<n>" is permitted by all utilities in this package.

       A single device (e.g. a disk) can have many device names. For  example:  "PD0"  can  also  be
       "C:",  "D:"  and "SCSI0:0,1,0". The two volume names reflect that the disk has two partitions
       on it. Disk partitions that are not recognized by Windows are  not  usually  given  a  volume
       name.  However Vista does show a volume name for a disk which has no partitions recognized by
       it and when selected invites the user to format it (which may be rather unfriendly  to  other
       OSes).

       These  utilities  assume  a given device name is in the Win32 device namespace.  To make that
       explicit "\\.\" can be prepended to the device names mentioned in this section.  Beware  that
       backslash  is  an  escape  character in Unix like shells and the C programming language. In a
       shell like Msys (from MinGW) each backslash may need to be typed twice.

       The sg_scan utility within this package lists out Windows device names  in  a  form  that  is
       suitable for other utilities in this package to use.

## FREEBSD DEVICE NAMING
       SCSI  disks  have  block names of the form /dev/da<num> where <num> is an integer starting at
       zero. The "da" is replaced by "sa" for SCSI tape drives and "cd" for SCSI  CD/DVD/BD  drives.
       Each  SCSI  device  has  a  corresponding pass-through device name of the form /dev/pass<num>
       where <num> is an integer starting at zero. The "camcontrol devlist" command  may  be  useful
       for  finding  out  which SCSI device names are available and the correspondence between class
       and pass-through names.

       FreeBSD allows device names to be given without the leading "/dev/"  (e.g.   da0  instead  of
       /dev/da0).  That  worked in this package up until version 1.43 when the unadorned device name
       (e.g. "da0") gave an error. The original action (i.e. allowing unadorned  device  names)  has
       been restored in version 1.46 . Also note that symlinks (to device names) are followed before
       prepending "/dev/" if the resultant name doesn't start with a "/".

## SOLARIS DEVICE NAMING
       SCSI device names below the /dev directory have a form like: c5t4d3s2 where the  number  fol‐
       lowing  "c"  is  the  controller  (HBA) number, the number following "t" is the target number
       (from the SCSI parallel interface days) and the number following "d" is  the  LUN.  Following
       the  "s"  is  the  slice number which is related to a partition and by convention "s2" is the
       whole disk.

       OpenSolaris also has a c5t4d3p2 form where the number following the "p" is the partition num‐
       ber  apart  from  "p0"  which is the whole disk. So a whole disk may be referred to as either
       c5t4d3, c5t4d3s2 or c5t4d3p0 .

       And these device names are duplicated in the /dev/dsk and /dev/rdsk directories.  The  former
       is  the  block  device name and the latter is for "raw" (or char device) access which is what
       sg3_utils needs. So in OpenSolaris something of the form 'sg_inq  /dev/rdsk/c5t4d3p0'  should
       work.   If  it doesn't work then add a '-vvv' option for more debug information.  Trying this
       form 'sg_inq /dev/dsk/c5t4d3p0' (note "rdsk" changed to "dsk") will result in an "inappropri‐
       ate ioctl for device" error.

       The  device names within the /dev directory are typically symbolic links to much longer topo‐
       logical names in the /device directory. In Solaris cd/dvd/bd drives seem  to  be  treated  as
       disks  and so are found in the /dev/rdsk directory. Tape drives appear in the /dev/rmt direc‐
       tory.

       There is also a sgen (SCSI generic) driver which by default does not attach  to  any  device.
       See the /kernel/drv/sgen.conf file to control what is attached. Any attached device will have
       a device name of the form /dev/scsi/c5t4d3 .

       Listing available SCSI devices in Solaris seems to be a challenge. "Use the 'format' command"
       advice works but seems a very dangerous way to list devices. [It does prompt again before do‐
       ing any damage.] 'devfsadm -Cv' cleans out the clutter in the /dev/rdsk directory, only leav‐
       ing what is "live". The "cfgadm -v" command looks promising.

## NVME SUPPORT
       NVMe (or NVM Express) is a relatively new storage transport and command set. The level of ab‐
       straction of the NVMe command set is somewhat lower the SCSI  command  sets,  closer  to  the
       level  of  abstraction  of ATA (and SATA) command sets. NVMe claims to be designed with flash
       and modern "solid state" storage in mind, something unheard of when SCSI was  originally  de‐
       veloped in the 1980s.

       The SCSI command sets' advantage is the length of time they have been in place and the exist‐
       ing tools (like these) to support it. Plus SCSI command sets level of abstraction is both and
       advantage  and  disadvantage. Recently the NVME-MI (Management Interface) designers decide to
       use the SCSI Enclosure Services (SES-3) standard "as is" with the addition of two  tunnelling
       NVME-MI commands: SES Send and SES Receive. This means after the OS interface differences are
       taken into account, the sg_ses, sg_ses_microcode and sg_senddiag utilities can be used  on  a
       NVMe device that supports a newer version of NVME-MI.

       The  NVME-MI SES Send and SES Receive commands correspond to the SCSI SEND DIAGNOSTIC and RE‐
       CEIVE DIAGNOSTIC RESULTS commands respectively.  There are however a few other commands  that
       need  to  be  translated, the most important of which is the SCSI INQUIRY command to the NVMe
       Identify controller/namespace. Starting in version 1.43 these utilities contain a small  SNTL
       (SCSI to NVMe Translation Layer) to take care of these details.

       As  a  side  effect of this "juggling" if the sg_inq utility is used (without the --page= op‐
       tion) on a NVMe _DEVICE_ then the actual NVMe Identifier (controller  and  possibly  namespace)
       responses  are  decoded and output. However if 'sg_inq --page=sinq <device>' is given for the
       same _DEVICE_ then parts of the NVMe Identify controller and namespace response are  translated
       to a SCSI standard INQUIRY response which is then decoded and output.

       Apart  from  the special case with the sg_inq, all other utilities in the package assume they
       are talking to a SCSI device and decode any response accordingly. One easy way for  users  to
       see  the underlying device is a NVMe device is the standard INQUIRY response Vendor Identifi‐
       cation field of "NVMe    " (an 8 character long string with 4 spaces to the right).

       The following SCSI commands are currently supported by the SNTL library:  INQUIRY,  MODE  SE‐
       [LECT(10)](https://www.chedong.com/phpMan.php/man/LECT/10/markdown),  MODE [SENSE(10)](https://www.chedong.com/phpMan.php/man/SENSE/10/markdown), READ(10,16), READ CAPACITY(10,16), RECEIVE DIAGNOSTIC RESULTS, RE‐
       QUEST SENSE, REPORT LUNS, REPORT SUPPORTED OPERATION CODES, REPORT SUPPORTED TASK  MANAGEMENT
       FUNCTIONS, SEND DIAGNOSTICS, START STOP UNIT, SYNCHRONIZE CACHE(10,16), TEST UNIT READY, VER‐
       IFY(10,16), WRITE(10,16) and WRITE SAME(10,16).

## EXIT STATUS
       To aid scripts that call these utilities, the exit status is set to indicate success  (0)  or
       failure (1 or more). Note that some of the lower values correspond to the SCSI sense key val‐
       ues.

       The exit status values listed below can be given to the  sg_decode_sense  utility  (which  is
       found in this package) as follows:
         sg_decode_sense --err=<exit_status>
       and a short explanatory string will be output to stdout.

       The exit status values are:

       **0**      success.  Also  used  for  some  utilities that wish to return a boolean value for the
              "true" case (and that no error has occurred). The false case is conveyed by exit  sta‐
              tus 36.

       **1**      syntax  error.  Either  illegal  command line options, options with bad arguments or a
              combination of options that is not permitted.

       **2**      the _DEVICE_ reports that it is not ready for the operation requested.  The  _DEVICE_  may
              be  in the process of becoming ready (e.g.  spinning up but not at speed) so the util‐
              ity may work after a wait. In Linux the _DEVICE_ may be temporarily blocked while  error
              recovery is taking place.

       **3**      the  _DEVICE_  reports a medium or hardware error (or a blank check). For example an at‐
              tempt to read a corrupted block on a disk will yield this value.

       **5**      the _DEVICE_ reports an "illegal request" with an additional sense code other than  "in‐
              valid  command operation code". This is often a supported command with a field set re‐
              questing an unsupported capability. For commands that require a "service action" field
              this  value  can  indicate that the command with that service action value is not sup‐
              ported.

       **6**      the _DEVICE_ reports a "unit attention" condition. This usually indicates that something
              unrelated  to the requested command has occurred (e.g. a device reset) potentially be‐
              fore the current SCSI command was sent. The requested command has not been executed by
              the  device.  Note  that unit attention conditions are usually only reported once by a
              device.

       **7**      the _DEVICE_ reports a "data protect" sense key. This implies some mechanism has blocked
              writes (or possibly all access to the media).

       **9**      the  _DEVICE_  reports an illegal request with an additional sense code of "invalid com‐
              mand operation code" which means that it doesn't support the requested command.

       **10**     the _DEVICE_ reports a "copy aborted". This implies another command  or  device  problem
              has  stopped  a  copy operation. The EXTENDED COPY family of commands (including WRITE
              USING TOKEN) may return this sense key.

       **11**     the _DEVICE_ reports an aborted command. In some cases aborted commands can  be  retried
              immediately (e.g. if the transport aborted the command due to congestion).

       **14**     the  _DEVICE_  reports a miscompare sense key. VERIFY and COMPARE AND WRITE commands may
              report this.

       **15**     the utility is unable to open, close or use the given _DEVICE_ or some other  file.  The
              given  file  name  could  be incorrect or there may be permission problems. Adding the
              '-v' option may give more information.

       **17**     a SCSI "Illegal request" sense code received with a flag indicating the Info field  is
              valid. This is often a LBA but its meaning is command specific.

       **18**     the  _DEVICE_ reports a medium or hardware error (or a blank check) with a flag indicat‐
              ing the Info field is valid. This is often a LBA (of the first encountered error)  but
              its meaning is command specific.

       **20**     the _DEVICE_ reports it has a check condition but "no sense" and non-zero information in
              its additional sense codes. Some polling commands (e.g.  REQUEST  SENSE)  can  receive
              this  response.  There  may be useful information in the sense data such as a progress
              indication.

       **21**     the _DEVICE_ reports a "recovered error". The requested  command  was  successful.  Most
              likely  a utility will report a recovered error to stderr and continue, probably leav‐
              ing the utility with an exit status of 0 .

       **22**     the _DEVICE_ reports that the current command or its parameters imply  a  logical  block
              address (LBA) that is out of range. This happens surprisingly often when trying to ac‐
              cess the last block on a storage device; either a classic "off by one" logic error  or
              a  misreading of the response from READ CAPACITY(10 or 16) in which the address of the
              last block rather than the number of blocks on the _DEVICE_ is returned. Since LBAs  are
              origin zero they range from 0 to n-1 where n is the number of blocks on the _DEVICE_, so
              the LBA of the last block is one less than the total number of blocks.

       **24**     the _DEVICE_ reports a SCSI status of "reservation conflict". This means access  to  the
              _DEVICE_  with the current command has been blocked because another machine (HBA or SCSI
              "initiator") holds a reservation on this _DEVICE_. On modern SCSI systems  this  is  re‐
              lated to the use of the PERSISTENT RESERVATION family of commands.

       **25**     the _DEVICE_ reports a SCSI status of "condition met". Currently only the PRE-FETCH com‐
              mand (see SBC-4) yields this status.

       **26**     the _DEVICE_ reports a SCSI status of "busy". SAM-6 defines this status as  the  logical
              unit  is  temporarily  unable  to process a command. It is recommended to re-issue the
              command.

       **27**     the _DEVICE_ reports a SCSI status of "task set full".

       **28**     the _DEVICE_ reports a SCSI status of "ACA active". ACA is "auto contingent  allegiance"
              and is seldom used.

       **29**     the  _DEVICE_ reports a SCSI status of "task aborted". SAM-5 says: "This status shall be
              returned if a command is aborted by a command or task management function  on  another
              I_T nexus and the Control mode page TAS bit is set to one".

       **31**     error involving two or more command line options. They may be contradicting, select an
              unsupported mode, or a required option (given the context) is missing.

       **32**     there is a  logic  error  in  the  utility.  It  corresponds  to  code  comments  like
              "shouldn't/can't get here". Perhaps the author should be informed.

       **33**     the command sent to _DEVICE_ has timed out.

       **34**     this  is  a  Windows  only exit status and indicates that the Windows error number (32
              bits) cannot meaningfully be mapped to an equivalent Unix error number returned as the
              exit status (7 bits).

       **36**     no  error  has occurred plus the utility wants to convey a boolean value of false. The
              corresponding true value is conveyed by a 0 exit status.

       **40**     the command sent to _DEVICE_ has received an "aborted command" sense key with  an  addi‐
              tional  sense code of 0x10. This value is related to problems with protection informa‐
              tion (PI or DIF). For example this error may occur when reading a  block  on  a  drive
              that  has never been written (or is unmapped) if that drive was formatted with type 1,
              2 or 3 protection.

       **41**     the command sent to _DEVICE_ has received an "aborted command" sense key with  an  addi‐
              tional  sense  code of 0x10 (as with error code) plus a flag indicating the Info field
              is valid.

       **48**     this is an internal message indicating a NVMe status field (SF) is other than zero af‐
              ter  a  command  has  been executed (i.e. something went wrong).  Work in this area is
              currently experimental.

       **49**     low level driver reports a response's residual count (i.e. number  of  bytes  actually
              received by HBA is 'requested_bytes - residual_count') that is nonsensical.

       **50**     OS  system  calls that fail often return a small integer number to help. In Unix these
              are called "errno" values where 0 implies no error. These error codes set aside 51  to
              96  for mapping these errno values but that may not be sufficient. Higher errno values
              that cannot be mapped are all mapped to this value (i.e. 50).
              Note that an errno value of 0 is mapped to error code 0.

       **50** **+** **<os**___**error**___**number>**
              OS system calls that fail often return a small integer number to  help  indicate  what
              the  error  is.  For example in Unix the inability of a system call to allocate memory
              returns (in 'errno') ENOMEM which often is associated with the integer 12. So 62 (i.e.
              '50 + 12') may be returned by a utility in this case. It is also possible that a util‐
              ity in this package reports 50+ENOMEM when it can't allocate memory,  not  necessarily
              from  an  OS system call. In recent versions of Linux the file showing the mapping be‐
              tween symbolic constants (e.g. ENOMEM) and the corresponding integer is in the  kernel
              source code file: include/uapi/asm-generic/errno-base.h
              Note  that  errno values that are greater than or equal to 47 cannot fit in range pro‐
              vided. Instead they are all mapped to 50 as discussed in the previous entry.

       **97**     a SCSI command response failed sanity checks.

       **98**     the _DEVICE_ reports it has a check condition but the error doesn't fit into any of  the
              above categories.

       **99**     any  errors  that  can't be categorized into values 1 to 98 may yield this value. This
              includes transport and operating system errors after the command has been sent to  the
              device.

### 100-125
              these  error codes are used by the ddpt utility which uses the sg3_utils library. They
              are mainly specialized error codes associated with offloaded copies.

       **126**    the utility was found but could not be executed. That might occur  if  the  executable
              does not have execute permissions.

       **127**    This  is the exit status for utility not found. That might occur when a script calls a
              utility in this package but the PATH environment variable has not  been  properly  set
              up, so the script cannot find the executable.

### 128 + <signum>
              If  a  signal  kills a utility then the exit status is 128 plus the signal number. For
              example if a segmentation fault occurs then a utility is typically killed  by  SIGSEGV
              which  according  to 'man 7 signal' has an associated signal number of 11; so the exit
              status will be 139 .

       **255**    the utility tried to yield an exit status of 255 or larger. That  should  not  happen;
              given here for completeness.

       Most of the error conditions reported above will be repeatable (an example of one that is not
       is "unit attention") so the utility can be run again with the '-v' option (or several) to ob‐
       tain more information.

## COMMON OPTIONS
       Arguments to long options are mandatory for short options as well. In the short form an argu‐
       ment to an option uses zero or more spaces as a separator (i.e. the short form does  not  use
       "=" as a separator).

       If an option takes a numeric argument then that argument is assumed to be decimal unless oth‐
       erwise indicated (e.g. with a leading "0x", a trailing "h" or as noted in the usage message).

       Some options are used uniformly in most of the utilities in this package. Those  options  are
       listed below. Note that there are some exceptions.

### -d --dry-run
              utilities  that can cause lots of user data to be lost or overwritten sometimes have a
              _--dry-run_ option. Device modifying actions are typically bypassed (or skipped) to  im‐
              plement  a policy of "do no harm".  This allows complex command line invocations to be
              tested before the action required (e.g. format a disk) is performed. The _--dry-run_ op‐
              tion  has  become  a  common  feature  of  many command line utilities (e.g.  the Unix
              'patch' command), not just those from this package.
              Note that most hyphenated option names in this package also can be given with  an  un‐
              derscore rather than a hyphen (e.g.  _--dry_run_).

### -e --enumerate
              some utilities (e.g. sg_ses and sg_vpd) store a lot of information in internal tables.
              This option will output that information in some readable  form  (e.g.  sorted  by  an
              acronym or by page number) then exit. Note that with this option _DEVICE_ is ignored (as
              are most other options) and no SCSI IO takes place, so the invoker does not  need  any
              elevated permissions.

### -h -? --help
              output  the usage message then exit. In a few older utilities the '-h' option requests
              hexadecimal output. In these cases the '-?' option will output the usage message  then
              exit.

### -H --hex
              for  SCSI commands that yield a non-trivial response, print out that response in ASCII
              hexadecimal. To produce hexadecimal that can be parsed by other utilities (e.g.  with‐
              out  a  relative address to the left and without trailing ASCII) use this option three
              or four times.

### -i --in
              many SCSI commands fetch a significant amount of data (returned in the data-in buffer)
              which several of these utilities decode (e.g. sg_vpd and sg_logs). To separate the two
              steps of fetching the data from a SCSI device and then decoding it,  this  option  has
              been  added.  The  first step (fetching the data) can be done using the _--hex_ or _--raw_
              option and redirecting the command line output to a file (often done with ">" in  Unix
              based  operating  systems).  The difference between _--hex_ and _--raw_ is that the former
              produces output in ASCII hexadecimal while _--raw_ produces its output in "raw" binary.
              The second step (i.e. decoding the SCSI response data now held in a file) can be  done
              using  this _--in=FN_ option where the file name is _FN_. If "-" is used for _FN_ then stdin
              is assumed, again this allows for command line redirection (or piping). That file  (or
              stdin)  is  assumed to contain ASCII hexadecimal unless the _--raw_ option is also given
              in which case it is assumed to be binary. Notice that the meaning of the _--raw_  option
              is "flipped" when used with _--in=FN_ to act on the input, typically it acts on the out‐
              put data.
              Since the structure of the data returned by SCSI commands varies considerably then the
              usage  information or the manpage of the utility being used should be checked. In some
              cases _--hex_ may need to be used multiple times (and  is  more  conveniently  given  as
              '-HH' or '-HHH).

### -i --inhex
              This  option  has the same or similar functionality as _--in=FN_. And perhaps 'inhex' is
              more descriptive since by default, ASCII hexadecimal is expected in  the  contents  of
              file:  _FN_.  Alternatively  the  short  form option may be _-I_ or _-X_. See the "FORMAT OF
              FILES CONTAINING ASCII HEX" section below for more information.

### -m --maxlen
              several important SCSI commands (e.g. INQUIRY and MODE SENSE)  have  response  lengths
              that  vary depending on many factors, only some of which these utilities take into ac‐
              count. The maximum response length is typically specified in the  'allocation  length'
              field of the cdb. In the absence of this option, several utilities use a default allo‐
              cation length (sometimes recommended in the SCSI draft standards) or a "double  fetch"
              strategy.   See  [sg_logs(8)](https://www.chedong.com/phpMan.php/man/sglogs/8/markdown)  for  its  description of a "double fetch" strategy. These
              techniques are imperfect and in the presence of faulty SCSI targets can cause problems
              (e.g.  some  USB  mass  storage  devices  freeze if they receive an INQUIRY allocation
              length other than 36). Also use of this option disables any  "double  fetch"  strategy
              that may have otherwise been used.

### -r --raw
              for SCSI commands that yield a non-trivial response, output that response in binary to
              stdout. If any error messages or warning are produced they are usually sent to  stderr
              so as to not interfere with the output from this option.
              Some  utilities  that  consume data to send to the _DEVICE_ along with the SCSI command,
              use this option. Alternatively the _--in=FN_ option causes _DEVICE_ to be ignored and  the
              response data (to be decoded) fetched from a file named _FN_. In these cases this option
              may indicate that binary data can be read from stdin or from a  nominated  file  (e.g.
              _FN_).

### -t --timeout
              utilities  that  issue  potentially  long-running  SCSI  commands often have a _--time__‐
              _out=SECS_ option. This typically instructs the operating system to abort the SCSI  com‐
              mand in question once the timeout expires. Aborting SCSI commands is typically a messy
              business and in the case of format like commands may leave the  device  in  a  "format
              corrupt"  state  requiring  another long-running re-initialization command to be sent.
              The argument, _SECS_, is usually in seconds and the short form  of  the  option  may  be
              something  other than _-t_ since the timeout option was typically added later as storage
              devices grew in size and initialization commands took longer. Since many utilities had
              relatively  long  internal command timeouts before this option was introduced, the ac‐
              tual command timeout given to the operating systems is  the  higher  of  the  internal
              timeout and _SECS_.
              Many  long  running SCSI commands have an IMMED bit which causes the command to finish
              relatively quickly but the initialization process to continue. In such cases  the  RE‐
              QUEST SENSE command can be used to monitor progress with its progress indication field
              (see the sg_requests and sg_turs utilities).  Utilities that send  such  SCSI  command
              either  have  an _--immed_ option or a _--wait_ option which is the logical inverse of the
              "immediate" action.

### -v --verbose
              increase the level of verbosity, (i.e. debug output). Can be used  multiple  times  to
              further  increase verbosity. The additional output caused by this option is almost al‐
              ways sent to stderr.

### -V --version
              print the version string and then exit. Each utility has its own  version  number  and
              date of last code change.

## NUMERIC ARGUMENTS
       Many utilities have command line options that take numeric arguments. These numeric arguments
       can be large values (e.g. a logical block address (LBA) on a disk) and can be inconvenient to
       enter in the default decimal representation. So various other representations are permitted.

       Multiplicative  suffixes are accepted. They are one, two or three letter strings appended di‐
       rectly after the number to which they apply:

          c C         *1
          w W         *2
          b B         *512
          k K KiB     *1024
          KB kB       *1000
          m M MiB     *1048576
          MB mB       *1000000
          g G GiB     *(2^30)
          GB gB       *(10^9)
          t T TiB     *(2^40)
          TB          *(10^12)
          p P PiB     *(2^50)
          PB          *(10^15)

       An example is "2k" for 2048. The large tera and peta suffixes are only available for  numeric
       arguments that might require 64 bits to represent internally.

       These  multiplicative suffixes are compatible with GNU's dd command (since 2002) which claims
       compliance with SI and with IEC 60027-2.

       A suffix of the form "x<n>" multiplies the preceding number by <n>. An example is "2x33"  for
       "66".  The left argument cannot be '0' as '0x' will be interpreted as hexadecimal number pre‐
       fix (see below). The left argument to the multiplication must  end  in  a  hexadecimal  digit
       (i.e.   0  to f) and the whole expression cannot have any embedded whitespace (e.g.  spaces).
       An ugly example: "0xfx0x2" for 30.

       A suffix of the form "+<n>" adds the preceding number  to  <n>.  An  example  is  "3+1k"  for
       "1027".  The  left argument to the addition must end in a hexadecimal digit (i.e. 0 to f) and
       the whole expression cannot have any embedded  whitespace  (e.g.  spaces).  Another  example:
       "0xf+0x2" for 17.

       Alternatively  numerical  arguments  can be given in hexadecimal. There are two syntaxes. The
       number can be preceded by either "0x" or "0X" as found in the  C  programming  language.  The
       second  hexadecimal  representation is a trailing "h" or "H" as found in (storage) standards.
       When hex numbers are given, multipliers cannot be used. For example the decimal  value  "256"
       can be given as "0x100" or "100h".

## FORMAT OF FILES CONTAINING ASCII HEX
       Such  a  file  is  assumed to contain a sequence of one or two digit ASCII hexadecimal values
       separated by whitespace. "Whitespace consists of either spaces, tabs,  blank  lines,  or  any
       combination  thereof".  Each  one  or two digit ASCII hex pair is decoded into a byte (i.e. 8
       bits). The following will be decoded to valid (ascending valued) bytes: '0', '01', '3',  'c',
       'F',  '4a',  'cC',  'ff'.   Lines containing only whitespace are ignored. The contents of any
       line containing a hash mark ('#') is ignored from that point until  the  end  of  that  line.
       Users  are  encouraged  to use hash marks to introduce comments in hex files. The author uses
       the extension'.hex' on such files. Examples can be found in the 'inhex' directory.

## MICROCODE AND FIRMWARE
       There are two standardized methods for downloading microcode (i.e. device firmware) to a SCSI
       device.  The  more general way is with the SCSI WRITE BUFFER command, see the sg_write_buffer
       utility. SCSI enclosures have their own method based on the Download microcode control/status
       diagnostic page, see the sg_ses_microcode utility.

### SCRIPTS, EXAMPLES and UTILS
       There are several bash shell scripts in the 'scripts' subdirectory that invoke compiled util‐
       ities (e.g. sg_readcap). Several of the scripts start with 'scsi_'  rather  than  'sg_'.  One
       purpose  of  these scripts is to call the same utility (e.g. sg_readcap) on multiple devices.
       Most of the basic compiled utilities only allow one device as an argument. Some distributions
       install these scripts in a more visible directory (e.g. /usr/bin). Some of these scripts have
       man page entries. See the README file in the 'scripts' subdirectory.

       There is some example C code plus examples of complex invocations in the 'examples' subdirec‐
       tory.  There  is  also  a README file. The example C may be a simpler example of how to use a
       SCSI pass-through in Linux than the main utilities (found in the 'src' subdirectory). This is
       due  to  the  fewer abstraction layers (e.g. they don't worry the MinGW in Windows may open a
       file in text rather than binary mode).

       Some utilities that the author has found useful have been placed in the 'utils' subdirectory.

## WEB SITE
       There is a web page discussing this package at <http://sg.danny.cz/sg/sg3_utils.html> . The de‐
       vice   naming   used   by  this  package  on  various  operating  systems  is  discussed  at:
       <http://sg.danny.cz/sg/device_name.html>   .    There    is    a    git    code    mirror    at
       <https://github.com/hreinecke/sg3_utils> . The principle code repository uses subversion and is
       on the author's equipment. The author keeps track of this via the subversion revision  number
       which is an ascending integer (currently at 774 for this package). The github mirror gets up‐
       dated periodically from the author's repository. Depending on the time of update,  the  above
       Downloads section at sg.danny.cz may be more up to date than the github mirror.

## AUTHORS
       Written  by  Douglas  Gilbert. Some utilities have been contributed, see the CREDITS file and
       individual source files (in the 'src' directory).

## REPORTING BUGS
       Report bugs to <dgilbert at interlog dot com>.

## COPYRIGHT
       Copyright © 1999-2021 Douglas Gilbert
       Some utilities are distributed under a GPL version 2 license while others, usually  more  re‐
       cent ones, are under a FreeBSD license. The files that are common to almost all utilities and
       thus contain the most reusable code, namely sg_lib.[hc], sg_cmds_basic.[hc]  and  sg_cmds_ex‐
       tra.[hc]  are  under a FreeBSD license. There is NO warranty; not even for MERCHANTABILITY or
       FITNESS FOR A PARTICULAR PURPOSE.

## SEE ALSO
### sdparm(sdparm), ddpt(ddpt), lsscsi(lsscsi), [dmesg(1)](https://www.chedong.com/phpMan.php/man/dmesg/1/markdown), [mt(1)](https://www.chedong.com/phpMan.php/man/mt/1/markdown)



sg3_utils-1.46                               March 2021                                 [SG3_UTILS(8)](https://www.chedong.com/phpMan.php/man/SG3UTILS/8/markdown)
