{
    "content": [
        {
            "type": "text",
            "text": "# sgp_dd (man)\n\n## NAME\n\nsgpdd - copy data to and from files and devices, especially SCSI devices\n\n## SYNOPSIS\n\nsgpdd   [bs=BS]   [count=COUNT]   [ibs=BS]   [if=IFILE]  [iflag=FLAGS]  [obs=BS]  [of=OFILE]\n[oflag=FLAGS] [seek=SEEK] [skip=SKIP] [--help] [--version]\n[bpt=BPT] [coe=0|1] [cdbsz=6|10|12|16] [deb=VERB] [dio=0|1] [sync=0|1]  [thr=THR]  [time=0|1]\n[verbose=VERB] [--dry-run] [--verbose]\n\n## DESCRIPTION\n\nCopy data to and from any files. Specialised for \"files\" that are Linux SCSI generic (sg) and\nraw devices. Similar syntax and semantics to dd(1) but does not perform any conversions. Uses\nPOSIX  threads (often called \"pthreads\") to increase the amount of parallelism. This improves\nspeed in some cases.\n\n## Sections\n\n- **NAME**\n- **SYNOPSIS**\n- **DESCRIPTION**\n- **OPTIONS** (4 subsections)\n- **FLAGS**\n- **RETIRED OPTIONS**\n- **NOTES**\n- **SIGNALS**\n- **EXAMPLES**\n- **EXIT STATUS**\n- **AUTHORS**\n- **REPORTING BUGS**\n- **COPYRIGHT**\n- **SEE ALSO**\n\nUse structuredContent.sections for detailed options, examples, and full documentation.\n"
        }
    ],
    "structuredContent": {
        "command": "sgp_dd",
        "section": "",
        "mode": "man",
        "summary": "sgpdd - copy data to and from files and devices, especially SCSI devices",
        "synopsis": "sgpdd   [bs=BS]   [count=COUNT]   [ibs=BS]   [if=IFILE]  [iflag=FLAGS]  [obs=BS]  [of=OFILE]\n[oflag=FLAGS] [seek=SEEK] [skip=SKIP] [--help] [--version]\n[bpt=BPT] [coe=0|1] [cdbsz=6|10|12|16] [deb=VERB] [dio=0|1] [sync=0|1]  [thr=THR]  [time=0|1]\n[verbose=VERB] [--dry-run] [--verbose]",
        "tldr_summary": null,
        "tldr_examples": [],
        "tldr_source": null,
        "flags": [
            {
                "flag": "-d",
                "long": "--dry-run",
                "arg": null,
                "description": "does all the command line parsing and preparation but bypasses the actual copy or read. That preparation may include opening IFILE or OFILE to determine their lengths. This option may be useful for testing the syntax of complex command line invocations in advance of executing them."
            },
            {
                "flag": "-h",
                "long": "--help",
                "arg": null,
                "description": "outputs usage message and exits."
            },
            {
                "flag": "-v",
                "long": "--verbose",
                "arg": null,
                "description": "when used once, this is equivalent to verbose=1. When used twice (e.g. \"-vv\") this is equivalent to verbose=2, etc."
            },
            {
                "flag": "-V",
                "long": "--version",
                "arg": null,
                "description": "outputs version number information and exits."
            }
        ],
        "examples": [
            "Looks quite similar in usage to dd:",
            "sgpdd if=/dev/sg0 of=t bs=512 count=1MB",
            "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:",
            "dd if=/dev/sda of=t bs=512 count=1000000",
            "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:",
            "raw /dev/raw/raw1 /dev/hda",
            "sgpdd if=/dev/raw/raw1 of=t bs=512 count=1MB",
            "To copy a SCSI disk partition to an ATA disk partition:",
            "raw /dev/raw/raw2 /dev/hda3",
            "sgpdd if=/dev/sg0 skip=10123456 of=/dev/raw/raw2 bs=512",
            "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.",
            "To  do a fast copy from one SCSI disk to another one with similar geometry (stepping over er‐",
            "rors on the source disk):",
            "sgpdd if=/dev/sg0 of=/dev/sg1 bs=512 coe=1"
        ],
        "see_also": [
            {
                "name": "raw",
                "section": "8",
                "url": "https://www.chedong.com/phpMan.php/man/raw/8/json"
            },
            {
                "name": "dd",
                "section": "1",
                "url": "https://www.chedong.com/phpMan.php/man/dd/1/json"
            }
        ],
        "section_outline": [
            {
                "name": "NAME",
                "lines": 2,
                "subsections": []
            },
            {
                "name": "SYNOPSIS",
                "lines": 6,
                "subsections": []
            },
            {
                "name": "DESCRIPTION",
                "lines": 8,
                "subsections": []
            },
            {
                "name": "OPTIONS",
                "lines": 91,
                "subsections": [
                    {
                        "name": "-d --dry-run",
                        "lines": 5,
                        "flag": "-d",
                        "long": "--dry-run"
                    },
                    {
                        "name": "-h --help",
                        "lines": 2,
                        "flag": "-h",
                        "long": "--help"
                    },
                    {
                        "name": "-v --verbose",
                        "lines": 3,
                        "flag": "-v",
                        "long": "--verbose"
                    },
                    {
                        "name": "-V --version",
                        "lines": 2,
                        "flag": "-V",
                        "long": "--version"
                    }
                ]
            },
            {
                "name": "FLAGS",
                "lines": 47,
                "subsections": []
            },
            {
                "name": "RETIRED OPTIONS",
                "lines": 14,
                "subsections": []
            },
            {
                "name": "NOTES",
                "lines": 27,
                "subsections": []
            },
            {
                "name": "SIGNALS",
                "lines": 5,
                "subsections": []
            },
            {
                "name": "EXAMPLES",
                "lines": 30,
                "subsections": []
            },
            {
                "name": "EXIT STATUS",
                "lines": 5,
                "subsections": []
            },
            {
                "name": "AUTHORS",
                "lines": 2,
                "subsections": []
            },
            {
                "name": "REPORTING BUGS",
                "lines": 2,
                "subsections": []
            },
            {
                "name": "COPYRIGHT",
                "lines": 4,
                "subsections": []
            },
            {
                "name": "SEE ALSO",
                "lines": 7,
                "subsections": []
            }
        ],
        "sections": {
            "NAME": {
                "content": "sgpdd - copy data to and from files and devices, especially SCSI devices\n",
                "subsections": []
            },
            "SYNOPSIS": {
                "content": "sgpdd   [bs=BS]   [count=COUNT]   [ibs=BS]   [if=IFILE]  [iflag=FLAGS]  [obs=BS]  [of=OFILE]\n[oflag=FLAGS] [seek=SEEK] [skip=SKIP] [--help] [--version]\n\n[bpt=BPT] [coe=0|1] [cdbsz=6|10|12|16] [deb=VERB] [dio=0|1] [sync=0|1]  [thr=THR]  [time=0|1]\n[verbose=VERB] [--dry-run] [--verbose]\n",
                "subsections": []
            },
            "DESCRIPTION": {
                "content": "Copy data to and from any files. Specialised for \"files\" that are Linux SCSI generic (sg) and\nraw devices. Similar syntax and semantics to dd(1) but does not perform any conversions. Uses\nPOSIX  threads (often called \"pthreads\") to increase the amount of parallelism. This improves\nspeed in some cases.\n\nThe first group in the synopsis above are \"standard\" Unix dd(1) operands.  The  second  group\nare extra options added by this utility.  Both groups are defined below.\n",
                "subsections": []
            },
            "OPTIONS": {
                "content": "bpt=BPT\neach  IO  transaction  will  be  made using BPT blocks (or less if near the end of the\ncopy). Default is 128 for block sizes less that 2048 bytes, otherwise the  default  is\n32.  So  for  bs=512  the  reads and writes will each convey 64 KiB of data by default\n(less if near the end of the transfer or memory restrictions). When cd/dvd drives  are\naccessed,  the  block  size is typically 2048 bytes and bpt defaults to 32 which again\nimplies 64 KiB transfers.\n\nbs=BS  where BS must be the block size of the physical device. Note that  this  differs  from\ndd(1)  which  permits 'bs' to be an integral multiple of the actual device block size.\nDefault is 512 which is usually correct for disks but incorrect for cdroms (which nor‐\nmally have 2048 byte blocks).\n\ncdbsz=6 | 10 | 12 | 16\nsize of SCSI READ and/or WRITE commands issued on sg device names.  Default is 10 byte\nSCSI command blocks (unless calculations indicate that a 4 byte block  number  may  be\nexceeded, in which case it defaults to 16 byte SCSI commands).\n\ncoe=0 | 1\nset  to 1 for continue on error. Only applies to errors on sg devices.  Thus errors on\nother files will stop sgpdd. Default is 0 which implies stop on any  error.  See  the\n'coe' flag for more information.\n\ncount=COUNT\ncopy  COUNT  blocks  from  IFILE to OFILE. Default is the minimum (of IFILE and OFILE)\nnumber of blocks that sg devices report from SCSI READ CAPACITY commands or that block\ndevices  (or  their partitions) report. Normal files are not probed for their size. If\nskip=SKIP or seek=SEEK are given and the count is deduced (i.e.  not explicitly given)\nthen  that  count  is scaled back so that the copy will not overrun the device. If the\nfile name is a block device partition and COUNT is not given then the size of the par‐\ntition  rather  than  the  size of the whole device is used. If COUNT is not given and\ncannot be deduced then an error message is issued and no copy takes place.\n\ndeb=VERB\noutputs debug information. If VERB is 0 (default) then there is minimal debug informa‐\ntion  and as VERB increases so does the amount of debug (max debug output when VERB is\n9).\n\ndio=0 | 1\ndefault is 0 which selects indirect IO. Value of 1 attempts direct IO  which,  if  not\navailable, falls back to indirect IO and notes this at completion. If direct IO is se‐\nlected and /proc/scsi/sg/allowdio has the value of 0 then a warning  is  issued  (and\nindirect IO is performed) For finer grain control use 'iflag=dio' or 'oflag=dio'.\n\nibs=BS if given must be the same as BS given to 'bs=' option.\n\nif=IFILE\nread  from  IFILE instead of stdin. If IFILE is '-' then stdin is read. Starts reading\nat the beginning of IFILE unless SKIP is given.\n\niflag=FLAGS\nwhere FLAGS is a comma separated list of one or  more  flags  outlined  below.   These\nflags are associated with IFILE and are ignored when IFILE is stdin.\n\nobs=BS if given must be the same as BS given to 'bs=' option.\n\nof=OFILE\nwrite  to OFILE instead of stdout. If OFILE is '-' then writes to stdout.  If OFILE is\n/dev/null then no actual writes are performed.  If OFILE is '.' (period)  then  it  is\ntreated the same way as /dev/null (this is a shorthand notation). If OFILE exists then\nit is not truncated; it is overwritten from the start of OFILE unless 'oflag=append'\nor SEEK is given.\n\noflag=FLAGS\nwhere  FLAGS  is  a  comma  separated list of one or more flags outlined below.  These\nflags are associated with OFILE and are ignored when OFILE is /dev/null, '.' (period),\nor stdout.\n\nseek=SEEK\nstart  writing SEEK bs-sized blocks from the start of OFILE.  Default is block 0 (i.e.\nstart of file).\n\nskip=SKIP\nstart reading SKIP bs-sized blocks from the start of IFILE.  Default is block 0  (i.e.\nstart of file).\n\nsync=0 | 1\nwhen  1,  does SYNCHRONIZE CACHE command on OFILE at the end of the transfer. Only ac‐\ntive when OFILE is a sg device file name.\n\nthr=THR\nwhere THR is the number or worker threads (default 4) that attempt to copy  in  paral‐\nlel. Minimum is 1 and maximum is 1024.\n\ntime=0 | 1\nwhen  1, the transfer is timed and throughput calculation is performed, outputting the\nresults (to stderr) at completion. When 0 (default) no timing is performed.\n\nverbose=VERB\nincrease verbosity. Same as deb=VERB. Added for compatibility with sgdd and sgmdd.\n",
                "subsections": [
                    {
                        "name": "-d --dry-run",
                        "content": "does all the command line parsing and preparation but  bypasses  the  actual  copy  or\nread.  That preparation may include opening IFILE or OFILE to determine their lengths.\nThis option may be useful for testing the syntax of complex command  line  invocations\nin advance of executing them.\n",
                        "flag": "-d",
                        "long": "--dry-run"
                    },
                    {
                        "name": "-h --help",
                        "content": "outputs usage message and exits.\n",
                        "flag": "-h",
                        "long": "--help"
                    },
                    {
                        "name": "-v --verbose",
                        "content": "when  used once, this is equivalent to verbose=1. When used twice (e.g. \"-vv\") this is\nequivalent to verbose=2, etc.\n",
                        "flag": "-v",
                        "long": "--verbose"
                    },
                    {
                        "name": "-V --version",
                        "content": "outputs version number information and exits.\n",
                        "flag": "-V",
                        "long": "--version"
                    }
                ]
            },
            "FLAGS": {
                "content": "Here is a list of flags and their meanings:\n\nappend causes the OAPPEND flag to be added to the open of OFILE. For normal files this  will\nlead  to  data appended to the end of any existing data.  Cannot be used together with\nthe seek=SEEK option as they conflict.  The default action of this utility is to over‐\nwrite  any existing data from the beginning of the file or, if SEEK is given, starting\nat block SEEK. Note that attempting to 'append' to a device file (e.g.  a  disk)  will\nusually be ignored or may cause an error to be reported.\n\ncoe    continue  on  error.  When  given with 'iflag=', an error that is detected in a single\nSCSI command (typically 'bpt' blocks) is noted (by an error message sent  to  stderr),\nthen  zeros  are substituted into the buffer for the corresponding write operation and\nthe copy continues. Note that the sgdd utility is more sophisticated  in  such  error\nsituations  when  'iflag=coe'.  When given with 'oflag=', any error reported by a SCSI\nWRITE command is reported to stderr and the copy continues (as if nothing went wrong).\n\ndio    request the sg device node associated with this flag does direct IO.  If direct IO  is\nnot available, falls back to indirect IO and notes this at completion. If direct IO is\nselected and /proc/scsi/sg/allowdio has the value of 0 then a warning is issued  (and\nindirect IO is performed).\n\ndirect causes  the ODIRECT flag to be added to the open of IFILE and/or OFILE. This flag re‐\nquires some memory alignment on IO. Hence user memory buffers are aligned to the  page\nsize. Has no effect on sg, normal or raw files.\n\ndpo    set  the DPO bit (disable page out) in SCSI READ and WRITE commands. Not supported for\n6 byte cdb variants of READ and WRITE. Indicates that data is unlikely to be  required\nto  stay  in device (e.g. disk) cache.  May speed media copy and/or cause a media copy\nto have less impact on other device users.\n\ndsync  causes the OSYNC flag to be added to the open of  IFILE  and/or  OFILE.  The  'd'  is\nprepended to lower confusion with the 'sync=0|1' option which has another action (i.e.\na synchronisation to media at the end of the transfer).\n\nexcl   causes the OEXCL flag to be added to the open of IFILE and/or OFILE.\n\nmmap   can only be used in the iflag=FLAGS or the oflag=FLAGS argument list but not both. The\nnominated side of the copy will use memory mapped IO based on the mmap(2) system call.\nThe sg driver will remap its DMA destination or source buffer into the user space when\nthe mmap(2) system call is used on a sg device.\n\nfua    causes  the  FUA (force unit access) bit to be set in SCSI READ and/or WRITE commands.\nThis only has effect with sg devices. The 6 byte variants of the SCSI READ  and  WRITE\ncommands do not support the FUA bit.  Only active for sg device file names.\n\nnull   has no affect, just a placeholder.\n",
                "subsections": []
            },
            "RETIRED OPTIONS": {
                "content": "Here are some retired options that are still present:\n\ncoe=0 | 1\ncontinue  on error is 0 (off) by default. When it is 1, it is equivalent to 'iflag=coe\noflag=coe' described in the FLAGS section above.  Similar  to  'conv=noerror,sync'  in\ndd(1)  utility. Default is 0 which implies stop on error. More advanced coe=1 process‐\ning on reads is performed by the sgdd utility.\n\n\nfua=0 | 1 | 2 | 3\nforce unit access bit. When 3, fua is set on both IFILE and OFILE; when 2, fua is  set\non  IFILE;, when 1, fua is set on OFILE; when 0 (default), fua is cleared on both. See\nthe 'fua' flag.\n",
                "subsections": []
            },
            "NOTES": {
                "content": "A raw device must be bound to a block device prior to using sgpdd.  See raw(8) for more  in‐\nformation  about binding raw devices. To be safe, the sg device mapping to SCSI block devices\nshould be checked with 'cat /proc/scsi/scsi' before use.\n\nRaw device partition information can often be found with fdisk(8) [the \"-ul\" argument is use‐\nful in this respect].\n\nVarious  numeric  arguments  (e.g.  SKIP)  may include multiplicative suffixes or be given in\nhexadecimal. See the \"NUMERIC ARGUMENTS\" section in the sg3utils(8) man page.\n\nThe COUNT, SKIP and SEEK arguments can take 64 bit values (i.e. very big numbers). Other val‐\nues are limited to what can fit in a signed 32 bit number.\n\nData  usually  gets  to the user space in a 2 stage process: first the SCSI adapter DMAs into\nkernel buffers and then the sg driver copies this data into user memory (write operations re‐\nverse  this  sequence).   This  is called \"indirect IO\" and there is a 'dio' option to select\n\"direct IO\" which will DMA directly into user memory. Due to some issues \"direct IO\" is  dis‐\nabled in the sg driver and needs a configuration change to activate it.\n\nAll  informative,  warning and error output is sent to stderr so that dd's output file can be\nstdout and remain unpolluted. If no options are given, then the usage message is  output  and\nnothing else happens.\n\nWhy  use sgpdd? Because in some cases it is twice as fast as dd (mainly with sg devices, raw\ndevices give some improvement).  Another reason is that big  copies  fill  the  block  device\ncaches which has a negative impact on other machine activity.\n",
                "subsections": []
            },
            "SIGNALS": {
                "content": "The  signal handling has been borrowed from dd: SIGINT, SIGQUIT and SIGPIPE output the number\nof remaining blocks to be transferred and the records in + out counts; then they  have  their\ndefault  action.   SIGUSR1  causes  the same information to be output yet the copy continues.\nAll output caused by signals is sent to stderr.\n",
                "subsections": []
            },
            "EXAMPLES": {
                "content": "Looks quite similar in usage to dd:\n\nsgpdd if=/dev/sg0 of=t bs=512 count=1MB\n\nThis will copy 1 million 512 byte blocks from the  device  associated  with  /dev/sg0  (which\nshould have 512 byte blocks) to a file called t.  Assuming /dev/sda and /dev/sg0 are the same\ndevice then the above is equivalent to:\n\ndd if=/dev/sda of=t bs=512 count=1000000\n\nalthough dd's speed may improve if bs was larger and count was correspondingly scaled.  Using\na raw device to do something similar on a ATA disk:\n\nraw /dev/raw/raw1 /dev/hda\nsgpdd if=/dev/raw/raw1 of=t bs=512 count=1MB\n\nTo copy a SCSI disk partition to an ATA disk partition:\n\nraw /dev/raw/raw2 /dev/hda3\nsgpdd if=/dev/sg0 skip=10123456 of=/dev/raw/raw2 bs=512\n\nThis  assumes  a  valid  partition  is found on the SCSI disk at the given skip block address\n(past the 5 GB point of that disk) and that the partition goes to the end of the  SCSI  disk.\nAn explicit count is probably a safer option.\n\nTo  do a fast copy from one SCSI disk to another one with similar geometry (stepping over er‐\nrors on the source disk):\n\nsgpdd if=/dev/sg0 of=/dev/sg1 bs=512 coe=1\n",
                "subsections": []
            },
            "EXIT STATUS": {
                "content": "The exit status of sgpdd is 0 when it is successful.  Otherwise  see  the  sg3utils(8)  man\npage.  Since  this  utility  works  at a higher level than individual commands, and there are\n'coe' and 'retries' flags, individual SCSI  command  failures  do  not  necessary  cause  the\nprocess to exit.\n",
                "subsections": []
            },
            "AUTHORS": {
                "content": "Written by Douglas Gilbert and Peter Allworth.\n",
                "subsections": []
            },
            "REPORTING BUGS": {
                "content": "Report bugs to <dgilbert at interlog dot com>.\n",
                "subsections": []
            },
            "COPYRIGHT": {
                "content": "Copyright © 2000-2020 Douglas Gilbert\nThis software is distributed under the GPL version 2. There is NO warranty; not even for MER‐\nCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n",
                "subsections": []
            },
            "SEE ALSO": {
                "content": "A simpler, non-threaded version of this utility but with more advanced  \"continue  on  error\"\nlogic  is  called  sgdd and is also found in the sg3utils package. The lmbench package con‐\ntains lmdd which is also interesting.  raw(8), dd(1)\n\n\n\nsg3utils-1.45                              February 2020                                  SGPDD(8)",
                "subsections": []
            }
        }
    }
}