Provided by: lsscsi_0.30-0.1_amd64 bug

NAME

       lsscsi - list SCSI devices (or hosts), list NVMe devices

SYNOPSIS

       lsscsi  [--brief]  [--classic]  [--controllers]  [--device] [--generic] [--help] [--hosts]
       [--kname] [--list] [--long] [--long-unit] [--lunhex]  [--no-nvme]  [--pdt]  [--protection]
       [--protmode]  [--scsi_id]  [--size]  [--sysfsroot=PATH]  [--sz-lbs] [--transport] [--unit]
       [--verbose] [--version] [--wwn] [H:C:T:L]

DESCRIPTION

       Uses information in sysfs (Linux kernel series 2.6 and later) to  list  SCSI  devices  (or
       hosts)  currently attached to the system. Many non-SCSI storage devices (but not all) used
       the SCSI subsystem in Linux. In lsscsi  version  0.30  support  was  added  to  list  NVMe
       devices.

       In  single line per device (LU or NVMe namespace) mode, the default, each line starts with
       a 4 element tuple surrounded by square brackets. For SCSI devices the first element 'H' is
       the host number, the second element 'C' is the controller number, the third element 'T' is
       the target number and the final element is the Logical Unit Number  (LUN).  All  four  are
       integers.   For  NVMe namespaces see two paragraphs down. When the --hosts option is given
       for SCSI devices the tuple is reduced to one element: the host number.

       If a H:C:T:L tuple is given as an argument on the command line then it acts  as  a  filter
       and  only  devices that match it are listed. The colons don't have to be present, and '-',
       '*', '?' or missing components at the end are interpreted as  wildcards.  The  default  is
       '*:*:*:*'  which means to match devices (i.e.  Logical Units). Any filter string using '*'
       of '?'  should be surrounded by single or double quotes to stop shell expansions.  If  '-'
       is used as a wildcard then the whole filter tuple should be prefixed by '-- ' to tell this
       utility there are no more options on the command line to be interpreted.   A  leading  '['
       and  trailing  ']'  are permitted ( e.g. '[1:0:0]' matches all LUNs on 1:0:0). May also be
       used to filter --hosts in which case only the H is active and may be either a number or in
       the form "host<n>" where <n> is a host number.

       For  NVMe  devices  and controllers almost all of the previous paragraph applies. The main
       difference is that "N" appears in the 'H' (first) position.  The 'C' position for NVMe  is
       the controller's Linux generated "char" device minor number which is the first number that
       appears in a typical NVMe controller name, for example: "/dev/nvme2". The 'T' position for
       NVMe  is the "CNTLID" value. The final 'L' position is the NVMe namespace identifier which
       is typically a sequential value starting at 1. The leading explicit "N" for  NVMe  devices
       is  converted  internally  into  a large value (32,767) that should not interfere with any
       Linux generated SCSI host number; it also means that the numeric sort used to  show  hosts
       (controllers)  and  devices  (LUs  or  logical  units)  will always place NVMe devices and
       controllers after those that use the SCSI subsystem. To filter using  a  H:C:T:L  argument
       for  NVMe  controllers,  "hostN",  "hostN:<num>",  "N"  or  "N:<num>" may be used; when no
       "<num>" is given, only NVMe controllers will be  listed  (i.e.  it  lists  no  SCSI  hosts
       (HBAs)).

       By  default  in  this  utility device node names (e.g. "/dev/sda" or "/dev/root_disk") are
       obtained by noting the major and minor numbers for the listed device obtained  from  sysfs
       (e.g.  the  contents  of  "/sys/block/sda/dev") and then looking for a match in the "/dev"
       directory. This "match by major and minor" will allow  devices  that  have  been  given  a
       different name by udev (for example) to be correctly reported by this utility.

       In  some  situations it may be useful to see the device node name that Linux would produce
       by default, so the --kname option is provided.  An example of where this may be useful  is
       kernel error logs which tend to report disk error messages using the disk's default kernel
       name.

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. Hyphenated long options can
       also take underscore, and vice versa (e.g. --scsi_id or --scsi-id are acceptable).

       -b, --brief
              reduces one line per device output to the tuple and the primary device name.   This
              may  simplify  scripts  that process the output of this utility. With the --generic
              option it will show on each line the tuple (from which the bsg pass-through  device
              name  can be deduced), the primary device name (which the block subsystem uses) and
              the sg device name (also a pass-through).
              When the --pdt option is used together with this option the SCSI Peripheral  Device
              Type  (PDT)  is  displayed  in  hex (with a leading "0x") between the tuple and the
              primary device name. For NVMe namespaces "0x0" is displayed (for a disk  or  direct
              access device).

       -c, --classic
              The output is similar to that obtained from 'cat /proc/scsi/scsi'

       -C, --controllers
              Lists NVMe controllers and SCSI hosts. This is a synonym for the --hosts option.

       -d, --device
              After  outputting  the  (probable) SCSI device name the device node major and minor
              numbers are shown in brackets (e.g. "/dev/sda[8:0]").

       -g, --generic
              Output the SCSI generic device file name. Note that if the sg driver is a module it
              may need to be loaded otherwise '-' may appear.
              NVMe  does not have generic (char) devices in the same sense as SCSI.  Instead NVMe
              Admin, NVM (i.e. block type commands such as Read and  Write)  and  MI  (Management
              Interface  (e.g.  to  an  enclosure))  commands  are  all  sent  to  the containing
              controller whose device name is shown when the --hosts option is used.
              To unclutter the single line per device mode the --brief option combined with  this
              option should help.

       -h, --help
              Output the usage message and exit.

       -H, --hosts
              List  the SCSI hosts and NVMe controllers currently attached to the system. If this
              option is not given (and the --controllers option is not given) then  SCSI  devices
              (logical units (LUs)) followed by NVMe devices (namespaces) are listed.

       -k, --kname
              Use  Linux  default  algorithm  for  naming devices (e.g. block major 8, minor 0 is
              "/dev/sda") rather than the "match by major and minor" in the "/dev"  directory  as
              discussed above.

       -L, --list
              Output  additional information in <attribute_name>=<value> pairs, one pair per line
              preceded by two spaces. This option has the same effect as '-lll'.

       -l, --long
              Output additional information for each SCSI device (host).  Can  be  used  multiple
              times  for  more  output  in  which case the shorter option form is more convenient
              (e.g. '-lll'). When used three times  (i.e.  '-lll')  outputs  SCSI  device  (host)
              attributes    one    per    line;   preceded   by   two   spaces;   in   the   form
              "<attribute_name>=<value>".

       -U, --long-unit
              Output logical unit name in full, if available.  It  replaces  the  normal  vendor,
              product  and revision strings given in the single logical unit per line mode. If no
              logical unit name is found "none" is printed. If the  logical  unit  name  is  long
              (e.g.  a  UUID)  then following fields are pushed further to the right as required.
              This option is functionally equivalent to the '-uuu' option.
              If the option is used twice (e.g. '-UU') then EUI, NAA,  UUID  and  T10  vendor  ID
              formats are prefixed by "eui.", "naa.", "uuid." and "t10." respectively.  Note that
              SCSI name format used by iSCSI should already be  prefixed  by  'iqn.'.  Using  the
              '--unit' option 4 or more times (e.g. '-uuuu') will have the same action as '-UU'.
              --long_unit is also an acceptable form when invoking this option.

       -x, --lunhex
              when  this  option  is  used once the LUN in the tuple (at the start of each device
              line) is shown in "T10" format which is up to 16 hexadecimal digits. It is prefixed
              by  "0x" to distinguish the LUN from the decimal value shown in the absence of this
              option. Also hierarchal LUNs are shown with a "_" character separating the  levels.
              For  example  the  two level LUN: 0x0355006600000000 will appear as 0x0355_0066. If
              this option is given twice (e.g. using the short form:  '-xx')  then  the  full  16
              hexadecimal digits are shown for each LUN, prefixed by "0x".
              For NVMe, the namespace identifier (nsid) is shown in the "L" position. The nsid is
              a 32 bit unsigned quantities  with  0x0  and  0xffffffff  reserved.   Without  this
              option,  the  nsid  is  shown in decimal. When this option is used once the nsid is
              output in hex with a lead 0x and with up to 3 leading zeros.  When this  option  is
              used twice the nsid is output in hex with up to 7 leading zeros.

       -N, --no-nvme
              this  option  excludes NVMe devices and controllers for the output. This option may
              be needed to stop NVMe device output interfering with specific format  output  like
              that produced when the --classic option is used.
              To  only  show  NVMe  devices,  use  'lsscsi N', to only show NVMe controllers, use
              'lsscsi -H N'.

       -D, --pdt
              this option displays the SCSI Peripheral Device Type (PDT) in hex preceded by "0x".
              For  NVME namespaces "0x0' is displayed which corresponds to a disk ("Direct Access
              Device" or SSD). In single line output  this  hex  PDT  replaces  the  device  type
              abbreviation (e.g. "0x0     " replaces "disk    ") and appears after the tuple.

       -p, --protection
              Output target (DIF) and initiator (DIX) protection types.

       -P, --protmode
              Output effective protection information mode for each disk device.

       -i, --scsi_id
              outputs the udev derived matching id found in /dev/disk/by-id/scsi* .  This is only
              for disk (and disk like) devices. If no match is found  then  "dm-uuid-mpath*"  and
              "usb*"  are  searched  in  the same directory.  If there is still no match then the
              /sys/class/block/<disk>/holders directory is searched. The matching id  is  printed
              following the device name (e.g.  /dev/sdc) and if there is no match "-" is output.

       -s, --size
              Print  disk  capacity  in  human  readable form. When given once, normal base 10 SI
              units are used as a prefix for 'B' which is bytes (aka octets).  For example MB, GB
              and  TB  stand  for  10^6, 10^9 and 10^12 bytes respectively. When given twice, IEC
              80000-3 prefixes for 'B' are used; for example MiB, GiB and  TiB  stand  for  2^20,
              2^30  and  2^40  bytes respectively. The output is rounded to 3 or less significant
              figures in order to fit on a single line.
              If given three times (short form is the more  convenient:  '-sss')  then  the  disk
              capacity  as  a  logical  block  count is given. This is an exact figure in decimal
              reported by the storage device at discovery. Discovery is typically just after boot
              time, or when it was last attached if the storage device is removable.
              To  unclutter the single line per device mode the --brief option combined with this
              option should help.

       -y, --sysfsroot=PATH
              assumes sysfs is mounted at PATH instead of the default '/sys' . If this option  is
              given PATH should be an absolute path (i.e. start with '/').

       -S, --sz-lbs
              Print  disk  capacity  as a number of logical blocks (which is the same as '-sss').
              When used twice a comma is added followed by the logical block size  in  bytes.  It
              should be a number like 512 or 4096.
              If  the  logical  block  size  cannot  be  found (e.g. because the version of Linux
              predates the /sys/block/<dev_name>/queue directory) then the  number  of  512  byte
              blocks  followed  comma  and  then  '512'  is  output irrespective of what the true
              logical block size of the device is. This special case action occurs  whether  this
              option is given one or more times.
              To  unclutter the single line per device mode the --brief option combined with this
              option should help.

       -t, --transport
              Output transport information. This  will  be  target  related  information  or,  if
              --hosts  is  given, initiator related information. When used without --list, a name
              or identifier (or both) are output on a single line, usually prefixed by  the  type
              of  transport. For devices this information replaces the normal vendor, product and
              revision strings. When the --list option is also given then  additionally  multiple
              lines  of  attribute_name=value  pairs are output, each indented by two spaces. See
              the section on transports below.

       -u, --unit
              Output logical unit name, if available. If this option is given once or twice, then
              the  30  character field where the vendor, product and revision strings are usually
              placed is expanded to 32 characters and replaced by the logical unit  name.  If  no
              logical  unit  name is found "none" is printed.  The first found of the NAA, EUI-64
              or SCSI name string is output unless a SCSI name string is found and the associated
              target  port  indicates  the  iSCSI protocol, in which case the SCSI name string is
              preferred. Finally if there is no match on the above and a T10 Vendor ID descriptor
              is found then it is used.
              If  the name cannot fit in the 32 character field then it is truncated to the right
              and a trailing '_' character is used to alert the reader to the truncation. The  32
              character  width is chosen since that is large enough to hold 16 byte NAA or EUI-64
              identifiers. However SCSI name strings as used by iSCSI can be larger than that.
              If this option is used twice then this field is also  32  character  wide.  If  the
              logical  unit  name  cannot fit then it will be truncated to the left and a leading
              '_' character is used to alert the reader to the truncation.
              If this option is used three times the whole logical unit name is output,  followed
              by several spaces.
              In order for this option to work, it needs a Linux kernel from and including 3.15 .
              It accesses the sysfs vpd_pg83 file for the device in question. Old  SCSI  and  ATA
              (SATA)  equipment may not provide this information. If it is provided by ATA (SATA)
              then it will be the WWN.

       -v, --verbose
              outputs directory names where information is found. Use  multiple  times  for  more
              output.

       -V, --version
              outputs  version  information  then  exits. If used once outputs to stderr; if used
              twice outputs to stdout and shortens the date to yyyymmdd numeric format.

       -w, --wwn
              outputs the WWN for disks instead of manufacturer, model and revision  (or  instead
              of  transport information). The World Wide Name (WWN) is typically 64 bits long (16
              hex digits) but could be up to 128 bits long. To indicate the WWN  is  hexadecimal,
              it  is prefixed by "0x". The ATA/SATA WWN is referred to as LU name in SCSI jargon;
              hence this option is more or less superseded by the --unit and --long-unit options.

