sg_raw(8) - phpMan

Command: man perldoc info search(apropos)  


SG_RAW(8)                                   SG3_UTILS                                   SG_RAW(8)

NAME
       sg_raw - send arbitrary SCSI or NVMe command to a device

SYNOPSIS
       sg_raw  [--binary]  [--cmdfile=CF]  [--cmdset=CS]  [--enumerate] [--help] [--infile=IFILE]
       [--nosense] [--nvm] [--outfile=OFILE] [--raw] [--readonly] [--request=RLEN] [--scan=FO,LO]
       [--send=SLEN]  [--skip=KLEN]  [--timeout=SECS]  [--verbose]  [--version] DEVICE [CDB0 CDB1
       ...]

DESCRIPTION
       This utility sends an arbitrary SCSI command (between 6 and  256  bytes)  to  the  DEVICE.
       There  may be no associated data transfer; or data may be read from a file and sent to the
       DEVICE; or data may be received from the DEVICE and then displayed or written to  a  file.
       If supported by the pass through, bidirectional commands may be sent (i.e. containing both
       data to be sent to the DEVICE and received from the DEVICE).

       The SCSI command may be between 6 and 256 bytes long. Each command byte  is  specified  in
       plain  hex  format (00..FF) without a prefix or suffix. The command can be given either on
       the command line or via the --cmdfile=CF option. See EXAMPLES section below.

       The commands pass through a generic SCSI interface which is implemented for several  oper-
       ating systems including Linux, FreeBSD and Windows.

       Experimental  support  has  been  added to send NVMe Admin and NVM commands to the DEVICE.
       Since all NVMe commands are 64 bytes long it is more convenient to  use  the  --cmdfile=CF
       option rather than type the 64 bytes of the NVMe command on the command line. See the sec-
       tion on NVME below. A heuristic based on command length is used to  decide  if  the  given
       command is SCSI or NVMe, to override this heuristic use the --cmdset=CS option.

OPTIONS
       Arguments  to  long  options are mandatory for short options as well.  The options are ar-
       ranged in alphabetical order based on the long option name.

       -b, --binary
              Dump data in binary form, even when writing to stdout.

       -c, --cmdfile=CF
              CF is the name of a file which contains the command to be executed.   Without  this
              option the command must be given on the command line, after the options and the DE-
              VICE.

       -C, --cmdset=CS
              CS is a number to indicate which command set (i.e. SCSI or NVMe) to use. 0, the de-
              fault,  causes  a  heuristic  based  on command length to be used. Use a CS of 1 to
              override that heuristic and choose the SCSI command set. Use a CS of 2 to  override
              that heuristic and choose the NVMe command set.

       -h, --help
              Display usage information and exit.

       -i, --infile=IFILE
              Read  data  from  IFILE  instead  of stdin. This option is ignored if --send is not
              specified.

       -n, --nosense
              Don't display SCSI Sense information.

       -N, --nvm
              When sending NVMe commands, the Admin command set is assumed. To send the NVM  com-
              mand  set  (e.g.  the  Read and Write (user data) commands) this option needs to be
              given.

       -o, --outfile=OFILE
              Write data received from the DEVICE to OFILE. The data is written in binary. By de-
              fault, data is dumped in hex format to stdout.  If OFILE is '-' then data is dumped
              in binary to stdout.  This option is ignored if --request is not specified.

       -w, --raw
              interpret CF (i.e. the command file) as containing binary. The default is to assume
              that it contains ASCII hexadecimal.

       -R, --readonly
              Open DEVICE read-only. The default (without this option) is to open it read-write.

       -r, --request=RLEN
              Expect  to  receive up to RLEN bytes of data from the DEVICE.  RLEN may be suffixed
              with 'k' to use kilobytes (1024 bytes) instead of bytes. RLEN is decimal unless  it
              has a leading '0x' or a trailing 'h'.
              If  RLEN is too small (i.e. either smaller than indicated by the cdb (typically the
              "allocation length" field) and/or smaller than the DEVICE tries to send back)  then
              the HBA driver may complain. Making RLEN larger than required should cause no prob-
              lems. Most SCSI "data-in" commands return a data block that contains (in its  early
              bytes)  a  length  that  the  DEVICE  would  "like" to send back if the "allocation
              length" field in the cdb is large enough. In practice, the DEVICE  will  return  no
              more bytes than indicated in the "allocation length" field of the cdb.

       -Q, --scan=FO,LO
              Scan  a range of opcodes (i.e. first byte of each command). The first opcode in the
              scan is FO (which is decimal unless it has a '0x' prefix or 'h' suffix).  The  last
              opcode  in  the  scan is LO. The maximum value of LO is 255. The remaining bytes of
              the SCSI/NVMe command are as supplied at invocation.
              Warning: this option can be dangerous.  Sending somewhat arbitrary  commands  to  a
              device  can  have  unexpected  results.  It is recommended that this option is used
              with the --cmdset=CS option where CS is 1 or 2 in order to  stop  the  command  set
              possibly changing during the scan.

       -s, --send=SLEN
              Read SLEN bytes of data, either from stdin or from a file, and send them to the DE-
              VICE. In the SCSI transport, SLEN becomes the length (in bytes) of  the  "data-out"
              buffer. SLEN is decimal unless it has a leading '0x' or a trailing 'h'.
              It  is  the  responsibility of the user to make sure that the "data-out" length im-
              plied or stated in the cdb matches SLEN. Note that some common SCSI  commands  such
              as  WRITE(10)  have a "transfer length" field whose units are logical blocks (which
              are usually 512 or 4096 bytes long).

       -k, --skip=KLEN
              Skip the first KLEN bytes of the input file or stream. This option  is  ignored  if
              --send is not specified. If --send is given and this option is not given, then zero
              bytes are skipped.

       -t, --timeout=SECS
              Wait up to SECS seconds for command completion (default: 20).  Note that if a  com-
              mand  times  out the operating system may start by aborting the command and if that
              is unsuccessful it may attempt to reset the device.

       -v, --verbose
              Increase level of verbosity. Can be used multiple times.

       -V, --version
              Display version and license information and exit.

