| .TH SG_DD "8" "April 2005" "sg3_utils-1.14" SG3_UTILS |
| .SH NAME |
| sg_dd \- copies data to and from files and devices. Specialised for |
| devices that understand the SCSI command set. |
| .SH SYNOPSIS |
| .B sg_dd |
| [\fIappend=0|1\fR] [\fIblk_sgio=0|1\fR] [\fIbpt=<n>\fR] [\fIbs=<n>\fR] |
| [\fIcdbsz=6|10|12|16\fR] [\fIcoe=0|1\fR] [\fIcount=<n>\fR] [\fIdio=0|1\fR] |
| [\fIfua=0|1|2|3\fR] [\fIibs=<n>\fR] [\fIif=<ifile>\fR] [\fIobs=<n>\fR] |
| [\fIodir=0|1\fR] [\fIof=<ofile>\fR] [\fIseek=<n>\fR] [\fIskip=<n>\fR] |
| [\fIsync=0|1\fR] [\fItime=0|1\fR] [\fIverbose=<n>\fR] [\fI--version\fR] |
| .SH DESCRIPTION |
| .\" Add any additional description here |
| .PP |
| Copy data to and from any files. Specialised for "files" that are |
| Linux SCSI generic (sg) devices, raw devices or other devices |
| that support the SG_IO ioctl (which are only found in the lk 2.6 |
| series). Similar syntax and semantics to |
| .B dd(1) |
| but does not perform any conversions. |
| .TP |
| append=0 | 1 |
| when set to 1 the output will be appended to the normal file given |
| to the "of=<name>" argument. Appending only takes place to normal files: |
| not to pipes nor raw files nor sg devices nor block devices. Error |
| message produced if append=1 and seek=<n> where <n> > 0. Default is 0 |
| which starts output at the beginning of a normal file (or at some other |
| offset if the "seek=" argument is given). |
| .TP |
| blk_sgio=0 | 1 |
| when set to 0, block devices (e.g. /dev/sda) are treated like normal |
| files (i.e. |
| .B read(2) |
| and |
| .B write(2) |
| are used for IO). When set to 1, block devices are assumed to accept the |
| SG_IO ioctl and SCSI commands are issued for IO. This is only supported |
| for 2.6 series kernels. Note that ATAPI devices (e.g. cd/dvd players) use |
| the SCSI command set but ATA disks do not (unless there is a protocol |
| conversion as often occurs in the USB mass storage class). If the input |
| or output device is a block device partition (e.g. /dev/sda3) then setting |
| this option causes the partition information to be ignored (since access |
| is directly to the underlying device). Default is 0. |
| .TP |
| bpt=BLOCKS |
| each IO transaction will be made using this number of blocks (or less if |
| near the end of count). Default is 128. So for bs=512 the reads and writes |
| will each convey 64 KiB of data by default (less if near the end of the |
| transfer or memory restrictions). When cd/dvd drives are accessed, the |
| block size is typically 2048 bytes and the default bpt value may be too |
| high, especially when blk_sgio is set. The solution is to reduce the bpt |
| value (64 or 32 may be more appropriate). |
| .TP |
| bs=BYTES |
| this |
| .B must |
| be the block size of the physical device (if either the input or output |
| files are accessed via SCSI commands). Note that this differs from |
| .B dd(1) |
| which permits "bs" to be an integral multiple. Default is 512 which |
| is usually correct for disks but incorrect for cdroms (which normally |
| have 2048 byte blocks). For this utility the maximum size of each individual |
| IO operation is 'bs * bpt' bytes. |
| .TP |
| cdbsz=6 | 10 | 12 | 16 |
| size of SCSI READ and/or WRITE commands issued on sg device |
| names (or block devices when "blk_sgio=1" is given). |
| Default is 10 byte SCSI command blocks (unless calculations indicate |
| that a 4 byte block number may be exceeded, in which case it defaults |
| to 16 byte SCSI commands). |
| .TP |
| coe=0 | 1 |
| set to 1 for continue on error: if reading assume zeros read, if writing |
| then ignore and continue. Only applies to errors on sg devices (e.g. |
| errors on normal files will stop sg_dd). Error messages are still sent to |
| stderr. Similar to "conv=noerror" in the |
| .B dd(1) |
| utility. Default is 0 which implies stop on error. |
| .TP |
| count=BLOCKS |
| copy this number of blocks from 'if' to 'of'. Default is the |
| minimum (of 'if' and 'of') number of blocks that sg devices return from |
| READ CAPACITY SCSI commands or that block devices (or their partitions) |
| report. Normal files are not probed for their size. If 'skip' |
| or 'seek' are given and the count is derived (i.e. not explicitly given) |
| then the derived count is scaled back so that the copy will not overrun the |
| device. If the file name is a block device partition and count is not given |
| then the size of the partition rather than the size of the whole device is |
| used. If count is not given and cannot be derived then an error message |
| is issued and no copy takes place. |
| .TP |
| dio=0 | 1 |
| default is 0 which selects indirect IO. Value of 1 attempts direct |
| IO which, if not available, falls back to indirect IO and notes this |
| at completion. If direct IO is selected and /proc/scsi/sg/allow_dio |
| has the value of 0 then a warning is issued (and indirect IO is performed) |
| .TP |
| fua=0 | 1 | 2 | 3 |
| force unit access bit. When 3, fua is set on both "if" and "of", when 2, fua |
| is set on "if", when 1, fua is set on "of", when 0 (default), fua is cleared |
| on both. 6 byte SCSI READ and WRITE commands (cdbsz=6) do not support the |
| fua bit. Only active for sg device file names |
| .TP |
| ibs=BYTES |
| if given must be the same as bs |
| .TP |
| if=FILE |
| read from FILE instead of stdin. A file name of - is taken to be stdin. |
| Starts reading at the beginning of FILE unless "skip" is given. |
| .TP |
| obs=BYTES |
| if given must be the same as bs |
| .TP |
| odir=0 | 1 |
| when set to one opens block devices (e.g. /dev/sda) with the O_DIRECT |
| flag. User memory buffers are aligned to the page size when set. The |
| default is 0 (i.e. the O_DIRECT flag is not used). Has no effect on sg, |
| normal or raw files. If blk_sgio is also set then both are honoured: |
| block devices are opened with the O_DIRECT flag and SCSI commands are |
| issued via the SG_IO ioctl. |
| .TP |
| of=FILE |
| write to FILE instead of stdout. A file name of - is taken to be stdout. |
| If FILE is /dev/null then no actual writes are performed. If FILE is . |
| (period) then it is treated the same way as /dev/null (this is a |
| shorthand notation). If FILE exists then it is _not_ truncated; it is |
| overwritten from the start of FILE unless "append=1" or "seek" is given. |
| .TP |
| seek=BLOCKS |
| start writing BLOCKS bs-sized blocks from the start of the output file. |
| Default is block 0 (i.e. start of file). |
| .TP |
| skip=BLOCKS |
| start reading BLOCKS bs-sized blocks from the start of input file. |
| Default is block 0 (i.e. start of file). |
| .TP |
| sync=0 | 1 |
| when 1, does SYNCHRONIZE CACHE command on "of" at the end of the transfer. |
| Only active when "of" is a sg device file name or a block device |
| and "blk_sgio=1" is given. |
| .TP |
| time=0 | 1 |
| when 1, times transfer and does throughput calculation, outputting the |
| results (to stderr) at completion. When 0 (default) doesn't perform timing |
| .TP |
| verbose=<n> |
| as <n> increases so does the amount of debug output sent to stderr. |
| Default value is zero which yields the minimum amount of debug output. |
| A value of 1 reports extra information that is not repetitive. A value |
| 2 reports cdbs and responses for SCSI commands that are not repetitive |
| (i.e. other that READ and WRITE). Error processing is not considered |
| repetitive. Values of 3 and 4 yield ouput for all SCSI commands (and |
| Unix read() and write() calls). |
| .TP |
| --version |
| outputs version number information and exits |
| .PP |
| The exit status of the sg_dd utilty is 0 when successful, 1 for |
| total failure (i.e. failed before copying data) and 2 when some |
| data has been copied (prior to some problem). |
| .PP |
| BYTES and BLOCKS may be followed by one of these multiplicative suffixes: |
| c C *1; w W *2; b B *512; k K KiB *1,024; KB *1,000; m M MiB *1,048,576; |
| MB *1,000,000 . This pattern continues for "G", "T" and "P". The latter two |
| suffixes can only be used for count, skip and seek values). Also a suffix of |
| the form "x<n>" multiplies the leading number by <n>. These multiplicative |
| suffixes are compatible with GNU's dd command (since 2002) which claims |
| compliance with SI and with IEC 60027-2. |
| .PP |
| Alternatively numerical values can be given in hexadecimal preceded by |
| either "0x" or "0X". When hex numbers are given, multipliers cannot be |
| used. |
| .PP |
| The count, skip and seek parameters can take 64 bit values (i.e. very |
| big numbers). Other values are limited to what can fit in a signed |
| 32 bit number. |
| .PP |
| Data usually gets to the user space in a 2 stage process: first the |
| SCSI adapter DMAs into kernel buffers and then the sg driver copies |
| this data into user memory (write operations reverse this sequence). |
| This is called "indirect IO" and there is a "dio" option to select |
| "direct IO" which will DMA directly into user memory. Due to some |
| issues "direct IO" is disabled in the sg driver and needs a |
| configuration change to activate it. This is typically done with |
| "echo 1 > /proc/scsi/sg/allow_dio". |
| .PP |
| All informative, warning and error output is sent to stderr so that |
| dd's output file can be stdout and remain unpolluted. If no options |
| are given, then the usage message is output and nothing else happens. |
| .PP |
| A raw device must be bound to a block device prior to using sg_dd. |
| See |
| .B raw(8) |
| for more information about binding raw devices. To be safe, the sg device |
| mapping to SCSI block devices should be checked with "cat /proc/scsi/scsi", |
| or sg_map before use. |
| .PP |
| Raw disk partition information can often be found with |
| .B fdisk(8) |
| [the "-ul" argument is useful in this respect]. |
| .SH EXAMPLES |
| .PP |
| Looks quite similar in usage to dd: |
| .PP |
| sg_dd if=/dev/sg0 of=t bs=512 count=1MB |
| .PP |
| This will copy 1 million 512 byte blocks from the device associated with |
| /dev/sg0 (which should have 512 byte blocks) to a file called t. |
| Assuming /dev/sda and /dev/sg0 are the same device then the above is |
| equivalent to: |
| .PP |
| dd if=/dev/sda of=t bs=512 count=1000000 |
| .PP |
| although dd's speed may improve if bs was larger and count was suitably |
| reduced. Using a raw device to do something similar on a IDE disk: |
| .PP |
| raw /dev/raw/raw1 /dev/hda |
| .br |
| sg_dd if=/dev/raw/raw1 of=t bs=512 count=1MB |
| .PP |
| To copy a SCSI disk partition to an IDE disk partition: |
| .PP |
| raw /dev/raw/raw2 /dev/hda3 |
| .br |
| sg_dd if=/dev/sg0 skip=10123456 of=/dev/raw/raw2 bs=512 |
| .PP |
| This assumes a valid partition is found on the SCSI disk at the given |
| skip block address (past the 5 GB point of that disk) and that |
| the partition goes to the end of the SCSI disk. An explicit count |
| is probably a safer option. The partition is copied to /dev/hda3 which |
| is an offset into the IDE disk /dev/hda . The exact number of blocks |
| read from /dev/sg0 are written to /dev/hda (i.e. no padding). |
| .PP |
| To time a streaming read of the first 1 GB (2 ** 30 bytes) on a disk |
| this utility could be used: |
| .PP |
| sg_dd if=/dev/sg0 of=/dev/null bs=512 count=2m time=1 |
| .PP |
| On completion this will output a line like: |
| "time to transfer data was 18.779506 secs, 57.18 MB/sec". The "MB/sec" |
| in this case is 1,000,000 bytes per second. |
| .SH NOTES |
| For sg devices (and block devices when blk_sgio=1 is given) this utility |
| issues READ and WRITE (SBC) SCSI commands which |
| are appropriate for disks and reading from CD/DVD drives. Those commands |
| are not formatted correctly for tape devices so sg_dd should not be used on |
| tape devices. If the largest block address of the requested transfer |
| exceeds a 32 bit block number (i.e 0xffff) then a warning is issued and |
| the sg device is accessed via READ_16 and WRITE_16 SCSI commands. |
| .PP |
| The attributes of a block device (partition) are ignored when 'blk_sgio=1' |
| is used. Hence the whole device is read (rather than just the second |
| partition) by this invocation: |
| .PP |
| sg_dd if=/dev/sdb2 blk_sgio=1 of=t bs=512 |
| .SH SIGNALS |
| The signal handling has been borrowed from dd: SIGINT, SIGQUIT and |
| SIGPIPE output the number of remaining blocks to be transferred and |
| the records in + out counts; then they have their default action. |
| SIGUSR1 causes the same information to be output yet the copy continues. |
| All output caused by signals is sent to stderr. |
| .SH AUTHORS |
| Written by Doug Gilbert and Peter Allworth. |
| .SH "REPORTING BUGS" |
| Report bugs to <dgilbert at interlog dot com>. |
| .SH COPYRIGHT |
| Copyright \(co 2000-2005 Douglas Gilbert |
| .br |
| This software is distributed under the GPL version 2. There is NO |
| warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| .SH "SEE ALSO" |
| There is a web page discussing sg_dd at http://www.torque.net/sg/sg_dd.html |
| .PP |
| A POSIX threads version of this utility called |
| .B sgp_dd |
| is in the sg3_utils package. Another version from that package is called |
| .B sgm_dd |
| and it uses memory mapped IO to speed transfers from sg devices. |
| The lmbench package contains |
| .B lmdd |
| which is also interesting. For moving data to and from tapes see |
| .B dt |
| which is found at http://www.bit-net.com/~rmiller/dt.html. See also |
| .B raw(8), dd(1) |