| README for sg3_utils | |
| ==================== | |
| Introduction | |
| ============ | |
| This package contains low level utilities for devices that use the SCSI | |
| command set. Originally the SCSI command set was associated exclusively | |
| with the SCSI Parallel Interface (SPI) transport. SPI has now almost | |
| been completely replaced by the Serial Attached SCSI (SAS) transport which | |
| also accepts the SCSI command set. Additionally many other storage related | |
| transports use the SCSI command set (amongst others); examples are ATAPI | |
| devices (CD/DVDs and tapes), USB mass storage devices (including those | |
| using the newer UAS[P]), Fibre Channel disks, IEEE 1394 storage devices (SBP | |
| protocol), iSCSI, FCoE and SOP devices. | |
| This package originally targeted the Linux SCSI subsystem. Since most | |
| operating systems contain a SCSI command pass-through mechanism, many | |
| utilities within this package have been ported. This README mainly | |
| concentrates on Linux: see the README.freebsd file for the FreeBSD port, | |
| README.solaris for the Solaris port, the README.tru64 file for the Tru64 | |
| (OSF) port and README.win32 for the Windows ports (of which there are two | |
| variants). | |
| Most utilities within the sg3_utils package work at the SCSI command level. | |
| For example the sg_inq utility issues a SCSI INQUIRY command and decodes the | |
| response. The COVERAGE file has a table containing a row for each SCSI | |
| command issued by this package; to the right of each row is the utility | |
| (sometimes more than one) that issue that SCSI command. The COVERAGE file | |
| has a second table for ATA commands usage. | |
| Some utilities interface at a slightly higher level, for example: sg_dd, | |
| sgm_dd and sgp_dd. These are closely related to the Unix dd command and | |
| typically issue a sequence of SCSI READ and WRITE commands to copy data. | |
| These utilities are relatively tightly bound to Linux and are not ported to | |
| other Operating Systems. A new utility called ddpt (in a package of the same | |
| name) is more generic while still allowing a copy to be done in terms of | |
| SCSI READ and WRITE commands. ddpt has been ported to other OSes. | |
| Description | |
| =========== | |
| A web site supporting the sg3_utils package can be found at | |
| http://sg.danny.cz/sg/sg3_utils.html . That page has a table of released | |
| versions for download. The most recent release or beta of sg3_utils may | |
| be found on this page: http://sg.danny.cz/sg in the News section. | |
| The predecessor to this package was called sg_utils. It is described in | |
| http://sg.danny.cz/sg/uu_index.html and old versions can be downloaded | |
| from the Downloads section of http://sg.danny.cz/sg . | |
| In the Linux 2.4 kernel series these utilities need to use the SCSI generic | |
| (sg) driver to access SCSI devices. The name of this package (i.e. sg3_utils) | |
| refers to version 3 of the SCSI generic (sg) driver which was introduced at | |
| the beginning of the 2.4 Linux kernel series. Significantly this added a new | |
| SCSI command interface structure (i.e. struct sg_io_hdr) that is more | |
| flexible than the older "sg_header" structure found in the sg driver in the | |
| 2.2 and earlier Linux kernel series. The sg_io_hdr structure is also more | |
| flexible than the awkward (and limiting) interface to the | |
| SCSI_IOCTL_SEND_COMMAND ioctl supported by the Linux SCSI mid level. The | |
| version 3 sg driver also added the SG_IO ioctl that is synchronous (i.e. it | |
| issues the requested SCSI command and waits for the response (or a timeout) | |
| before the ioctl returns to the user space program that invoked it). The | |
| SG_IO ioctl is now supported in other parts of the Linux kernel in the 2.6 | |
| series. | |
| In sg3_utils version 1.27 support has been added for the Linux bsg driver | |
| which use the sg version 4 interface. There seems no point in renaming | |
| this package sg4_utils. The existing utilities just silently support either. | |
| Currently the source build must be able to see the /usr/include/linux/bsg.h | |
| file. Then at run time the /proc/devices pseudo file needs to have an entry | |
| for the bsg driver (appeared around lk 2.6.28). With this in place each | |
| utility at run time checks the device it has been given and if it is a char | |
| device whose major number matches the bsg entry in /proc/devices then the | |
| sg v4 interface is used. Otherwise the sg v3 interface is used. | |
| Utilities that wish to use the asynchronous SCSI command interface (i.e. via | |
| a write() read() sequence) or issue special "commands" (e.g. bus and device | |
| resets) still need to use the Linux sg driver. Note that various | |
| drivers (e.g. cdrom/sr) have different open() flag and permissions policies | |
| that the user may need to take into account. | |
| If users have problems or questions about them please contact the author. | |
| Documentation for the Linux sg device driver can be found at: | |
| http://sg.danny.cz/sg/p/sg_v3_ho.html . This is written in DocBook and the | |
| original xml can be found in the same directory with the ".xml" extension. | |
| Postscript and pdf renderings are also in that directory. Older documentation | |
| for the sg version 3 driver can be found at: | |
| http://sg.danny.cz/sg/p/scsi_generic_v3.txt . | |
| All utilities are either "GPL"-ed or have a FreeBSD license. The author's | |
| intention is that users may incorporate all or part of the code in their work | |
| as they please. Attribution is encouraged. Please check the code as other | |
| contributors (apart from the author) may also have copyright notices. For a | |
| list of contributors see the CREDITS file. | |
| To save the repetition of common code (e.g. SCSI error processing) and | |
| reduce the size of the executable files, a shared library called | |
| libsgutils<num>.so (its Linux name) is created during the build process. | |
| That library is built from the contents of the include and lib | |
| subdirectories. The header files in the include subdirectory can be seen | |
| as the API of libsgutils and are commented with that in mind. The SCSI | |
| pass-through code for the supported operating systems is found in the lib | |
| subdirectory with names like sg_pt_linux.c and sg_pt_win32.c . | |
| Various distributions (of Linux mainly) distribute sg3_utils as 3 | |
| installable packages. One is a package containing the shared library | |
| discussed above (e.g. libsgutils2-2_1.33-0.1_i386.deb). A second package | |
| contains the utilities (e.g. sg3-utils_1.33-0.1_i386.deb) and depends on the | |
| first package). Finally there is an optional package that contains header | |
| files and a static library (e.g. libsgutils2-dev_1.33-0.1_i386.deb). This | |
| final package is only needed to build other packages (e.g. sdparm) that | |
| wish to use the sg3_utils shared library. | |
| All the utilities in the src subdirectory have "man" pages that are | |
| placed in the doc subdirectory. There is also a sg3_utils (8) man page that | |
| summarizes common facilities including exit statuses. Additional | |
| information (including each utility's version number) can be found towards | |
| the top of each ".c" file corresponding to the utility name. | |
| The sg driver in Linux can be seen as having 3 distinct versions: | |
| v1 lk < 2.2.6 sg_header based relatively unchanged since 1992 | |
| v2 lk >= 2.2.6 enhanced sg_header interface structure [1999/4/16] | |
| v3 lk >= 2.4 additional sg_io_hdr interface structure [2001/1/4] | |
| v3 lk >= 2.6 same interface as found in lk 2.4 [2.6.0: 2003/12/18] | |
| and the bsg driver supports the sg v4 interface and was added around | |
| lk 2.6.28 . This package is targeted at "v3" and "v4". Another package called | |
| "sg_utils" is targeted at "v2" and to a lesser extent "v1". The "sg_utils" | |
| package has a subset of the utilities found in this package. | |
| In Linux some sg driver ioctls (notably SG_IO) are defined for many block | |
| devices in lk 2.6 series. In practice this means all SCSI block devices, | |
| ATAPI block devices (mainly CD, DVD and BD optical devices) but _not_ ATA | |
| disks, depending on which kernel configuration options, can be accessed by | |
| the utilities in this package. SATA disks that use the libata kernel library | |
| (or some other SCSI to ATA Translation (SAT) Layer (SATL)) accept SCSI | |
| commands and thus are supported. Support for the SG_IO as been added to the | |
| scsi tape driver (st) in lk 2.6.6 . | |
| In the src directory the bulk of the utilities are written in relatively | |
| clean POSIX compliant C code with Linux specific system calls and structures | |
| removed and placed in Linux specific files in the lib directory. A small | |
| number of utilities in the src directory do contain Linux specific logic | |
| and are not ported to other OSes (e.g. sg_dd). One utility, sg_scan, has | |
| two separate implementations, one for Linux (sg_scan_linux.c) and one for | |
| Windows (sg_scan_win32.c). The src-lib directory split approach allows | |
| FreeBSD, Solaris, Tru64 and Windows specific code to be isolated to a few | |
| files in the lib directory whose interfaces match those of the Linux | |
| specific code. | |
| Darwin is not supported because the Apple folks do not want to give their | |
| users a pass-through SCSI interface. The author has read about creative | |
| hackers using a VM containing a real OS to circumvent the Apple restriction. | |
| C standard is C99 | |
| ================== | |
| The C code in this package is written for portability rather than speed. | |
| It assumes a level of C99 compliance and favours POSIX system and library | |
| calls over OS specific calls. | |
| The C code is written in a C++ friendly way and is checked from time to | |
| time that it compiles clean with C++. To accommodate C++ certain C99 | |
| constructs such as designated initializers cannot be used. | |
| Building | |
| ======== | |
| This package is designed to be built with the usual: | |
| "./configure ; make ; make install" | |
| sequence. In some situations that may need to be prefixed by a call to | |
| the "./autogen.sh" script which invokes autoconf and automake. That in turn | |
| may require packages containing those utilities to be installed. The | |
| libtool utility is also required. Naturally a C compiler is required | |
| and due to the vagaries of libtool a C++ compiler also. | |
| The "./configure" takes many command line options with the defaults | |
| being usually sufficient to start with. One quirk is that the location | |
| of the installation is under the /usr/local directory. So the sg_inq | |
| utility will be installed at /usr/local/bin/sg_inq . This is controlled | |
| by the "--prefix=<directory>" option which defaults to | |
| "--prefix=/usr/local". As an example to install the executables in /usr/bin | |
| and disable the creation of the shared library (libsgutils<num>.so) this | |
| invocation could be used: "./configure --prefix=/usr --disable-shared". | |
| To reduce the size of an executable as well try this: | |
| "./configure --prefix=/usr --disable-shared --disable-scsistrings". | |
| In Linux there are package build files for "rpm" based and for "deb" based | |
| systems. The 'sg3_utils.spec' file in the main directory can be used like | |
| this: 'rpmbuild -ba sg3_utils.spec' in a rpmbuild tree SPECS directory. | |
| To cross build or make a more widely distributable package then the --target | |
| option may be useful: 'rpmbuild --target=i386 -ba sg3_utils.spec' or | |
| 'rpmbuild --target=x86_64 -ba sg3_utils.spec' . The sg3_utils.spec file | |
| in the main directory targets Red Hat systems, an alternative "spec" file | |
| for Suse systems has been placed under the 'suse' directory. | |
| The 'build_debian.sh' script should build several "deb" packages and place | |
| them in the parent directory. In debian based systems doing | |
| a 'apt-get install build-essential' is one way to get most of build | |
| environment needed if it has not already been loaded. There are now some | |
| problems with this script and the superseded Debian 4.0 ("etch"). See | |
| debian/README.debian4 for a workaround. Amongst other things debian | |
| builds are sensitive to the value in the debian/compat file. If it | |
| contains "7" then it works on lenny and gives warning on squeeze (but | |
| fails on the earlier etch). | |
| Warning | |
| ======= | |
| Many devices use SCSI command sets over transport protocols not normally | |
| associated with SCSI (as defined at http://www.t10.org ). Some of these | |
| devices react poorly (e.g. lock up) when sent SCSI commands that they don't | |
| support. Even sending a supported SCSI command with a field set to an | |
| unexpected value can cause problems. [The author is talking about billions | |
| of USB devices with horrible SCSI implementations.] | |
| For example, all "SCSI" devices must support the INQUIRY command which the | |
| SCSI-2 standard says should request a 36 byte response. However later SCSI | |
| standards (e.g. SPC-2) have increased that length but some SCSI devices lock | |
| up when they receive a request for anything other than a 36 byte response. | |
| Any well implemented "SCSI" device should react sensibly when a utility in | |
| sg3_utils sends a SCSI command that it doesn't support. Unfortunately this | |
| cannot be guaranteed. | |
| Prior to lk 2.6.29 USB mass storage limited sense data to 18 bytes which | |
| caused problems for certain types of descriptor based sense data. An | |
| example of this is the SCSI ATA PASS-THROUGH command with the CK_COND bit | |
| set. | |
| Utilities | |
| ========= | |
| Here is list in alphabetical order of utilities found in the 'src' | |
| subdirectory of the sg3_utils package: | |
| sginfo, sg_compare_and_write, sg_copy_results, sgm_dd, sgp_dd, sg_dd, | |
| sg_decode_sense, sg_emc_trespass, sg_format, sg_get_config, | |
| sg_get_lba_status, sg_ident, sg_inq, sg_logs, sg_luns, sg_map, sg_map26, | |
| sg_modes, sg_opcodes, sg_persist, sg_prevent, sg_raw, sg_rbuf, sg_rdac, | |
| sg_read, sg_read_attr, sg_readcap, sg_read_block_limits, sg_read_buffer, | |
| sg_read_long, sg_reassign, sg_referrals, sg_request, sg_reset, sg_rmsn, | |
| sg_rtpg, sg_safte, sg_sanitize, sg_sat_identify, sg_sat_phy_event, | |
| sg_sat_read_gplog, sg_sat_set_features, sg_scan, sg_senddiag, sg_ses, | |
| sg_ses_microcode, sg_start, sg_stpg, sg_sync, sg_test_rwbuff, | |
| sg_timestamp, sg_turs, sg_unmap, sg_verify, sg_vpd, sg_write_buffer, | |
| sg_write_long, sg_write_same, sg_write_verify sg_wr_mode, sg_xcopy, | |
| sg_zone | |
| Each of the above utilities depends on header files found in the 'include' | |
| subdirectory and library code found in the 'lib' subdirectory. Associated | |
| man pages are found in the 'doc' subdirectory. Additional programs found | |
| in the 'archive', 'examples' and 'utils' subdirectories in not build by the | |
| top level build infrastructure. Linux binary distributions of the sg3_utils | |
| package (e.g. "rpm" and debian packages) typically contain the shared | |
| library, the utilities found in the 'src' subdirectory, their associated man | |
| pages and some documentation files (e.g. README, INSTALL, CREDITS, COPYING | |
| and COVERAGE). See the INSTALL file for generic instructions about building | |
| with autotools (e.g. ./configure ). | |
| Man pages can be read (without building and installing the package) by | |
| going to the 'doc' subdirectory and executing something like this: | |
| $ man ./sg_dd.8 | |
| To see which SCSI commands (and ATA commands) are used by these utilities | |
| refer to the COVERAGE file. | |
| Here is a list in alphabetical order of utilities found in the 'examples' | |
| subdirectory: | |
| - bsg_queue_tst, sg_excl, scsi_inquiry, sg_iovec_tst, sg_queue_tst, | |
| sg_sat_chk_power, sg__sat_identify, sg__sat_phy_event, | |
| sg__sat_set_features, sg_sat_smart_rd_data, sg_simple1, sg_simple2, | |
| sg_simple3, sg_simple4, sg_simple5, sg_simple16, sg_tst_excl, | |
| sg_tst_excl2, sg_tst_excl3, sg_tst_context and sg_tst_async | |
| Also in that subdirectory is a script to test sg_persist, an example data | |
| file for sg_persist (called "transport_ids.txt") and an example data file for | |
| sg_reassign (called "reassign_addr.txt"). There are several scripts | |
| for 'sg_senddiag -pf -raw=-' that will put some SAS disk phys into | |
| a "compliant jitter tolerance pattern" (CJTPAT). | |
| The 'utils' subdirectory contains source and a Makefile to build "hxascdmp" | |
| which accepts binary data from stdin (or a file on the command line) and | |
| outputs an ASCII-HEX and ASCII representation of it. It is similar to the | |
| Unix od command. There is also code to sg_chk_asc.c which checks a given | |
| text file (typically a copy of http://www.t10.org/lists/asc-num.txt ) and | |
| checks it against the asc/ascq text strings held in sg_lib_data.c . | |
| The 'doc' subdirectory contains a README file containing the urls of | |
| various related documents. | |
| The 'scripts' subdirectory contains some Bourne (bash) shell scripts that | |
| rely on utilities in the main directory. One script uses the sdparm utility. | |
| These scripts are described in the scripts/README file and have usage | |
| messages. | |
| Notes for utilities without man pages | |
| ===================================== | |
| These utils are found in the 'examples' subdirectory. | |
| The "scsi_inquiry" program shows the use of the SCSI_IOCTL_SEND_COMMAND | |
| ioctl to send a SCSI INQUIRY command. That ioctl() is supported by the | |
| SCSI sub system mid level and so is common to all sd, sr, st and sg devices. | |
| That ioctl is deprecated in the lk 2.6 series. This program has been placed | |
| in the "examples" subdirectory. | |
| "sg_simple1" and "sg_simple2" are example programs demonstrating calls | |
| to the SCSI INQUIRY and TEST UNIT READY commands. They only differ in their | |
| error processing: sg_simple1 uses sg_lib.[hc] for error processing while | |
| sg_simple2 does its own more primitive checks. | |
| "sg_simple3" tests out user space scatter gather added to the version 3 | |
| sg driver. | |
| "sg_simple4" shows the INQUIRY command using mmap-ed IO to obtain its | |
| response buffer. | |
| "sg_simple5" also sends and INQUIRY and TEST UNIT READY commands. It | |
| uses the generic pass through mechanism based on sg_pt.h . It will | |
| currently build in Linux and FreeBSD (with "make -f Makefile.freebsd"). | |
| It has extensive error checking code. | |
| "sg_simple16" attempts to send a 16 byte SCSI command, READ_16, to the | |
| scsi device. This is only supported for lk >= 2.4.15 and for adapter | |
| drivers that indicate that they have 16 byte CDB capability (otherwise | |
| DID_ABORT will appear in the host_status). | |
| "sg_sat_chk_power" attempts to push an ATA CHECK POWER MODE command | |
| through the SAT-defined ATA PASS_THROUGH (16) SCSI command. That | |
| ATA command needs to read the "FIS" registers after the command is | |
| completed which involves using the ATA Status Return (sense data) | |
| descriptor (as defined in SAT). | |
| "sg_sat_smart_rd_data" attempts to push an ATA SMART/READ DATA command | |
| through the SAT-defined ATA PASS_THROUGH (16) SCSI command. If | |
| successful, the 256 word (512 byte) response is output. | |
| "sg_tst_excl" and "sg_tst_excl2" use multiple threads to bombard the | |
| given device with O_EXCL open flags, so only one should succeed at a | |
| time. While holding O_EXCL control a thread attempts a double increment | |
| on an integer in the given LBA. If the integer starts even (after the | |
| first read) then it should remain even if the O_EXCL flag is doing its job. | |
| The "sg_tst_excl" variant uses the Linux SG_IO v3 interface while the | |
| "sg_tst_excl2" uses the more generic sg_pt infrastructure. | |
| "sg_tst_excl3" is a variant of "sg_tst_excl2". "sg_tst_excl3" only does | |
| the double increment from the first thread, each time using O_EXCL on | |
| open. The remaining threads check the value is even, each time doing | |
| an open without the O_EXCL flag. | |
| "bsg_queue_tst" sends an INQUIRY command via the Linux SG_IO v4 interface | |
| which is used by the bsg driver. So it will take device names like | |
| "/dev/bsg/6:0:0:0". It tests if sending repeated INQUIRYs with | |
| the BSG_FLAG_Q_AT_HEAD or BSG_FLAG_Q_AT_TAIL flag makes any difference. | |
| "sg_tst_async" is a test harness for the Linux sg driver. It is multi | |
| threaded, submitting either TEST UNIT READY, READ(16) or WRITE(16) SCSI | |
| commands asynchronously. Each thread opens a file descriptor and submits | |
| those commands up to the queue limit (sg driver has a per file descriptor | |
| queue limit of 16). Multiple threads doing the same thing act as a | |
| multiplier to that queue limit. | |
| Command line processing | |
| ======================= | |
| These utilities can be divided into 3 groups when their handling of command | |
| line arguments is considered: | |
| - ad hoc, typically in a short form only, sometimes longer (e.g. | |
| "sg_logs -pcb /dev/sdc") | |
| - inspired by the dd Unix command (e.g. sg_dd, sgm_dd, sgp_dd, sg_read) | |
| - recent utilities use "getopt_long" (see "man getopt_long") | |
| type command lines. These have short form (starting with "-") | |
| and corresponding longer form (starting with "--") options. | |
| The older utilities that use ad hoc options, in alphabetical order: | |
| - sg_emc_trespass, sginfo(1/2), sg_inq, sg_logs, sg_map, sg_modes, | |
| sg_opcodes, sg_rbuf, sg_rdac, sg_readcap, sg_reset, sg_scan (Linux), | |
| sg_senddiag, sg_start, sg_test_rwbuf, sg_turs | |
| In sg3_utils version 1.23 the following utilities from this group were | |
| converted to have a dual getopt_long/ad_hoc interface, defaulting to | |
| the getop_long interface: | |
| - sg_inq, sg_logs, sg_modes, sg_opcodes, sg_rbuf, sg_readcap, | |
| sg_senddiag, sg_start, sg_turs | |
| These can be switched back to the older (backward compatible) ad hoc | |
| interface by defining the SG3_UTILS_OLD_OPTS environment variable | |
| or using '-O' as the first command line option. | |
| The more recent utilities that use "getopt_long" only are: | |
| - sg_compare_and_write, sg_decode_sense, sg_format, sg_get_config, | |
| sg_get_lba_status, sg_ident, sg_luns, sg_map26, sg_persist, sg_prevent, | |
| sg_raw, sg_read_attr, sg_read_block_limits, sg_read_buffer, sg_read_long, | |
| sg_reassign, sg_referrals, sg_requests, sg_rmsn, sg_rtpg, sg_safte, | |
| sg_sanitize, sg_sat_identify, sg_sat_phy_event, sg_sat_read_gplog, | |
| sg_sat_set_features, sg_scan(w), sg_ses, sg_ses_microcode, sg_stpg, | |
| sg_sync, sg_test_rwbuf, sg_timestamp, sg_unmap, sg_verify, sg_vpd, | |
| sg_write_buffer, sg_write_long, sg_write_same, sg_write_verify, | |
| sg_wr_mode, sg_zone | |
| Dangerous code | |
| ============== | |
| This C code snippet: | |
| unsigned char uc = 0x80; | |
| uint64_t ull; | |
| ull = (uc << 24); | |
| Somewhat surprisingly sets ull to: | |
| ull: 0xffffffff80000000 | |
| This result is due to the 'unary conversion' of uc to a (32 bit signed) | |
| 'int' before the shift. The resultant type from the shift is also an int | |
| and it has its top bit set so there is sign extension when it is assigned | |
| into a 64 bit unsigned integer. Making sure there is no conversion to 'int' | |
| solves the problem. In this case if uc is declared as unsigned int the | |
| result will be as expected (i.e. 0x80000000). | |
| Other SCSI and storage tools | |
| ============================ | |
| See http://sg.danny.cz/sg/tools.html | |
| Douglas Gilbert | |
| 17th February 2016 |