NOTES
       The sg_inq utility can be used to send an INQUIRY command to a device to determine its pe-
       ripheral device type (e.g. '1' for a streaming device (tape drive)) which determines which
       SCSI command sets a device should support (e.g. SPC and SSC). The sg_vpd utility reads and
       decodes a device's Vital Product Pages which may contain useful information.

       The  ability to send more than a 16 byte CDB (in some cases 12 byte CDB) may be restricted
       by the pass-through interface, the low level driver or the transport. In the Linux  series
       3  kernels,  the bsg driver can handle longer CDBs, block devices (e.g. /dev/sdc) accessed
       via the SG_IO ioctl cannot handle CDBs longer than 16 bytes, and the sg driver can  handle
       longer CDBs from lk 3.17 .

       The  CDB  command  name  defined  by T10 for the given CDB is shown if the '-vv' option is
       given. The command line syntax still needs to be correct, so /dev/null may be used for the
       DEVICE since the CDB command name decoding is done before the DEVICE is checked.

       The  intention  of  the --scan=FO,LO option is to slightly simplify the process of finding
       hidden or undocumented commands. It should be used with care;  for  example  checking  for
       vendor specific SCSI commands: 'sg_raw --cmdset=1 --scan=0xc0,0xff /dev/sg1 0 0 0 0 0 0'.

NVME SUPPORT
       Support for NVMe (a.k.a. NVM Express) is currently experimental. NVMe concepts map reason-
       ably well to the SCSI architecture. A SCSI logical unit (LU) is similar to  a  NVMe  name-
       space  (although LUN 0 is very common in SCSI while namespace IDs start at 1). A SCSI tar-
       get device is similar to a NVMe controller. SCSI commands vary from 6 to  260  bytes  long
       (although  SCSI command descriptor blocks (cdb_s) longer than 32 bytes are uncommon) while
       all NVMe commands are currently 64 bytes long. The SCSI architecture makes  a  clear  dis-
       tinction  between  an initiator (often called a HBA) and a target (device) while (at least
       on the PCIe transport) the NVMe controller plays both roles.  This utility defaults to as-
       suming  the  user  provided  64 byte command belongs to NVMe's Admin command set. To issue
       commands from the "NVM" command set, the --nvm option must be given. Admin  and  NVM  com-
       mands are sent to submission queue 0.

       One significant difference is that SCSI uses a big endian representation for integers that
       are longer than 8 bits (i.e. longer than 1 byte) while NVMe uses a little endian represen-
       tation  (like most things that have originated from the Intel organisation). NVMe specifi-
       cations talk about Words (16 bits), Double Words (32 bits) and sometimes  Quad  Words  (64
       bits) and has tighter alignment requirements than SCSI.

       One  difference  that  impacts this utility is that NVMe places pointers to host memory in
       its commands while SCSI leaves this detail to whichever transport it is using  (e.g.  SAS,
       iSCSI,  SRP).  Since  this  utility takes the command from the user (either on the command
       line or in a file named CF) but this utility allocates a data-in or data-out buffer as re-
       quired,  the  user  does not know in advance what the address of that buffer will be. Some
       special  addresses  have  been  introduced  to  help  with  this  problem:   the   address
       0xfffffffffffffffe   is   interpreted   as   "use  the  data-in  buffer's  address"  while
       0xfffffffffffffffd is interpreted as "use the data-out buffer's address". Since NVMe  uses
       little  endian notation then that first address appears in the NVMe command byte stream as
       "fe" followed by seven "ff"s. A similar arrangement is made for the length of that  buffer
       (in  bytes),  but  since that is a 32 byte quantity, the first 4 bytes (all "ff"s) are re-
       moved.

       Several command file examples can be found in the examples  directory  of  this  package's
       source   tarball:  nvme_identify_ctl.hex,  nvme_dev_self_test.hex,  nvme_read_ctl.hex  and
       nvme_write_ctl.hex .

       Beware: the NVMe standard often refers to some of its fields as  "0's  based".   They  are
       typically  counts  of something like the number of blocks to be read.  For example in NVMe
       Read command, a "0's based" number of blocks field containing the value 3 means to read  4
       blocks! No, this is not a joke.

