Serial Attached SCSI (SAS) Linux utilities
Project description
sasutils is a set of command-line tools and a Python library to ease the administration of Serial Attached SCSI (SAS) storage networks.
sasutils command-line tools
sas_counters
sas_devices
sas_discover
ses_report
Also, two “zeroconf” udev scripts for use in udev rules that create friendly device aliases using SES-2 subenclosure nicknames.
sas_mpath_snic_alias
sas_sd_snic_alias
sas_counters
sas_counters reports SAS/SES/SD I/O and phy error counters and provides SAS topology information in an output suitable for Carbon/Graphite. This command also supports SES-2 nicknames as seen in the example below (io1-sassw1 is the nickname of a SAS switch and io1-jbod1-0 is the nickname of a JBOD SIM).
$ sas_counters ... oak-io1-s1.SAS9300-8e.0x500605b00ab01234.Switch184.io1-sassw1.JB4602_SIM_0.io1-jbod1-0.bays.41.ST8000NM0075.0x5000c50084c79876.ioerr_cnt 2 1487457378 oak-io1-s1.SAS9300-8e.0x500605b00ab01234.Switch184.io1-sassw1.JB4602_SIM_0.io1-jbod1-0.bays.41.ST8000NM0075.0x5000c50084c79876.iodone_cnt 7154904 1487457378 oak-io1-s1.SAS9300-8e.0x500605b00ab01234.Switch184.io1-sassw1.JB4602_SIM_0.io1-jbod1-0.bays.41.ST8000NM0075.0x5000c50084c79876.iorequest_cnt 7154906 1487457378 ... oak-io1-s1.SAS9300-8e.0x500605b00ab05678.Switch184.io1-sassw2.phys.15.invalid_dword_count 5 1487457378 oak-io1-s1.SAS9300-8e.0x500605b00ab05678.Switch184.io1-sassw2.phys.15.loss_of_dword_sync_count 1 1487457378 oak-io1-s1.SAS9300-8e.0x500605b00ab05678.Switch184.io1-sassw2.phys.15.phy_reset_problem_count 0 1487457378 oak-io1-s1.SAS9300-8e.0x500605b00ab05678.Switch184.io1-sassw2.phys.15.running_disparity_error_count 1 1487457378 ...
sas_discover
Display SAS topology. By default, sas_discover tries to fold common devices (like disks). Use -v, -vv or -vvv and --addr to display more details. Below is an example with a large topology with multiple SAS HBAs, SAS switches and SAS JBODs.
$ sas_discover -v oak-io8-s2 |--host1 HBA 9500-16e | `--8x--expander-1:0 ASTEK | |--1x--end_device-1:0:0 | | `--enclosure io8-sassw2 ASTEK | |--4x--expander-1:1 HGST | | |--1x--end_device-1:1:0 | | | `--enclosure io8-jbod1 HGST | | |--10x--expander-1:9 HGST | | | `-- 50 x end_device -- disk | | `--10x--expander-1:10 HGST | | `-- 51 x end_device -- disk | |--4x--expander-1:2 HGST | | |--1x--end_device-1:2:0 | | | `--enclosure io8-jbod2 HGST | | |--10x--expander-1:11 HGST | | | `-- 51 x end_device -- disk | | `--10x--expander-1:12 HGST | | `-- 51 x end_device -- disk | |--4x--expander-1:3 HGST | | |--1x--end_device-1:3:0 | | | `--enclosure io8-jbod3 HGST | | |--10x--expander-1:13 HGST | | | `-- 51 x end_device -- disk | | `--10x--expander-1:14 HGST | | `-- 51 x end_device -- disk | |--4x--expander-1:4 HGST | | |--1x--end_device-1:4:0 | | | `--enclosure io8-jbod4 HGST | | |--10x--expander-1:15 HGST | | | `-- 51 x end_device -- disk | | `--10x--expander-1:16 HGST | | `-- 51 x end_device -- disk | |--4x--expander-1:5 HGST | | |--1x--end_device-1:5:0 | | | `--enclosure io8-jbod5 HGST | | |--10x--expander-1:17 HGST | | | `-- 51 x end_device -- disk | | `--10x--expander-1:18 HGST | | `-- 51 x end_device -- disk | |--4x--expander-1:6 HGST | | |--1x--end_device-1:6:0 | | | `--enclosure io8-jbod6 HGST | | |--10x--expander-1:19 HGST | | | `-- 51 x end_device -- disk | | `--10x--expander-1:20 HGST | | `-- 51 x end_device -- disk | |--4x--expander-1:7 HGST | | |--1x--end_device-1:7:0 | | | `--enclosure io8-jbod7 HGST | | |--10x--expander-1:21 HGST | | | `-- 51 x end_device -- disk | | `--10x--expander-1:22 HGST | | `-- 51 x end_device -- disk | `--4x--expander-1:8 HGST | |--1x--end_device-1:8:0 | | `--enclosure io8-jbod8 HGST | |--10x--expander-1:23 HGST | | `-- 51 x end_device -- disk | `--10x--expander-1:24 HGST | `-- 51 x end_device -- disk `--host10 HBA 9500-16e `--8x--expander-10:0 ASTEK |--1x--end_device-10:0:0 | `--enclosure io8-sassw1 ASTEK |--4x--expander-10:1 HGST | |--1x--end_device-10:1:0 | | `--enclosure io8-jbod1 HGST | |--10x--expander-10:9 HGST | | `-- 50 x end_device -- disk | `--10x--expander-10:10 HGST | `-- 51 x end_device -- disk |--4x--expander-10:2 HGST | |--1x--end_device-10:2:0 | | `--enclosure io8-jbod2 HGST | |--10x--expander-10:11 HGST | | `-- 51 x end_device -- disk | `--10x--expander-10:12 HGST | `-- 51 x end_device -- disk |--4x--expander-10:3 HGST | |--1x--end_device-10:3:0 | | `--enclosure io8-jbod3 HGST | |--10x--expander-10:13 HGST | | `-- 51 x end_device -- disk | `--10x--expander-10:14 HGST | `-- 51 x end_device -- disk |--4x--expander-10:4 HGST | |--1x--end_device-10:4:0 | | `--enclosure io8-jbod4 HGST | |--10x--expander-10:15 HGST | | `-- 51 x end_device -- disk | `--10x--expander-10:16 HGST | `-- 51 x end_device -- disk |--4x--expander-10:5 HGST | |--1x--end_device-10:5:0 | | `--enclosure io8-jbod5 HGST | |--10x--expander-10:17 HGST | | `-- 51 x end_device -- disk | `--10x--expander-10:18 HGST | `-- 51 x end_device -- disk |--4x--expander-10:6 HGST | |--1x--end_device-10:6:0 | | `--enclosure io8-jbod6 HGST | |--10x--expander-10:19 HGST | | `-- 51 x end_device -- disk | `--10x--expander-10:20 HGST | `-- 51 x end_device -- disk |--4x--expander-10:7 HGST | |--1x--end_device-10:7:0 | | `--enclosure io8-jbod7 HGST | |--10x--expander-10:21 HGST | | `-- 51 x end_device -- disk | `--10x--expander-10:22 HGST | `-- 51 x end_device -- disk `--4x--expander-10:8 HGST |--1x--end_device-10:8:0 | `--enclosure io8-jbod8 HGST |--10x--expander-10:23 HGST | `-- 51 x end_device -- disk `--10x--expander-10:24 HGST `-- 51 x end_device -- disk
sas_devices
Zeroconf tool that scans SAS devices and resolves associated enclosures. Useful to quickly check cabling and hardware setup.
When used with -v, sas_devices will also display all disk devices with serial numbers.
The following example shows a proper detection of a 60-disk JBOD with 2 SIMs/IOMs (an “enclosure group”).
$ sas_devices Found 2 SAS hosts Found 4 SAS expanders Found 1 enclosure groups Enclosure group: [io1-jbod1-0][io1-jbod1-1] NUM VENDOR MODEL REV SIZE PATHS 60 x SEAGATE ST8000NM0075 E004 8.0TB 2 Total: 60 block devices in enclosure group
The following example shows a proper detection of four Seagate Exos E JBOFs with 15.4TB SSDs. Note that 2 IOMs are detected for each JBOF and they have the same SES-2 nickname (this is normal with this hardware).
$ sas_devices Found 2 SAS hosts Found 8 SAS expanders Found 4 enclosure groups Enclosure group: [io1-jbof4][io1-jbof4] NUM VENDOR MODEL REV SIZE PATHS 24 x SEAGATE XS15360SE70084 0003 15.4TB 2 Total: 24 block devices in enclosure group Enclosure group: [io1-jbof2][io1-jbof2] NUM VENDOR MODEL REV SIZE PATHS 24 x SEAGATE XS15360SE70084 0003 15.4TB 2 Total: 24 block devices in enclosure group Enclosure group: [io1-jbof3][io1-jbof3] NUM VENDOR MODEL REV SIZE PATHS 24 x SEAGATE XS15360SE70084 0003 15.4TB 2 Total: 24 block devices in enclosure group Enclosure group: [io1-jbof1][io1-jbof1] NUM VENDOR MODEL REV SIZE PATHS 24 x SEAGATE XS15360SE70084 0003 15.4TB 2 Total: 24 block devices in enclosure group
ses_report
SES status and environmental metrics.
Used with -c, this command will find all enclosures and then use SES-2 nicknames and use sg_ses to output results suitable for Carbon/Graphite.
$ ses_report -c --prefix=datacenter.stanford datacenter.stanford.io1-sassw1.Cooling.Left_Fan.speed_rpm 19560 1476486766 datacenter.stanford.io1-sassw1.Cooling.Right_Fan.speed_rpm 19080 1476486766 datacenter.stanford.io1-sassw1.Cooling.Center_Fan.speed_rpm 19490 1476486766 ...
Use -s to get the status of all detected SES Element Descriptors.
# ses_report -s --prefix=datacenter.stanford | grep SIM datacenter.stanford.io1-jbod1-0.Enclosure_services_controller_electronics.SIM_00 OK datacenter.stanford.io1-jbod1-0.Enclosure_services_controller_electronics.SIM_01 OK datacenter.stanford.io1-jbod1-0.SAS_expander.SAS_Expander_SIM_0 OK datacenter.stanford.io1-jbod1-0.SAS_expander.SAS_Expander_ISIM_2 OK datacenter.stanford.io1-jbod1-0.SAS_expander.SAS_Expander_ISIM_0 OK datacenter.stanford.io1-jbod1-1.Enclosure_services_controller_electronics.SIM_00 OK datacenter.stanford.io1-jbod1-1.Enclosure_services_controller_electronics.SIM_01 OK datacenter.stanford.io1-jbod1-1.SAS_expander.SAS_Expander_SIM_1 OK datacenter.stanford.io1-jbod1-1.SAS_expander.SAS_Expander_ISIM_3 OK datacenter.stanford.io1-jbod1-1.SAS_expander.SAS_Expander_ISIM_1 OK
sas_sd_snic_alias
Generate udev aliases using the SES-2 subenclosure nickname and bay identifier of each device.
For example, add the following to your udev rules:
KERNEL=="sd*", PROGRAM="/usr/bin/sas_sd_snic_alias %k", SYMLINK+="%c"
This should generate udev aliases made of the device subenclosure nickname followed by the bay identifier. In the following case, io1-jbod1-0 is the subenclosure nickname (here SIM 0 of JBOD #1).
$ ls -l /dev/io1-jbod1-0-bay26 lrwxrwxrwx 1 root root 4 Oct 14 21:00 /dev/io1-jbod1-0-bay26 -> sdab
sas_mpath_snic_alias
This utility is very similar to sas_sd_snic_alias but only accepts device-mapper devices. Add the following line to your udev rules:
KERNEL=="dm-[0-9]*", PROGRAM="/usr/bin/sas_mpath_snic_alias %k", SYMLINK+="mapper/%c"
This will result in useful symlinks.
$ ls -l /dev/mapper/io1-jbod1-bay26 lrwxrwxrwx 1 root root 8 Oct 14 21:00 /dev/mapper/io1-jbod1-bay26 -> ../dm-31
sasutils Python library
Documentation will be available on the wiki.
the following example will list all SAS hosts (controllers) found in sysfs
from sasutils.sas import SASHost from sasutils.sysfs import sysfs # sysfs is a helper to walk through sysfs (/sys) for node in sysfs.node('class').node('sas_host'): # Instantiate SASHost with the sas_host sysfs device class host = SASHost(node.node('device')) # To get its sysfs name, use: print(host.name) # To get attributes from scsi_host, use: print(' %s' % host.scsi_host.attrs.host_sas_address) print(' %s' % host.scsi_host.attrs.version_fw)
See also https://github.com/stanford-rc/sasutils/wiki/Code-snippets
- Author:
Stephane Thiell - Stanford Research Computing Center
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.