Skip site navigation (1)Skip section navigation (2)

  
 
  

home | help
SG_LUNS(8)			    SG3_UTILS			      SG_LUNS(8)

NAME
     sg_luns - send SCSI REPORT LUNS command or decode given LUN

SYNOPSIS
     sg_luns	[--decode]    [--help]	  [--hex]   [--inhex=FN]   [--inner-hex]
     [--json[=JO]]   [--js-file=JFN]   [--linux]   [--lu_cong]	  [--maxlen=LEN]
     [--quiet] [--raw] [--readonly] [--select=SR] [--sinq_inraw=RFN] [--verbose]
     [--version] DEVICE

     sg_luns  --test=ALUN  [--decode]  [--hex] [--inner-hex] [--lu_cong] [--ver-
     bose]

DESCRIPTION
     In the first form shown in the SYNOPSIS this utility sends the SCSI  REPORT
     LUNS command to the DEVICE and outputs the response. The response should be
     a	list  of  LUNs ("a LUN inventory") for the I_T nexus associated with the
     DEVICE. Roughly speaking that is all LUNs that share the target device that
     the REPORT LUNS command is sent through. This command  is	defined  in  the
     SPC-3  and  SPC-4 SCSI standards and its support is mandatory. The most re-
     cent draft if SPC-6 revision 1.

     When the --test=ALUN option is given (the second  form  in  the  SYNOPSIS),
     then  the	ALUN  value  is decoded as outlined in various SCSI Architecture
     Model (SAM) standards and recent drafts (e.g.  SAM-6  revision  2,  section
     4.7) .

     Where required below the first form shown in the SYNOPSIS is called "device
     mode" and the second form is called "test mode".