EXAMPLES
       These examples, apart from the last one, use Linux device names. For suitable device names
       in other supported Operating Systems see the sg3_utils(8) man page.

       sg_raw /dev/scd0 1b 00 00 00 02 00
              Eject the medium in CD drive /dev/scd0.

       sg_raw -r 1k /dev/sg0 12 00 00 00 60 00
              Perform an INQUIRY on /dev/sg0 and dump the response data (up  to  1024  bytes)  to
              stdout.

       sg_raw -s 512 -i i512.bin /dev/sda 3b 02 00 00 00 00 00 02 00 00
              Showing  an  example of writing 512 bytes to a sector on a disk is a little danger-
              ous. Instead this example will read i512.bin (assumed to be 512 bytes long) and use
              the  SCSI  WRITE  BUFFER  command to send it to the "data" buffer (that is mode 2).
              This is a safe operation.

       sg_raw -r 512 -o o512.bin /dev/sda 3c 02 00 00 00 00 00 02 00 00
              This will use the SCSI READ BUFFER command to read 512 bytes from the "data" buffer
              (i.e.  mode  2)  then write it to the o512.bin file.  When used in conjunction with
              the previous example, if both commands work then  'cmp  i512.bin  o512.bin'  should
              show a match.

       sg_raw  --infile=urandom.bin --send=512 --request=512 --outfile=out.bin "/dev/bsg/7:0:0:0"
       53 00 00 00 00 00 00 00 01 00
              This is a bidirectional XDWRITEREAD(10) command being sent via a Linux bsg  device.
              Note  that  data is being read from "urandom.bin" and sent to the device (data-out)
              while resulting data (data-in) is placed in  the  "out.bin"  file.  Also  note  the
              length  of  both is 512 bytes which corresponds to the transfer length of 1 (block)
              in the cdb (i.e.  the second last byte). urandom.bin can be produced like this:
              dd if=/dev/urandom bs=512 count=1 of=urandom.bin

       sg_raw.exe PhysicalDrive1 a1 0c 0e 00 00 00 00 00 00 e0 00 00
              This example is from Windows and shows a ATA STANDBY IMMEDIATE command  being  sent
              to   PhysicalDrive1.   That   ATA   command   is  contained  within  the  SCSI  ATA
              PASS-THROUGH(12) command (see the SAT or SAT-2 standard at http://www.t10.org). No-
              tice  that  the  STANDBY  IMMEDIATE command does not send or receive any additional
              data, however if it fails sense data should be returned and displayed.

EXIT STATUS
       The exit status of sg_raw is 0 when it is successful. Otherwise see the  sg3_utils(8)  man
       page.

AUTHOR
       Written by Ingo van Lil

REPORTING BUGS
       Report bugs to <inguin at gmx dot de> or to <dgilbert at interlog dot com>.

COPYRIGHT
       Copyright (C) 2001-2021 Ingo van Lil
       This  software  is distributed under the GPL version 2. There is NO warranty; not even for
       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

SEE ALSO
       sg_inq, sg_vpd, sg3_utils (sg3_utils), plscsi

sg3_utils-1.46                             January 2021                                 SG_RAW(8)

Generated by $Id: phpMan.php,v 4.55 2007/09/05 04:42:51 chedong Exp $ Author: Che Dong
On Apache
Under GNU General Public License
2025-01-14 14:32 @52.14.125.137 CrawledBy Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
Valid XHTML 1.0!Valid CSS!