TRANSPORTS

       This utility lists SCSI devices which  are  known  as  logical  units  (LU)  in  the  SCSI
       Architecture  Model (ref: SAM-5 at http://www.t10.org) or hosts when the --hosts option is
       given. A host is called an  initiator  in  SAM-5.  A  SCSI  command  travels  out  via  an
       initiator,  across some transport to a target and then onwards to a logical unit. A target
       device may contain several logical units. A target device has one or more ports  that  can
       be  viewed  as  transport end points. Each FC and SAS disk is a single target that has two
       ports and contains one logical unit. If both  target  ports  on  a  FC  or  SAS  disk  are
       connected  and  visible  to a machine, then lsscsi will show two entries. Initiators (i.e.
       hosts) also have one or more ports and some HBAs in Linux have a host entry per  initiator
       port while others have a host entry per initiator device.

       When  the  --transport  option is given for devices (i.e.  --hosts not given) then most of
       the information produced by lsscsi is associated with the target, or more  precisely:  the
       target port, through which SCSI commands pass that access a logical unit.

       Typically  this  utility  provides one line of output per "device" or host.  Significantly
       more information can be obtained by adding the --list option. When used together with  the
       --transport  option,  after  the  summary  line,  multiple  lines  of  transport  specific
       information in the form  "<attribute_name>=<value>"  are  output,  each  indented  by  two
       spaces.   Using  a filter argument will reduce the volume of output if a lot of devices or
       hosts are present.

       The transports that are currently recognized are: IEEE 1394, ATA, FC,  iSCSI,  SAS,  SATA,
       SPI, SRP and USB.

       For  IEEE  1394  (a.k.a.  Firewire  and  "SBP" when storage is involved), the EUI-64 based
       target port name is output when --transport is  given,  in  the  absence  of  the  --hosts
       option.  When  the  --hosts option is given then the EUI-64 initiator port name is output.
       Output on the summary line specific to the IEEE 1394 transport is prefixed by "sbp:".

       To detect ATA and SATA devices a crude check is performed on the driver  name  (after  the
       checks  for  other  transports  are exhausted). Based on the driver name either the ATA or
       SATA transport type is chosen. Output on the summary line is either "ata:" or  "sata:".  A
       search  is  made  for  an  associated  vpd_pg83 file in sysfs, if found it may contain the
       device's WWN which is output if present. The WWN will not appear in Linux  kernels  before
       3.15  and with old PATA and SATA devices. Most device and hosts flagged as "ata:" will use
       the parallel ATA transport (PATA). For SATA devices that are attached via a SAS  expander,
       see the SAS paragraph below.

       For  Fibre  Channel  (FC) the port name and port identifier are output when --transport is
       given. In the absence of the --hosts  option  these  ids  will  be  for  the  target  port
       associated  with  the device (logical unit) being listed. When the --hosts option is given
       then the ids are for the initiator port used by the  host.  Output  on  the  summary  line
       specific  to  the  FC transport is prefixed by "fc:".  If FCoE (over Ethernet) is detected
       the prefix is changed to "fcoe:".

       For iSCSI the target port name is output when --transport is given, in the absence of  the
       --hosts  option.  This is made up of the iSCSI name and the target portal group tag. Since
       the iSCSI name starts with "iqn" no further prefix is used. When  the  --hosts  option  is
       given then only "iscsi:" is output on the summary line.

       For  Serial Attached SCSI the SAS address of the target port (or initiator port if --hosts
       option is also given) is output. This will be a  naa-5  address.  For  SAS  HBAs  and  SAS
       targets (such as SAS disks and tape drives) the SAS address will be world wide unique. For
       SATA disks attached to a SAS expander, the expander provides the SAS address by  adding  a
       non  zero  value  to  its  (i.e.  the expander's) SAS address (e.g. expander_sas_address +
       phy_id + 1). SATA disks directly attached to SAS HBAs seem to have  an  indeterminate  SAS
       address. Output on the summary line specific to the SAS transport is prefixed by "sas:".

       For  SATA  devices,  see  the  paragraph  above  on  ATA devices. As noted in the previous
       paragraph, SATA devices  attached  to  SAS  expanders  will  display  a  manufactured  SAS
       transport address (manufactured by the expander) rather than the SATA device's WWN.

       For the SCSI Parallel Interface (SPI) the target port identifier (usually a number between
       0 and 15 inclusive) is output when --transport is given, in the  absence  of  the  --hosts
       option. When the --hosts option is given then only "spi:" is output on the summary line.

       For  the PCIe transport (a.k.a. PCI Express) there at two possible storage types: NVMe and
       SOP/PQI (SCSI over PCIe). There are very few examples of  the  latter  currently  so  this
       utility  concentrates  on  NVMe.  NVMe  uses its own command set and not SCSI but has many
       things in common. Rather  than  re-invent  everything  currently  in  use  that  SCSI  has
       accumulated  over  nearly  40 years, NVMe is beginning to use some parts of SCSI. A recent
       example is the SES-3 standard for enclosure management which has been adopted by NVMe.  In
       SCSI  a  SES  device  is  a  logical  unit with a peripheral device type (PDT) of 0xd (for
       enclosure) so it will appear when the lsscsi utility is invoked without  any  options.  In
       NVMe  is  seems that an enclosure with appear as attached to the management interface (MI)
       of a NVMe controller. This means it should appear when "lsscsi --hosts" is invoked. It  is
       unclear whether such a NVMe controller can have any storage namespaces associated with it.
       The sg_ses utility (in the sg3_utils package) can then be  given  that  NVMe  controller's
       device name (e.g. /dev/nmve1).
       When  the --transport option is given, after "pcie" the NVMe controller's subsystem vendor
       id and device id are output, separated by a colon (e.g. "pcie 0x8086:0x390a").

       For the SCSI RDMA Protocol (SRP) the IB (InfiniBand) port's GUID is given.  As an example,
       it has a form like this: 0002:c903:00fa:abcd .

       When  a  USB transport is detected, the summary line will contain "usb:" followed by a USB
       device name. The USB device name has the form "<b>-<p1>[.<p2>[.<p3>]]:<c>.<i>"  where  <b>
       is  the  USB  bus number, <p1> is the port on the host. <p2> is a port on a host connected
       hub, if present.  If needed <p3> is a USB hub port closer to the USB storage  device.  <c>
       refers  to the configuration number while <i> is the interface number. There is a separate
       SCSI host for each USB (SCSI) target. A USB  SCSI  target  may  contain  multiple  logical
       units.  Thus  the  same  "usb:  <device_name>"  string appears for a USB SCSI host and all
       logical units that belong to the USB SCSI target associated with that USB SCSI host.

LUNS

       For historical reasons and as used by several other Unix based  Operating  Systems,  Linux
       uses  a  tuple  of  integers to describe (a path to) a SCSI device (also know as a Logical
       Unit (LU)). The last element of that tuple is the so-called Logical Unit Number (LUN). And
       originally  in  SCSI a LUN was an integer, at first 3 bits long, then 8 then 16 bits. SCSI
       LUNs today (SAM-5 section 4.7) are 64 bits but SCSI standards now consider a LUN to be  an
       array of 8 bytes.

       Up  until  2013, Linux mapped SCSI LUNs to a 32 bit integer by taking the first 4 bytes of
       the SCSI LUN and ignoring the last 4 bytes. Linux treated the first two bytes of the  SCSI
       LUN  as  a  unit  (a  word)  and  it became the least significant 16 bits in the Linux LUN
       integer. The next two bytes of the SCSI LUN became the upper 16  bits  in  the  Linux  LUN
       integer.  The  rationale for this was to keep commonly used LUNs small Linux LUN integers.
       The most common LUN (by far) in SCSI LUN (hex) notation is 00 00 00 00 00  00  00  00  and
       this  becomes the Linux LUN integer 0. The next most common LUN is 00 01 00 00 00 00 00 00
       and this becomes the Linux LUN integer 1.

       In 2013 it is proposed to increase Linux LUNs to a 64 bit integer by extending the mapping
       outlined  above.  In this case all information that is possible to represent in a SCSI LUN
       is mapped a Linux LUN (64 bit) integer. And the mapping can  be  reversed  without  losing
       information.

       This  version  of  the utility supports both 32 and 64 bit Linux LUN integers.  By default
       the LUN shown at the end of the tuple commencing each line is a Linux  LUN  as  a  decimal
       integer.  When  the --lunhex option is given then the LUN is in SCSI LUN format with the 8
       bytes run together, with the output in hexadecimal  and  prefixed  by  '0x'.  The  LUN  is
       decoded according to SAM-5's description and trailing zeros (i.e. digits to the right) are
       not shown. So LUN 0 (i.e. 00 00 00 00 00 00 00 00) is shown as 0x0000 and LUN 65 (i.e.  00
       41  00 00 00 00 00 00) is shown as 0x0041.  If the --lunhex option is given twice then the
       full 64 bits (i.e. 16 hexadecimal digits) are shown.

       If the --lunhex option is not given on the command  line  then  the  environment  variable
       LSSCSI_LUNHEX_OPT  is  checked.  If LSSCSI_LUNHEX_OPT is present then its associated value
       becomes  the  number  of  times  the  --lunhex  is  set  internally.  So,   for   example,
       'LSSCSI_LUNHEX_OPT=2  lsscsi' and 'lsscsi -xx' are equivalent.

EXAMPLES

       Information   about   this   utility   including   examples   can   also   be   found  at:
       http://sg.danny.cz/scsi/lsscsi.html .

NOTES

       Information for this command is derived from the sysfs file system, which is assumed to be
       mounted  at  /sys unless specified otherwise by the user.  SCSI (pseudo) devices that have
       been detected by the SCSI mid level will be  listed  even  if  the  required  upper  level
       drivers (i.e. sd, sr, st, osst or ch) have not been loaded. If the appropriate upper level
       driver has not been loaded then the device file  name  will  appear  as  '-'  rather  than
       something  like  '/dev/st0'. Note that some devices (e.g. scanners and medium changers) do
       not have a primary upper level driver and can only be accessed via  a  SCSI  generic  (sg)
       device name.

       Generic  SCSI  devices  can also be accessed via the bsg driver in Linux.  By default, the
       bsg driver's device node names are of the form '/dev/bsg/H:C:T:L'. So,  for  example,  the
       SCSI  device  shown  by  this utility on a line starting with the tuple '6:0:1:2' could be
       accessed via the bsg driver with the '/dev/bsg/6:0:1:2' device node name.

       lsscsi version 0.21 or later is required to correctly display SCSI devices in Linux kernel
       2.6.26  (and  possibly  later)  when  the  CONFIG_SYSFS_DEPRECATED_V2 kernel option is not
       defined.

AUTHOR

       Written by Doug Gilbert

REPORTING BUGS

       Report bugs to <dgilbert at interlog dot com>.

COPYRIGHT

       Copyright © 2003-2018 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.

SEE ALSO

       lspci lsusb lsblk