lsscsi(8) LSSCSI lsscsi(8)
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 lss-
csi 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 tar-
get 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 gener-
ated "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 start-
ing at 1. The leading explicit "N" for NVMe devices is converted inter-
nally 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 con-
trollers, "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" direc-
tory. 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 enclo-
sure)) 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 out-
put. This option may be needed to stop NVMe device output inter-
fering 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 abbre-
viation (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. Note that only
disk (like) devices are matched by this option; so, for example,
a SCSI enclosure will have an identifier of '-'.
Prior to revision 164 the first match in /dev/disk/by-id/scsi*
was printed. A change was added at that point to check for iden-
tifiers in a specific order as some are considered "stronger"
than others. See the ORDER OF SCSI IDENTIFIERS section below.
-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. It will also output the size of RBC devices,
CD/DVD media and host managed ZBC disks. Host aware ZBC disks
have their "peripheral device type" set to 0 (the same as normal
disks) so their size is output.
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 ver-
sion of Linux predates the /sys/block/<dev_name>/queue direc-
tory) 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 infor-
mation 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 trans-
port. 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 logi-
cal 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 charac-
ter 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 visi-
ble 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 Eth-
ernet) 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 initia-
tor 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 (usu-
ally 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 stor-
age types: NVMe and SOP/PQI (SCSI over PCIe). There are very few exam-
ples 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 accumu-
lated 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 con-
troller can have any storage namespaces associated with it. The sg_ses
utility (in the sg3_utils package) can then be given that NVMe con-
troller's device name (e.g. /dev/nmve1).
When the --transport option is given, after "pcie" the NVMe con-
troller'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 inter-
face 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 Operat-
ing 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 stan-
dards 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 inte-
gers. 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 envi-
ronment 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 lss-
csi' and 'lsscsi -xx' are equivalent.
ORDER OF SCSI IDENTIFIERS
This section only applies to the --scsi_id option and only for disk
like devices (e.g. not tapes nor enclosures). There are potentially
several SCSI identifiers and from revision 164 they are checked in the
following order and only the first found is output.
The SCSI identifier preference order is:
3 : NAA based (Network address Authority)
2 : EUI-64 based
8 : SCSI name string (e.g. iSCSI: iqn.1998-01.com.zzware.iscsi:name1)
S : serial number from SCSI VPD page 0x80
1 : T10 Vendor Identifier
0 : Vendor Specific
Those numbers prefixing each entry are the SCSI 'Designator Types'
found in the definition of the Device Identification VPD page (0x83) in
SPC/-3, SPC/-4 and SPC/-5. The 'S' of course if not a number and it
refers to a different VPD page: the Serial Number VPD page (0x80).
There is a more general --wwn option that should apply to almost all
devices. The term "WWN" (world-wide name) comes from the ATA and NVMe
standards and corresponds to the "Logical Unit (LU) name" in SCSI. The
LU name in SCSI tends to change by transport. For SAS the LU name is
the LU's NAA identifier.
Plus there the --unit and the --long-unit options that may be helpful
in uniquely identifying storage devices.
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 CON-
FIG_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 (C) 2003-2020 Douglas Gilbert
This software is distributed under the GPL version 2. There is NO war-
ranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PUR-
POSE.
SEE ALSO
lspci lsusb lsblk
lsscsi-0.32 November 2020 lsscsi(8)