The sg3_utils package is a collection of programs that use the sg interface. The utilities can be categorized as follows:
variants of the Unix dd command: sg_dd, sgp_dd, sgq_dd and sgm_dd,
scanning and mapping utilities: sg_scan, sg_map and scsi_devfs_scan,
SCSI support: sg_inq, scsi_inquiry, sginfo, sg_readcap, sg_start and sg_reset,
timing and testing: sg_rbuf, sg_test_rwbuf, sg_read, sg_turs and sg_debug,
example programs: sg_simple1..4 and sg_simple16,
The "dd" family of utilities take a sg device file name as input (i.e. if=<sg_dev_filen_name>), as output of both. They can also take raw device file names [21] instead of sg device file names. One important difference from the standard dd command is that the value given to the block size (bs=) argument must be the exact block size of that device and not a integral multiple as allowed by dd. These "dd" variants are suitable for SCSI Direct Access Devices such as disk and CDROMs (but are not suitable for SCSI tape devices).
The sg3_utils package is designed to be used with the sg version 3
driver found in the lk 2.4 series. There is also a sg_utils package
that supports a subset of these commands for the sg version 2 driver
(with some support for the original sg driver) which is found in
the lk 2.2 series (from and after lk 2.2.6). There are links to
the most recent sg3_utils (and sg_utils) packages at the sg website
at
www.torque.net/sg
. There are tarballs and
both source and binary rpm packages. At the time of writing the latest
sg3_utils tarball is at
www.torque.net/sg/p/sg3_utils-0.97.tgz
.
There is a README file in that tarball that should be examined for
up to date information. The more important utility commands (e.g.
sg_dd) have "man" pages.
[22]
Almost all of the sg device driver capabilities discussed in this document appear in code in one or more of these programs. For example the recently added mmap-ed IO can be found in sgm_dd, sg_read and sg_rbuf.
The sg3_utils package also provides some functions that may be useful for
applications that use sg. The functions declared in
sg_err.h
and defined in sg_err.c
categorize SCSI subsystem errors that are returned to an application
in a read() or a ioctl(SG_IO). In the case of sense buffers, they
are decoded into text message (as per SCSI 2 definitions). There is
also a function to do a 64 bit seek (llseek.h
).
[21]
Raw device names are of the form /dev/raw/raw<n>
and can be bound to block devices (e.g. an IDE disk partition
such as /dev/hda3
). The binding is done with the
raw command (see "man raw").
[22]
Although the author wrote most of these programs, initially to test
facilities within the sg driver, some have been contributed by others.
See
www.torque.net/sg/u_index.html
for more information.