blob: cd1f7414ddcdc7219f045d415acb3acef627dd00 [file] [log] [blame]
README for sg3_utils
====================
Introduction
------------
In this directory are some utilities and test programs for the Linux sg
(version 3) device driver. This driver is found in the lk 2.4 series kernels.
If you have problems or questions about them please contact me.
The home site for the Linux sg device drivers is: http://www.torque.net/sg .
Documentation for the driver can be found at:
http://www.torque.net/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://www.torque.net/sg/p/scsi_generic_v3.txt .
All programs are "GPL"-ed so you can incorporate all or part of them
in your applications as you please. The "sg_err.[hc]" files contain
ASCII text corresponding to most of the error and warning conditions
defined by the SCSI 2 standard. They are used by most other programs.
Additional information (including a version number) can be found
towards the top of each ".c" file corresponding to each utility and
test program.
Scope
-----
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
v3 lk >= 2.4 additional sg_io_hdr interface structure.
This package is targeted as "v3" only. Another package called "sg_utils"
is targeted at "v2" and to a lesser extent "v1". The "sg_utils"
package has essentially the same utilities.
Some sg ioctls (noteably SG_IO) are defined for all block devices
from lk 2.5.48 . This version of sg3_utils (1.02 and later) allows
some utilities that use SG_IO to just work for block devices
(e.g. sg_inq). It guards some others that formerly assumed that any
device that answers one of sg's ioctls was automatically an sg device
(e.g. sginfo).
Utilities
---------
Here is a (somewhat arbitrary) categorization of the utilities included
in this package:
1) dd variants: sg_dd, sgp_dd, sgm_dd and sgq_dd
2) scanning and mapping: sg_scan, sg_map and scsi_devfs_scan
3) SCSI support: sg_inq, scsi_inquiry, sginfo, sg_readcap, sg_start,
sg_modes, sg_logs, sg_senddiag and sg_reset
4) timing and testing: sg_rbuf, sg_test_rwbuf, sg_read, sg_turs,
and sg_debug
5) example programs: sg_simple1, sg_simple2, sg_simple3, sg_simple4
and sg_simple16
6) miscellaneous programs: isosize
There is a brief description of each utility in the following sections.
1) dd variants
--------------
The main utility is a variant of the standard Unix command "dd" that
is called "sg_dd". This program takes a useful subset of the command
line arguments that "dd" takes. Furthermore "sg_dd" will only work if
one or both of the given files (ie "if" or "of") is an "sg" or a raw
device. If "bs" (block size) is not given it is assumed to be 512 bytes.
Available dd options:
bs=<n> typically 512 or 2048
ibs=<n> if given must be the same as "bs"
obs=<n> if given must be the same as "bs"
if=<name> like dd plus sg device or "-" (read from stdin)
of=<name> like dd plus sg device or "-" (write to stdout)
skip=<n> block offset to start reading "if"
seek=<n> block offset to start writing "of"
Extra options:
bpt=<n> blocks per transfer (default 128)
dio=<n> 0 or 1, request direct IO (default 0)
cdbsz=6|10|12|16 allow the command size of SCSI READ and WRITE commands
to be specified (default is 10)
sync=0|1 when 1, do a SYNCHRONIZE CACHE on "of" after the transfer
is complete
fua=0|1|2|3 when 0, do not set 'force unit access' bit; when 1, set it
on "of"; when 2, set it on "if"; when 3, set it on "if"+"of"
time=0|1 times the transfer and calculates a throughput figure when
1, output sent to stderr. Default is 0
coe=0|1 continue on error (only on sg devices) when 1. Default is 0.
All numeric arguments can take multiplier suffixes:
"c", "C" * 1
"b", "B" * 512
"k" * 1024 [2 ^ 10]
"K" * 1000 [10 ^ 3]
"m" * 1048576 [2 ^ 20]
"M" * 1000000 [10 ^ 6]
"g" * 1073741824 [2 ^ 30]
"G" * 1000000000 [10 ^ 9]
The 'skip' and 'seek' options lead to the use of the system command
lseek() to a byte offset when used on raw devices and normal files.
[For sg devices 32 bit block addresses are used thus limiting accesses
on disks with 512 byte blocks to 1 TB.] On 32 bit architectures the
normal lseek() is limited to a signed 32 bit byte offset (i.e. 2 GB).
"sg_dd" bypasses this limit by using Linux's _llseek() [while modern
"dd" commands use read loops to "walk" around the limit].
If 'count' is not given then the SCSI READ CAPACITY command will be
used (on sg devices) if appropriate. [Note that READ CAPACITY often
gives a 2 block overestimate for iso9660 file systems on CD-ROMs.
See the "isosize" command below.] Disk partition information can
be found with a command like "fdisk -ul /dev/sda". The 'dio' argument
requests direct IO (only functions in 2.4 kernels). A warning is issued
if direct IO is requested and /proc/scsi/sg/allow_dio == 0 .
"of=/dev/null" causes writes to be skipped, and "of=." is accepted as
an alias for "of=/dev/null" (convenient shorthand).
The "sg_dd" command has a "man" page [section 8].
"sgp_dd" uses POSIX threads and attempts to run multiple IO operations
in parallel. The user can control the amount of parallelism from
1 worker (i.e. single threaded) through to 16 worker threads. This is
done via the "thr=<n>" option (default 4). Copies from one sg device to
another can be considerably faster due to this parallelism. There is
also some speed benefit when raw devices are used. This command has a
"man" page [section 8].
"sgm_dd" is very similar to sg_dd but it uses mmap-ed IO on one of its
given sg device names. If both "if" and "of" are sg devices then mmap-ed
IO is selected on "if" while normal IO is selected on "of". Direct IO
cannot be selected with this command. The "sgm_dd" command has a "man"
page [section 8].
"sgq_dd" is yet another implementation found in the archive directory.
From the user point of view it is very similar to sgp_dd but uses a
non-blocking state machine rather then POSIX threads for parallelism.
2) Scanning and mapping
-----------------------
"sg_scan" does a SCSI bus scan and prints the results to standard output.
With no arguments only read permissions are needed on the sg devices
but if "-i" is given (to do a SCSI Inquiry command on the device) then
write permissions are also needed. This command has a "man" page
[section 8].
"sg_map" shows the mapping between sg device names and those of the
sd, sr and st device names. Some devices such as scanners have no
corresponding sd, sr nor st device names. This command has a "man"
page [section 8].
"scsi_devfs_scan" is a utility for doing a directory scan on a system
running devfs to identify SCSI (and optionally IDE) devices. Various
information (including an INQUIRY) can be listed for each found device.
This command has a "man" page [section 8].
3) SCSI support
---------------
"sg_inq" is a utility for poking around the INQUIRY command which
contains much interesting information. It is based on SCSI 3's SPC-2
document. Has switches to output "command support" and "vital product
data" pages. It can output in formatted ASCII, hex or binary. This
command is applicable to SCSI 2 (and perhaps SCSI 1) devices as well.
The "sg_inq" command has a "man" page [section 8].
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.
This program has been placed in the "examples" subdirectory.
"sginfo" is a re-porting of the "scsiinfo" program by Eric Youngdale to
use the sg devices (rather than the sd, sr or st block devices). This
program outputs "mode sense" information. Amongst other things it outputs
the full defect list of a disk (which was truncated at 4096 bytes in
the original). The "sginfo" command has a "man" page [section 8].
"sg_readcap" call a READ CAPACITY command on the given device. Now also
supports "partial medium indicator" (PMI) flag that indicates where the
next significant delay will be on the media (after a given address).
The "sg_readcap" command has a "man" page [section 8].
"sg_start" has been provided by Kurt Garloff <garloff@suse.de> for spinning
up (or down) disks. The "sg_start" command has a "man" page [section 8] and
see the README.sg_start file.
"sg_modes" and "sg_logs" print out mode sense pages and log sense pages
respectively. The "sg_modes" and "sg_logs" commands have a "man" pages
[section 8].
"sg_senddiag" permits various device self tests to be run. It can also
list the diagnostic pages support by a device. The "sg_senddiag" command
has a "man" page [section 8].
"sg_reset" exercises the SCSI device/bus/host reset capability. It is
supported by the sg driver in lk 2.2.16 and beyond but associated
SCSI middle level driver changes have not been accepted into the
standard kernel at this time. Many distributions contain the patch to
the mid-level that activates this feature. The "sg_reset" command has
a "man" page [section 8].
4) Timing and testing
---------------------
"sg_rbuf" does repeated SCSI READ BUFFER commands which allows SCSI
bus bandwidth and the SCSI sub-system throughput to be measured.
This can be done in 4 modes: normal transfer to user space, no
transfer to user space, direct IO or mmap-ed IO. The latter one wins
on my hardware. This command has a "man" page [section 8].
"sg_test_rwbuf" is a program by Kurt Garloff <garloff@suse.de> that has
the following description: Program to test the SCSI host adapter by
issueing write and read operations on a device's buffer and calculating
checksums. The "sg_test_rwbuf" command has a "man" page [section 8].
"sg_read" reads multiple blocks of data starting at the same logical
address. It can time the transfers (potentially ignoring the first
issued command) and calculate a MB/sec figure. [In keeping with most
disk manuafacturers, "MB" is 1,000,000 bytes in this context.] Its
command line syntax is modelled on "sg_dd". It allows SCSI device,
SCSI bus bandwidth and the SCSI sub-system throughput to be measured.
This can be done in 3 modes: normal transfer to user space, direct
IO or mmap-ed IO. The "sg_read" command has a "man" page [section 8].
"sg_turs" executes a user specified number of TEST UNIT READY commands on
the given device. This can be used to time SCSI command overhead.
The "sg_turs" command has a "man" page [section 8].
"sg_debug" is effectively defunct now. The user can instead do:
$ cat /proc/scsi/sg/debug . This command has been placed in the
archive directory.
5) Example programs
-------------------
"sg_simple1" and "sg_simple2" are simple example programs demonstrating
calls to the SCSI INQUIRY and TEST UNIT READY commands. They only differ
in their error processing: sg_simple1 uses sg_err.[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_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).
All these example programs (plus scsi_inquiry) have been placed in the
"examples" subdirectory with their own Makefile.
6) Miscellaneous
----------------
"isosize" is a utility that gives the number of bytes in an iso9660
file system. It is a rewrite by Andries Brouwer<Andries.Brouwer@cwi.nl>
of a utility that first appeared in the cdwrite package but is now
difficult to obtain. Note that the value given by isosize is usually
2 or more blocks less than the READ CAPACITY SCSI command yields on
a CD-ROM (due to run out sectors). This command has a "man" page
[section 8]. This utility has been moved to the archive directory
as isosize is now available in the util-linux-2.10s package (and later).
Building
--------
A Makefile is provided that builds the above utilities and test programs
'make' and 'make all' will cause everything (that is stale) to be built.
A complete rebuild can be forced by executing 'make clean' prior to
any of the above make commands. Individual commands can be built be
giving the executable name to make, for example: 'make sg_dd'.
There is also a 'make dep' but that shouldn't be needed very often.
A 'make install' will build if necessary and then install the
executables into /usr/local/bin by default (controlled by variable
INSTDIR). The "man" pages are loaded int /usr/local/man/man8 by default.
Header file problems
--------------------
These utilities include 2 special Linux header files:
#include <scsi/sg.h>
#include <scsi/scsi.h>
These files are typically found in the directory /usr/include/scsi which
is maintained by the GNU glibc team. Unfortunately these GNU supplied
headers may not be (functionally) the same as those found in the kernel
source:
/usr/src/linux/include/scsi/sg.h and
/usr/src/linux/include/scsi/scsi.h
If glibc and the kernel on a machine are of the same vintage then it is
probably sufficient to use the simple includes listed at the start of this
section. Another technique that used to work was to rely on
/usr/include/linux being a symbolic link to /usr/src/linux/include/linux .
That caused the following:
#include <linux/../scsi/sg.h>
#include <linux/../scsi/scsi.h>
to find the kernel supplied header files. However recent versions of
glibc have removed this symlink! Hence this technique is no longer
recommended.
The include file path issues are now all addressed in one file called
"sg_include.h". Please read that file.
scsirastools
------------
This package found at http://scsirastools.sourceforge.net contains utilities
which overlap with the functionality offered in sg3_utils. Utilities of note
in scsirastools are:
- sgdskfl: for loading firmware into SCSI disks
- sgmode: get and set mode pages
- sgdefects: list primary and grown defect lists
- sgdiag to perform format and other test functions
Doug Gilbert
13th May 2003