OPTIONS
     Arguments to long options are mandatory for short options as well.

     -d, --decode
	    decode LUNs into their component parts, as described in the LUN sec-
	    tion of SAM-3, SAM-4 and SAM-5.
	    [test  mode]  ALUN is decoded irrespective of whether this option is
	    given or not. If this option is given once then the  given	ALUN  is
	    output in T10 preferred format (which is 8 pairs of hex digits, each
	    separated  by a space). If given twice then the given ALUN is output
	    in an alternate T10 format made up of four quads of hex digits  with
	    each quad separated by a "-" (e.g. C101-0000-0000-0000).

     -h, --help
	    output the usage message then exit.

     -H, --hex
	    [device  mode] when given once this utility will output the SCSI re-
	    sponse (i.e.  the data-out buffer) to the  REPORT  LUNS  command  in
	    ASCII  hex	then exit. When given twice it causes --decode to output
	    component fields in hex rather than decimal. Notice that this  (i.e.
	    how   '-HH'   is   processed)   differs   from  the  description  in
	    sg3_utils(8). The --inner-hex option has the same action  as  '-HH'.
	    When  this	option	is  used three (or more) times the hex output is
	    suitable for placing in a file and using it with a later sg_luns in-
	    vocation with the --inhex=FN option.
	    [test mode] when this option is given, then decoded component fields
	    of ALUN are output in hex.
	    When this option is given three or more times, ASCII hex  bytes  are
	    output  (up  to  16 per line) with no leading address or index. This
	    output is suitable for placing in a file  and  later  invocation  of
	    this  utility  decoding it with the --inhex=FN option. When this op-
	    tion is used four times, a comment line (starting with '#' is  added
	    before  the  hex)  describing  what the hex was generated by. A file
	    containing such comments is still parsable by the --inhex=FN option.

     -i, --inhex=FN
	    FN is expected to be a file name (or '-' for stdin)  which	contains
	    ASCII  hexadecimal	or  binary  representing a REPORT LUNS response.
	    This utility will then decode that response. See  the  "HEX,  BINARY
	    AND JSON FORMATS" section in the sg3_utils manpage for more informa-
	    tion.  If  the  --raw option is also given then FN is treated as bi-
	    nary.

     -I, --inner-hex
	    used together with the --decode option so that  the  decoded  values
	    are shown in hexadecimal. The default action is to show decoded val-
	    ues  in  decimal.	This option has the same action as '-HH' but the
	    intent is a little clearer with this option.

     -j[=JO], --json[=JO]
	    output is in JSON format instead of plain text form. Note that argu-
	    ments 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, --linux
	    this option is only available in Linux. After the T10 representation
	    of each 64 bit LUN (in 16 hexadecimal digits),  if	this  option  is
	    given  then to the right, in square brackets, is the Linux LUN inte-
	    ger in decimal.  If the --hex option is given twice  (e.g.	-HH)  as
	    well then the Linux LUN integer is output in hexadecimal.

     -L, --lu_cong
	    this  option  is only considered with --decode. When given once then
	    the list of LUNs is decoded as if the LU_CONG bit was  set	in  each
	    LU's  corresponding  INQUIRY  response. When given twice the list of
	    LUNs is decoded as if the LU_CONG bit was clear in each LU's  corre-
	    sponding  INQUIRY  response. When this option is not given and --de-
	    code is given then an INQUIRY is sent to the DEVICE and the  setting
	    of its LU_CONG bit is used to decode the list of LUNs.
	    [test  mode]  decode ALUN as if the LU_CONG bit is set in its corre-
	    sponding standard INQUIRY response. In other words treat ALUN as  if
	    it	is a conglomerate LUN. If not given (or given twice) then decode
	    ALUN as if the LU_CONG bit is clear.

     -m, --maxlen=LEN
	    where LEN is the (maximum) response length in bytes. It is placed in
	    the cdb's "allocation length" field. If not given (or LEN  is  zero)
	    then 8192 is used. The maximum allowed value of LEN is 1048576.

     -q, --quiet
	    output  only  the  ASCII  hex  rendering of each report LUN, one per
	    line.  Without the	--quiet  option,  there  is  header  information
	    printed before the LUN listing.

     -r, --raw
	    output  the  SCSI  response (i.e. the data-out buffer) in binary (to
	    stdout).

     -R, --readonly
	    open the DEVICE read-only (e.g. in Unix  with  the	O_RDONLY  flag).
	    The default is to open it read-write.

     -s, --select=SR
	    SR is placed in the SELECT REPORT field of the SCSI REPORT LUNS com-
	    mand. The default value is 0. Hexadecimal values may be given with a
	    leading "0x" or a trailing "h". For detailed information see the RE-
	    PORT  LUNS	command in SPC (most recent is SPC-4 revision 37 in sec-
	    tion 6.33). To simplify, for the I_T nexus associated with	the  DE-
	    VICE, the meanings of the SR values defined to date for SPC-4 are:
		0 : most luns excluding well known logical unit numbers
		1 : well known logical unit numbers
		2 : all luns accessible to this I_T nexus
		0x10 : only accessible administrative luns
		0x11  :  administrative  luns  plus  non-conglomerate  luns (see
	    SPC-4)
		0x12 : if DEVICE is an administrative LU, then report its
		       lun plus its subsidiary luns
	    For SR values 0x10 and 0x11, the DEVICE must be either LUN 0 or  the
	    REPORT  LUNS  well	known logical unit. Values between 0xf8 and 0xff
	    (inclusive) are vendor specific, other  values  are  reserved.  This
	    utility will accept any value between 0 and 255 (0xff) for SR .

     -Q, --sinq_inraw=RFN
	    where  RFN is a filename containing binary standard INQUIRY response
	    data that matches either DEVICE or FN. Linux  places  this	standard
	    INQUIRY  response in its sysfs pseudo filesystem. A typical location
	    is at /sys/class/scsi_device/<hctl>/device/inquiry where <hctl> is a
	    four part numeric tuple separated  by  colons.  This  tuple  distin-
	    guishes the device from any others on the system.
	    Currently  the  LU_CONG  field is read from the standard INQUIRY re-
	    sponse when this option is given. The --raw option has no effect  on
	    this option. The DEVICE argument may be given with this option.

     -t, --test=ALUN
	    ALUN  is assumed to be a hexadecimal number in ASCII hex or the let-
	    ter 'L' followed by a decimal number (see  below).	The  hexadecimal
	    number can be up to 64 bits in size (i.e. 16 hexadecimal digits) and
	    is	padded to the right if less than 16 hexadecimal digits are given
	    (e.g.  --test=0122003a represents T10 LUN: 01 22 00 3a 00 00 00 00).
	    ALUN may be prefixed by '0x' or  '0X'  (e.g.  the  previous  example
	    could  have  been  --test=0x0122003a).  ALUN  may also be given with
	    spaces, tabs, or a '-' between each byte (or  other  grouping  (e.g.
	    c101-0000-0000-0000)).  However  in the case of space or tab separa-
	    tors the ALUN would need  to  be  surrounded  by  single  or  double
	    quotes.
	    In	the  leading 'L' case the, following decimal number (hex if pre-
	    ceded by '0x') is assumed to be a Linux "word flipped" LUN which  is
	    converted  into  a T10 LUN representation and printed. In both cases
	    the number is interpreted as a LUN and decoded as  if  the	--decode
	    option had been given. Also when ALUN is a hexadecimal number it can
	    have  a  trailing  'L'  in	which case the corresponding Linux "word
	    flipped" LUN value is output. The LUN is decoded in all cases.
	    The action when used with --decode is explained under that option.

     -v, --verbose
	    increase the level of verbosity, (i.e. debug output).

     -V, --version
	    print the version string and then exit.

