| .TH SGP_DD "8" "August 2022" "sg3_utils\-1.47" SG3_UTILS |
| .SH NAME |
| sgp_dd \- copy data to and from files and devices, especially SCSI |
| devices |
| .SH SYNOPSIS |
| .B sgp_dd |
| [\fIbs=BS\fR] [\fIcount=COUNT\fR] [\fIibs=BS\fR] [\fIif=IFILE\fR] |
| [\fIiflag=FLAGS\fR] [\fIobs=BS\fR] [\fIof=OFILE\fR] [\fIoflag=FLAGS\fR] |
| [\fIseek=SEEK\fR] [\fIskip=SKIP\fR] [\fI\-\-help\fR] [\fI\-\-version\fR] |
| .PP |
| [\fIbpt=BPT\fR] [\fIcoe=\fR0|1] [\fIcdbsz=\fR6|10|12|16] [\fIdeb=VERB\fR] |
| [\fIdio=\fR0|1] [\fIsync=\fR0|1] [\fIthr=THR\fR] [\fItime=\fR0|1] |
| [\fIverbose=VERB\fR] [\fI\-\-chkaddr\fR] [\fI\-\-dry\-run\fR] |
| [\fI\-\-verbose\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) and raw devices. Similar syntax and semantics to |
| .B dd(1) |
| but does not perform any conversions. Uses POSIX threads (often |
| called "pthreads") to increase the amount of parallelism. This improves |
| speed in some cases. |
| .PP |
| The first group in the synopsis above are "standard" Unix |
| .B dd(1) |
| operands. The second group are extra options added by this utility. |
| Both groups are defined below. |
| .SH OPTIONS |
| .TP |
| \fBbpt\fR=\fIBPT\fR |
| each IO transaction will be made using \fIBPT\fR blocks (or less if |
| near the end of the copy). Default is 128 for block sizes less that 2048 |
| bytes, otherwise the default is 32. 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 bpt defaults to 32 which again |
| implies 64 KiB transfers. |
| .TP |
| \fBbs\fR=\fIBS\fR |
| where \fIBS\fR |
| .B must |
| be the block size of the physical device. Note that this differs from |
| .B dd(1) |
| which permits 'bs' to be an integral multiple of the actual device block |
| size. Default is 512 which is usually correct for disks but incorrect for |
| cdroms (which normally have 2048 byte blocks). |
| .TP |
| \fBcdbsz\fR=6 | 10 | 12 | 16 |
| size of SCSI READ and/or WRITE commands issued on sg device names. |
| 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 |
| \fBcoe\fR=0 | 1 |
| set to 1 for continue on error. Only applies to errors on sg devices. |
| Thus errors on other files will stop sgp_dd. Default is 0 which |
| implies stop on any error. See the 'coe' flag for more information. |
| .TP |
| \fBcount\fR=\fICOUNT\fR |
| copy \fICOUNT\fR blocks from \fIIFILE\fR to \fIOFILE\fR. Default is the |
| minimum (of \fIIFILE\fR and \fIOFILE\fR) number of blocks that sg devices |
| report from SCSI READ CAPACITY commands or that block devices (or their |
| partitions) report. Normal files are not probed for their size. If |
| \fIskip=SKIP\fR or \fIseek=SEEK\fR are given and the count is deduced (i.e. |
| not explicitly given) then that count is scaled back so that the copy will |
| not overrun the device. If the file name is a block device partition and |
| \fICOUNT\fR is not given then the size of the partition rather than the |
| size of the whole device is used. If \fICOUNT\fR is not given and cannot be |
| deduced then an error message is issued and no copy takes place. |
| .TP |
| \fBdeb\fR=\fIVERB\fR |
| outputs debug information. If \fIVERB\fR is 0 (default) then there is |
| minimal debug information and as \fIVERB\fR increases so does the amount |
| of debug (max debug output when \fIVERB\fR is 9). |
| .TP |
| \fBdio\fR=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 /sys/module/sg/parameters/allow_dio |
| has the value of 0 then a warning is issued (and indirect IO is performed) |
| For finer grain control use 'iflag=dio' or 'oflag=dio'. |
| .TP |
| \fBibs\fR=\fIBS\fR |
| if given must be the same as \fIBS\fR given to 'bs=' option. |
| .TP |
| \fBif\fR=\fIIFILE\fR |
| read from \fIIFILE\fR instead of stdin. If \fIIFILE\fR is '\-' then stdin |
| is read. Starts reading at the beginning of \fIIFILE\fR unless \fISKIP\fR |
| is given. |
| .TP |
| \fBiflag\fR=\fIFLAGS\fR |
| where \fIFLAGS\fR is a comma separated list of one or more flags outlined |
| below. These flags are associated with \fIIFILE\fR and are ignored when |
| \fIIFILE\fR is stdin. |
| .TP |
| \fBobs\fR=\fIBS\fR |
| if given must be the same as \fIBS\fR given to 'bs=' option. |
| .TP |
| \fBof\fR=\fIOFILE\fR |
| write to \fIOFILE\fR instead of stdout. If \fIOFILE\fR is '\-' then writes |
| to stdout. If \fIOFILE\fR is /dev/null then no actual writes are performed. |
| If \fIOFILE\fR is '.' (period) then it is treated the same way as |
| /dev/null (this is a shorthand notation). If \fIOFILE\fR exists then it |
| is _not_ truncated; it is overwritten from the start of \fIOFILE\fR |
| unless 'oflag=append' or \fISEEK\fR is given. |
| .TP |
| \fBoflag\fR=\fIFLAGS\fR |
| where \fIFLAGS\fR is a comma separated list of one or more flags outlined |
| below. These flags are associated with \fIOFILE\fR and are ignored when |
| \fIOFILE\fR is /dev/null, '.' (period), or stdout. |
| .TP |
| \fBseek\fR=\fISEEK\fR |
| start writing \fISEEK\fR bs\-sized blocks from the start of \fIOFILE\fR. |
| Default is block 0 (i.e. start of file). |
| .TP |
| \fBskip\fR=\fISKIP\fR |
| start reading \fISKIP\fR bs\-sized blocks from the start of \fIIFILE\fR. |
| Default is block 0 (i.e. start of file). |
| .TP |
| \fBsync\fR=0 | 1 |
| when 1, does SYNCHRONIZE CACHE command on \fIOFILE\fR at the end of the |
| transfer. Only active when \fIOFILE\fR is a sg device file name. |
| .TP |
| \fBthr\fR=\fITHR\fR |
| where \fITHR\fR is the number or worker threads (default 4) that attempt to |
| copy in parallel. Minimum is 1 and maximum is 1024. |
| .TP |
| \fBtime\fR=0 | 1 |
| when 1, the transfer is timed and throughput calculation is |
| performed, outputting the results (to stderr) at completion. When |
| 0 (default) no timing is performed. |
| .TP |
| \fBverbose\fR=\fIVERB\fR |
| increase verbosity. Same as \fIdeb=VERB\fR. Added for compatibility with |
| sg_dd and sgm_dd. |
| .TP |
| \fB\-c\fR, \fB\-\-chkaddr\fR |
| this option checks that every block read contains the (32 bit) block address |
| of that block. If that check fails, the copy exits with a miscompare error. |
| This check complements the 'sg_dd iflag=00,ff' generation of blocks that |
| contain their own (32 bit, big endian) block address. When \fI\-\-chkaddr\fR |
| is used once, only the first block address in each block is checked. When |
| used twice, each block address (that fits in a block) is checked. |
| .TP |
| \fB\-d\fR, \fB\-\-dry\-run\fR |
| does all the command line parsing and preparation but bypasses the actual |
| copy or read. That preparation may include opening \fIIFILE\fR or |
| \fIOFILE\fR to determine their lengths. This option may be useful for |
| testing the syntax of complex command line invocations in advance of |
| executing them. |
| .TP |
| \fB\-h\fR, \fB\-\-help\fR |
| outputs usage message and exits. |
| .TP |
| \fB\-v\fR, \fB\-\-verbose\fR |
| when used once, this is equivalent to \fIverbose=1\fR. When used |
| twice (e.g. "\-vv") this is equivalent to \fIverbose=2\fR, etc. |
| .TP |
| \fB\-V\fR, \fB\-\-version\fR |
| outputs version number information and exits. |
| .SH FLAGS |
| Here is a list of flags and their meanings: |
| .TP |
| append |
| causes the O_APPEND flag to be added to the open of \fIOFILE\fR. For normal |
| files this will lead to data appended to the end of any existing data. |
| Cannot be used together with the \fIseek=SEEK\fR option as they conflict. |
| The default action of this utility is to overwrite any existing data |
| from the beginning of the file or, if \fISEEK\fR is given, starting at |
| block \fISEEK\fR. Note that attempting to 'append' to a device file (e.g. |
| a disk) will usually be ignored or may cause an error to be reported. |
| .TP |
| coe |
| continue on error. When given with 'iflag=', an error that is detected |
| in a single SCSI command (typically 'bpt' blocks) is noted (by an error |
| message sent to stderr), then zeros are substituted into the buffer |
| for the corresponding write operation and the copy continues. Note that the |
| .B sg_dd |
| utility is more sophisticated in such error situations when 'iflag=coe'. |
| When given with 'oflag=', any error reported by a SCSI WRITE command is |
| reported to stderr and the copy continues (as if nothing went wrong). |
| .TP |
| dio |
| request the sg device node associated with this flag does direct IO. |
| If direct IO is not available, falls back to indirect IO and notes |
| this at completion. If direct IO is selected and |
| /sys/module/sg/parameters/allow_dio has the value of 0 then a warning is |
| issued (and indirect IO is performed). |
| .TP |
| direct |
| causes the O_DIRECT flag to be added to the open of \fIIFILE\fR and/or |
| \fIOFILE\fR. This flag requires some memory alignment on IO. Hence user |
| memory buffers are aligned to the page size. Has no effect on sg, normal |
| or raw files. |
| .TP |
| dpo |
| set the DPO bit (disable page out) in SCSI READ and WRITE commands. Not |
| supported for 6 byte cdb variants of READ and WRITE. Indicates that |
| data is unlikely to be required to stay in device (e.g. disk) cache. |
| May speed media copy and/or cause a media copy to have less impact |
| on other device users. |
| .TP |
| dsync |
| causes the O_SYNC flag to be added to the open of \fIIFILE\fR and/or |
| \fIOFILE\fR. The 'd' is prepended to lower confusion with the 'sync=0|1' |
| option which has another action (i.e. a synchronisation to media at the |
| end of the transfer). |
| .TP |
| excl |
| causes the O_EXCL flag to be added to the open of \fIIFILE\fR and/or |
| \fIOFILE\fR. |
| .TP |
| mmap |
| can only be used in the \fIiflag=FLAGS\fR or the \fIoflag=FLAGS\fR argument |
| list but not both. The nominated side of the copy will use memory mapped IO |
| based on the mmap(2) system call. The sg driver will remap its DMA |
| destination or source buffer into the user space when the mmap(2) system call |
| is used on a sg device. |
| .TP |
| fua |
| causes the FUA (force unit access) bit to be set in SCSI READ and/or WRITE |
| commands. This only has effect with sg devices. The 6 byte variants |
| of the SCSI READ and WRITE commands do not support the FUA bit. |
| Only active for sg device file names. |
| .TP |
| null |
| has no affect, just a placeholder. |
| .SH RETIRED OPTIONS |
| Here are some retired options that are still present: |
| .TP |
| coe=0 | 1 |
| continue on error is 0 (off) by default. When it is 1, it is |
| equivalent to 'iflag=coe oflag=coe' described in the FLAGS section |
| above. Similar to 'conv=noerror,sync' in |
| .B dd(1) |
| utility. Default is 0 which implies stop on error. More advanced |
| coe=1 processing on reads is performed by the sg_dd utility. |
| .TP |
| .TP |
| fua=0 | 1 | 2 | 3 |
| force unit access bit. When 3, fua is set on both \fIIFILE\fR and |
| \fIOFILE\fR; when 2, fua is set on \fIIFILE\fR;, when 1, fua is set on |
| \fIOFILE\fR; when 0 (default), fua is cleared on both. See the 'fua' flag. |
| .SH NOTES |
| A raw device must be bound to a block device prior to using sgp_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 'sg_map' |
| before use. |
| .PP |
| Raw device partition information can often be found with |
| .B fdisk(8) |
| [the "\-ul" argument is useful in this respect]. |
| .PP |
| Various numeric arguments (e.g. \fISKIP\fR) may include multiplicative |
| suffixes or be given in hexadecimal. See the "NUMERIC ARGUMENTS" section |
| in the sg3_utils(8) man page. |
| .PP |
| The \fICOUNT\fR, \fISKIP\fR and \fISEEK\fR arguments 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. |
| .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 |
| Why use sgp_dd? Because in some cases it is twice as fast as dd |
| (mainly with sg devices, raw devices give some improvement). |
| Another reason is that big copies fill the block device caches |
| which has a negative impact on other machine activity. |
| .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 EXAMPLES |
| .PP |
| Looks quite similar in usage to dd: |
| .PP |
| sgp_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 |
| correspondingly scaled. Using a raw device to do something similar on a |
| ATA disk: |
| .PP |
| raw /dev/raw/raw1 /dev/hda |
| .br |
| sgp_dd if=/dev/raw/raw1 of=t bs=512 count=1MB |
| .PP |
| To copy a SCSI disk partition to an ATA disk partition: |
| .PP |
| raw /dev/raw/raw2 /dev/hda3 |
| .br |
| sgp_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. |
| .PP |
| To do a fast copy from one SCSI disk to another one with similar |
| geometry (stepping over errors on the source disk): |
| .PP |
| sgp_dd if=/dev/sg0 of=/dev/sg1 bs=512 coe=1 |
| .SH EXIT STATUS |
| The exit status of sgp_dd is 0 when it is successful. Otherwise see |
| the sg3_utils(8) man page. Since this utility works at a higher level |
| than individual commands, and there are 'coe' and 'retries' flags, |
| individual SCSI command failures do not necessary cause the process |
| to exit. |
| .SH AUTHORS |
| Written by Douglas Gilbert and Peter Allworth. |
| .SH "REPORTING BUGS" |
| Report bugs to <dgilbert at interlog dot com>. |
| .SH COPYRIGHT |
| Copyright \(co 2000\-2022 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" |
| A simpler, non\-threaded version of this utility but with more |
| advanced "continue on error" logic is called |
| .B sg_dd |
| and is also found in the sg3_utils package. The lmbench package contains |
| .B lmdd |
| which is also interesting. |
| .B raw(8), dd(1) |