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

FreeBSD Manual Pages

  
 
  

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] [--ver-
       bose] [--version] DEVICE

       sg_luns	 --test=ALUN   [--decode]  [--hex]  [--inner-hex]  [--lu_cong]
       [--verbose]

DESCRIPTION
       In the first form shown in the SYNOPSIS this utility sends the SCSI RE-
       PORT 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 associ-
       ated with the DEVICE. Roughly speaking that is all LUNs that share  the
       target  device  that the	REPORT LUNS command is sent through. This com-
       mand is defined in the SPC-3 and	SPC-4 SCSI standards and  its  support
       is mandatory. The most recent 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
	      section 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
	      response (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 invocation 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 invoca-
	      tion of this utility decoding it	with  the  --inhex=FN  option.
	      When  this  option  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  con-
	      tains ASCII hexadecimal or binary	representing a REPORT LUNS re-
	      sponse.  This  utility  will  then decode	that response. See the
	      "HEX, BINARY AND JSON FORMATS" section in	the sg3_utils  manpage
	      for  more	information. If	the --raw option is also given then FN
	      is treated as binary.

       -I, --inner-hex
	      used together with the --decode option so	that the decoded  val-
	      ues  are shown in	hexadecimal. The default action	is to show de-
	      coded values 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
	      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 out-
	      put 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  represen-
	      tation  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  integer  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	corresponding INQUIRY response.	When  this  option  is
	      not  given  and --decode 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 cor-
	      responding  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
	      command. The default value is 0. Hexadecimal values may be given
	      with  a leading "0x" or a	trailing "h". For detailed information
	      see the REPORT LUNS command in SPC (most recent is  SPC-4	 revi-
	      sion 37 in section 6.33).	To simplify, for the I_T nexus associ-
	      ated  with  the DEVICE, 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 re-
	      sponse data that matches either DEVICE or	FN. Linux places  this
	      standard INQUIRY response	in its sysfs pseudo filesystem.	A typ-
	      ical location is at /sys/class/scsi_device/<hctl>/device/inquiry
	      where  <hctl>  is	a four part numeric tuple separated by colons.
	      This tuple distinguishes the device from any others on the  sys-
	      tem.
	      Currently	 the  LU_CONG  field is	read from the standard INQUIRY
	      response when this option	is given. The --raw option has no  ef-
	      fect  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
	      letter  'L'  followed by a decimal number	(see below). The hexa-
	      decimal 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 separators the ALUN would need to be
	      surrounded by single or double quotes.
	      In the leading 'L' case the, following decimal  number  (hex  if
	      preceded	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 hexadec-
	      imal  number it can have a trailing 'L' in which case the	corre-
	      sponding Linux "word flipped" LUN	value is output.  The  LUN  is
	      decoded in all cases.
	      The  action  when	used with --decode is explained	under that op-
	      tion.

       -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) discov-
       ery.  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,  tar-
       get=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
       warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PUR-
       POSE.

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+14.3.quarterly>

home | help