NOTES
     The SCSI REPORT LUNS command is important for Logical Unit (LU)  discovery.
     After  a  target  device is discovered (usually via some transport specific
     mechanism) and after sending an INQUIRY command (to determine  the  LU_CONG
     setting),	a  REPORT  LUNS command should either be sent to LUN 0 (which is
     Peripheral device addressing method with bus_id=0 and target/lun=0)  or  to
     the  REPORT  LUNS	well known LUN (i.e. 0xc101000000000000). SAM-5 requires
     that one of these responds with an inventory of LUNS that are contained  in
     this target device.

     In test mode, if the --hex option is given once then in the decoded output,
     some  of  the  component fields are printed in hex with leading zeros.  The
     leading zeros are to indicate the size of the component field. For example:
     in the Peripheral device addressing method (16 bits overall), the bus ID is
     6 bits wide and the target/LUN field is 8 bits wide; so both are shown with
     two hex digits (e.g. bus_id=0x02, target=0x3a).

EXAMPLES
     Typically by the time user space programs get to run, SCSI  LUs  have  been
     discovered.  In  Linux  the lsscsi utility lists the LUs that are currently
     present. The LUN of a device (LU) is the fourth element in the tuple at the
     beginning of each line. Below we see a target (or "I_T Nexus": "6:0:0") has
     two LUNS: 1 and 49409. If 49409 is converted into	T10  LUN  format  it  is
     0xc101000000000000 which is the REPORT LUNS well known LUN.

       # lsscsi -g
       [6:0:0:1]    disk    Linux    scsi_debug       0004  /dev/sdb   /dev/sg1
       [6:0:0:2]    disk    Linux    scsi_debug       0004  /dev/sdc   /dev/sg2
       [6:0:0:49409]wlun    Linux    scsi_debug       0004  -	       /dev/sg3

     We  could	send  a  REPORT LUNS command (with SR 0x0, 0x1 or 0x2) to any of
     those file device nodes and get the same result. Below we use /dev/sg1 :

       # sg_luns /dev/sg1
       Lun list length = 16 which implies 2 lun entries
       Report luns [select_report=0x0]:
	   0001000000000000
	   0002000000000000

     That is a bit noisy so cut down the clutter with --quiet:

       # sg_luns -q /dev/sg1
       0001000000000000
       0002000000000000

     Now decode that LUN into its component parts:

       # sg_luns -d -q /dev/sg1
       0001000000000000
	     Peripheral device addressing: lun=1
       0002000000000000
	     Peripheral device addressing: lun=2

     Now use --select=1 to find out if there are any well known LUNs:

       # sg_luns -q -s 1 /dev/sg1
       c101000000000000

     So how many LUNs do we have all together (associated with the  current  I_T
     Nexus):

       # sg_luns -q -s 2 /dev/sg1
       0001000000000000
       0002000000000000
       c101000000000000

       # sg_luns -q -s 2 -d /dev/sg1
       0001000000000000
	     Peripheral device addressing: lun=1
       0002000000000000
	     Peripheral device addressing: lun=1
       c101000000000000
	     REPORT LUNS well known logical unit

     The following example uses the --linux option and is not available in other
     operating systems. The extra number in square brackets is the Linux version
     of T10 LUN shown at the start of the line.

       # sg_luns -q -s 2 -l /dev/sg1
       0001000000000000    [1]
       0002000000000000    [2]
       c101000000000000    [49409]

     Now  we  use  the	--test=  option to decode LUNS input on the command line
     (rather than send a REPORT LUNS command and act on the response):

       # sg_luns --test=0002000000000000
       Decoded LUN:
	 Peripheral device addressing: lun=2

       # sg_luns --test="c1 01"
       Decoded LUN:
	 REPORT LUNS well known logical unit

       # sg_luns -t 0x023a004b -H
       Decoded LUN:
	 Peripheral device addressing: bus_id=0x02, target=0x3a
	 >>Second level addressing:
	   Peripheral device addressing: lun=0x4b

     The next example is Linux specific as we try to find out what the Linux LUN
     49409 translates to in the T10 world:

       # sg_luns --test=L49409
       64 bit LUN in T10 preferred (hex) format:  c1 01 00 00 00 00 00 00
       Decoded LUN:
	 REPORT LUNS well known logical unit

     And the mapping between T10 and Linux LUN representations can be  done  the
     other way:

       # sg_luns -t c101L
       Linux 'word flipped' integer LUN representation: 49409
       Decoded LUN:
	 REPORT LUNS well known logical unit

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

AUTHORS
     Written by Douglas Gilbert.

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

COPYRIGHT
     Copyright (C) 2004-2023 Douglas Gilbert
     This software is distributed under a BSD-2-Clause license. There is NO war-
     ranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

SEE ALSO
     sg_inq(8),sg3_utils(8)

sg3_utils-1.48			    June 2023			      SG_LUNS(8)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=sg_luns&sektion=8&manpath=FreeBSD+Ports+15.1.quarterly>

home | help