SG_DD(8)
sg_dd(8) ยท SG3_UTILS ยท bestie edition, part 1 ๐
โจ NAME โจ
sg_dd โ copies data to and from files and devices, and is especially that girl when it comes to SCSI devices ๐
๐ธ SYNOPSIS ๐ธ
sg_dd [bs=BS] [conv=CONV] [count=COUNT] [ibs=BS] [if=IFILE]
[iflag=FLAGS] [obs=BS] [of=OFILE] [oflag=FLAGS] [seek=SEEK] [skip=SKIP]
[--help] [--verbose] [--version]
[blk_sgio={0|1}] [bpt=BPT] [cdbsz={6|10|12|16}] [cdl=CDL]
[coe={0|1|2|3}] [coe_limit=CL] [dio={0|1}] [grpnum=GN] [odir={0|1}]
[of2=OFILE2] [retries=RETR] [sync={0|1}] [time={0|1}[,TO]]
[verbose=VERB] [--dry-run] [--nocopy] [--progress] [--verify]
๐ฆ DESCRIPTION ๐ฆ
okay so imagine dd(1) but with main character energy: sg_dd copies data to and from any files, and it's lowkey specialized for "files" that are actually Linux SCSI generic (sg) devices, raw devices, or any other device that supports the SG_IO ioctl (which, fun fact, you only find in the lk 2.6 series). The syntax and semantics are similar to the dd(1) command. Slay.
The first group up in the synopsis is the "standard" Unix dd(1) operands, and the second group is the extra options this utility brought to the party. Both groups get defined below, don't worry ๐ซถ
When you give the --verify option, the read side stays exactly the same, but on the write side the WRITE SCSI command gets swapped out for the VERIFY SCSI command. And if any VERIFY command throws a sense key of MISCOMPARE, the verify operation just stops, periodt. The --verify option can only be used when OFILE is either an sg device or a block device that also has oflag=sgio given. When --verify is in play, this utility kinda works like the Unix cmp(1) command. iconic.
Real talk though: this utility is only supported on Linux, whereas most other utilities in the sg3_utils package have been ported to other operating systems. There's a utility called "ddpt" that has similar syntax and functionality to sg_dd โ ddpt drops some Linux specific features while adding some other generic features, and that's literally what lets ddpt get ported to other operating systems. iykyk.
For support of NVMe storage devices, see the section below titled: NVME SUPPORT.
๐ OPTIONS ๐
blk_sgio={0|1}โ when it's set to0, block devices (e.g./dev/sda) get treated like normal files, i.e.read(2)andwrite(2)are used for IO. When it's set to1, block devices are assumed to accept theSG_IOioctl and SCSI commands are issued for IO. This is only supported for 2.6 series kernels. Heads up bestie: ATAPI devices (e.g. cd/dvd players) use the SCSI command set but ATA disks do not (unless there's 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 is0. See the 'sgio' flag ๐bpt=BPTโ each IO transaction will be made usingBPTblocks (or less if you're near the end of the copy). Default is128for logical block sizes less than 2048 bytes, otherwise the default is32. So forbs=512the 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 logical block size is typically 2048 bytes andbptdefaults to32which again implies 64 KiB transfers. Ngl, the block layer when theblk_sgio=1option is used has relatively low upper limits for transfer sizes (compared to sg device nodes, see/sys/block/<dev_name>/queue/max_sectors_kb).bs=BSโ whereBSmust be the logical block size of the physical device (if either the input or output files are accessed via SCSI commands). And yes this differs fromdd(1), which permitsBSto be an integral multiple. Default is512, 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 isBS * BPTbytes.cdbsz={6|10|12|16}โ size of the SCSIREADand/orWRITEcommands issued on sg device names (or block devices when'iflag=sgio'and/or'oflag=sgio'is given). Default is 10 byte SCSI command blocks (unless calculations indicate that a 4 byte block number may be exceeded orBPTis greater than 16 bits (65535), in which case it defaults to 16 byte SCSI commands).cdl=CDLโ allows setting of command duration limits.CDLis either a single value or two values separated by a comma. If one value is given, it applies to bothIFILEandOFILE(if they are pass-through devices). If two values are given, the first applies toIFILEwhile the second applies toOFILE. The value may be from0to7where0is the default and means there are no command duration limits. Command duration limits are only supported by 16 byteREADandWRITEcommands (plusREAD(32),WRITE(32)and the WRITE SCATTERED command, bit they are used by this utility). If thecdbszoperand is not given and would have a value less than 16, then ifCDLis greater than 0, thecdbszis increased to 16. Command duration limits can be accesses and changed in the Command duration limit A and B mode pages, plus the Command duration limit T2A and T2B mode pages. Thesdparmutility may be used to access and change these mode pages โจcoe={0|1|2|3}โ set to1or more for continue on error ('coe'). Only applies to errors on sg devices or block devices with the 'sgio' flag set. So errors on other files will stopsg_dd. Default is0which implies stop on any error. See the 'coe' flag for more information.coe_limit=CLโ whereCLis the maximum number of consecutive bad blocks stepped over (due to "coe>0") on reads before the copy terminates. This only applies whenIFILEis accessed via theSG_IOioctl. The default is0which is interpreted as no limit. This option is meant to stop the copy soon after unrecorded media is detected while still offering "continue on error" capability. thoughtful queen ๐conv=sparseโ see the CONVERSIONS section below.count=COUNTโ copyCOUNTblocks fromIFILEtoOFILE. Default is the minimum (ofIFILEandOFILE) number of blocks that sg devices report from SCSIREAD CAPACITYcommands or that block devices (or their partitions) report. Normal files are not probed for their size. Ifskip=SKIPorseek=SEEKare 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 andCOUNTis not given then the size of the partition rather than the size of the whole device is used. IfCOUNTis not given (orcount=-1) and cannot be derived then an error message is issued and no copy takes place. no copy, no drama ๐ญdio={0|1}โ default is0which selects indirect (buffered) IO on sg devices. A value of1attempts 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_diohas the value of0then a warning is issued (and indirect IO is performed). For finer grain control use'iflag=dio'or'oflag=dio'.grpnum=GNโ the 'Group number' field is a 6 bit field (0to0x3f) found in all SCSIREADandWRITEcommands (apart from the deprecatedREAD(6)andWRITE(6)).GNis either a single value or a pair of values separated by a comma. The default value is0. If a pair of values is given, the first is used for theIFILEside (i.e. the SCSIREAD) and the second is used for theOFILEside (i.e. the SCSIWRITE).
The group number is applied to non-passthrough devices using fcntl(F_SET_FILE_RW_HINT). For the OFILE side, oflag=direct is needed to defeat the write cache because F_SET_FILE_RW_HINT does not change the handling of the write cache (but fcntl(F_SET_RW_HINT) does change the write cache handling) ๐ง
ibs=BSโ if given, must be the same asBSgiven to the'bs='option.if=IFILEโ read fromIFILEinstead of stdin. IfIFILEis'-'then stdin is read. Starts reading at the beginning ofIFILEunlessSKIPis given.iflag=FLAGSโ whereFLAGSis a comma separated list of one or more flags outlined below. These flags are associated withIFILEand are ignored whenIFILEis stdin.obs=BSโ if given, must be the same asBSgiven to the'bs='option.odir={0|1}โ when set to one, opens block devices (e.g./dev/sda) with theO_DIRECTflag. User memory buffers are aligned to the page size when set. The default is0(i.e. theO_DIRECTflag is not used). Has no effect on sg, normal or raw files. Ifblk_sgiois also set then both are honoured: block devices are opened with theO_DIRECTflag and SCSI commands are issued via theSG_IOioctl ๐of=OFILEโ write toOFILEinstead of stdout. IfOFILEis'-'then writes to stdout. IfOFILEis/dev/nullthen no actual writes are performed. IfOFILEis'.'(period) then it is treated the same way as/dev/null(this is a shorthand notation). IfOFILEexists then it is not truncated; it is overwritten from the start ofOFILEunless'oflag=append'orSEEKis given.of2=OFILE2โ write output toOFILE2. The default action is not to do this additional write (i.e. when this option is not given).OFILE2is assumed to be a normal file or a fifo (i.e. a named pipe).OFILE2is opened for writing, created if necessary, and closed at the end of the transfer. IfOFILE2is a fifo (named pipe) then some other command should be consuming that data (e.g.'md5sum OFILE2'), otherwise this utility will block. deadlock is not the vibe ๐oflag=FLAGSโ whereFLAGSis a comma separated list of one or more flags outlined below. These flags are associated withOFILEand are ignored whenOFILEis/dev/null,'.'(period), or stdout.retries=RETRโ sometimes retries at the host are useful, for example when there is a transport error. WhenRETRis greater than zero then SCSIREADs andWRITEs are retried on error,RETRtimes. Default value is zero.seek=SEEKโ start writingSEEKbs-sized blocks from the start ofOFILE. Default is block 0 (i.e. start of file).skip=SKIPโ start readingSKIPbs-sized blocks from the start ofIFILE. Default is block 0 (i.e. start of file).sync={0|1}โ when itโs1, this does aSYNCHRONIZE CACHEcommand onOFILEat the end of the transfer. Itโs only active whenOFILEis an sg device file name or a block device and'blk_sgio=1'is given. ๐พtime={0|1}[,TO]โ when itโs1, it times the transfer and does throughput calculation, outputting the results (tostderr) at completion. When itโs0(the default), it doesnโt perform timing. โฑ๏ธ If that value is followed by a comma, thenTOis the command timeout in seconds for SCSIREAD,WRITEorVERIFYcommands issued by this utility. The default is60seconds.verbose=VERBโ asVERBincreases, so does the amount of debug output sent tostderr. Default value is zero, which yields the minimum amount of debug output. A value of1reports extra information that is not repetitive. A value2reports cdbs and responses for SCSI commands that are not repetitive (i.e. other thatREADandWRITE). Error processing is not considered repetitive. Values of3and4yield output for all SCSI commands (and Unixread()andwrite()calls) so there can be a lot of output. This only occurs for scsi generic (sg) devices and block devices when the'blk_sgio=1'option is set. ๐-d,--dry-runโ does all the command line parsing and preparation but bypasses the actual copy or read. That preparation may include openingIFILEorOFILEto determine their lengths. This option may be useful for testing the syntax of complex command line invocations in advance of executing them. ๐งช-h,--helpโ outputs usage message and exits. ๐ซถ-n,--nocopyโ this option causes this utility to exit when it would otherwise attempt to write toOFILEorstdout. It will not block an attempt to verify (i.e. using the--verifyoption) as in that caseOFILEshould not be modified. The long option variant may be abbreviated to--nc. The explicit way to instruct this utility to read onlyIFILEis to use'--of=/dev/null'in the invocation. This option may viewed as extra safety in case when the'--of=/dev/null'is not given or misspelt. ๐-p,--progressโ this option causes a progress report to be output every two minutes until the copy is complete. After the copy is complete a line with"completed"is printed to distinguish the final report from the prior progress reports. When used twice the progress report is every minute, when used three times the progress report is every 30 seconds. If this option is given then the'time=1'option is set implicitly. ๐-v,--verboseโ when used once, this is equivalent toverbose=1. When used twice (e.g."-vv") this is equivalent toverbose=2, etc. ๐ฃ๏ธ-x,--verifyโ do a verify operation (like Unix commandcmp(1)) rather than a copy. Cannot be used with"oflag=sparse".of=OFILEmust be given andOFILEmust be an sg device or a block device with"oflag=sgio"also given. Uses the SCSIVERIFYcommand with theBYTCHKfield set to1. TheVERIFYcommand is used instead ofWRITEwhen this option is given. There is noVERIFY(6)command. Stops on the first miscompare unlessoflag=coeis given. ๐
bestie, that verify setup is strict on purpose โ no shady mismatches just vibing through. It stops on the first miscompare unless oflag=coe is given. ๐ญ
-V,--versionโ outputs version number information and exits. ๐
๐ฆ CONVERSIONS ๐ฆ
One or more conversions can be given to the "conv=" option. If more than one is given, they should be comma separated. sg_dd does not perform the traditional dd conversions (e.g. ASCII to EBCDIC). Recently added conversions overlap somewhat with the flags so some conversions are now supported by sg_dd. โจ
nocreatโ this conversion has the same effect as"oflag=nocreat", namely:OFILEmust exist, it will not be created. ๐ซnoerrorโ this conversion is very close to"iflag=coe"and is treated as such. See the"coe"flag. Note that an error onOFILEwill stop the copy. โ ๏ธnotruncโ this conversion is accepted for compatibility with dd and ignored since the default action of this utility is not to truncateOFILE. ๐nullโ has no affect, just a placeholder. ๐sparseโ FreeBSD supports"conv=sparse"so the same syntax is supported insg_dd. See"sparse"in theFLAGSsections for more information. ๐ธsyncโ is ignored bysg_dd. With dd it means supply zero fill (rather than skip) and is typically used like this"conv=noerror,sync"to have the same functionality assg_dd's"iflag=coe". ๐
โจ FLAGS โจ
okay so here's the flag lore, bestie โ every single one, no skips, no cap. ๐
00โ this one is only active withiflag=, and when you give it, it replacesif=IFILE. If you give both, you get an error, periodt. The input will be a stream of zeros, similar to usingif=/dev/zeroalone (but a little quicker), apart from the following case. Ififlag=00,ffis given, then the block address (lower 32 bits, in 4 bytes, big endian) is placed, multiple times, in each block. The block address takes into account theskip=SKIPsetting. Thesgp_ddutility has a--chkaddroption that complements this option. โจappendโ causes theO_APPENDflag to be added to the open ofOFILE. For regular files this will lead to data appended to the end of any existing data. Cannot be used together with theseek=SEEKoption as they conflict. The default action of this utility is to overwrite any existing data from the beginning of the file or, ifSEEKis given, starting at blockSEEK. 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. ๐ซถcoeโ continue on error. Only active for sg devices and block devices that have thesgioflag set.iflag=coe oflag=coeandcoe=1are equivalent. Use this flag twice (e.g.iflag=coe,coe) to have the same action as thecoe=2. A medium, hardware or blank check error while reading will re-read blocks prior to the bad block, then try to recover the bad block, supplying zeros if that fails, and finally re-read the blocks after the bad block. A medium, hardware or blank check error while writing is noted and ignored. A miscompare sense key during aVERIFYcommand (i.e.--verifygiven) is noted and ignored whenoflag=coe. The recovery of the bad block when reading uses the SCSIREAD LONGcommand ifcoegiven twice or more (also with the command line optioncoe=2). Further, theREAD LONGwill set itsCORRCTbit ifcoegiven thrice. SCSI disks may automatically try and remap faulty sectors (see theAWREandARREin the read write error recovery mode page (thesdparmutility can access and possibly change these attributes)). Errors occurring on other file types will stopsg_dd. Error messages are sent tostderr. This flag is similar toconv=noerror,syncin thedd(1)utility. See note aboutREAD LONGbelow. ๐ญdioโ requests that 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_diohas the value of0then a warning is issued (and indirect IO is performed). ๐ฅdirectโ causes theO_DIRECTflag to be added to the open ofIFILEand/orOFILE. 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. Ififlag=sgioand/oroflag=sgiois also set then both are honoured: block devices are opened with theO_DIRECTflag and SCSI commands are issued via theSG_IO ioctl. ๐dpoโ set the DPO bit (disable page out) in SCSIREADandWRITEcommands. Not supported for 6 byte cdb variants ofREADandWRITE. 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. ๐dsyncโ causes theO_SYNCflag to be added to the open ofIFILEand/orOFILE. Thedis prepended to lower confusion with thesync=0|1option which has another action (i.e. a synchronisation to media at the end of the transfer). ๐exclโ causes theO_EXCLflag to be added to the open ofIFILEand/orOFILE. ๐ffโ this flag is only active withiflag=and when given replacesif=IFILE. If both are given an error is generated. The input will be a stream of0xffbytes (or all bits set), apart from the following case. Ififlag=00,ffis given then the block address (lower 32 bits, in 4 bytes, big endian) is placed, multiple times, in each block. The block address takes into account theskip=SKIPsetting. โญflockโ after opening the associated file (i.e.IFILEand/orOFILE) an attempt is made to get an advisory exclusive lock with theflock()system call. The flock arguments are"FLOCK_EX | FLOCK_NB"which will cause the lock to be taken if available else a โtemporarily unavailableโ error is generated. An exit status of90is produced in the latter case and no copy is done. ๐fuaโ causes the FUA (force unit access) bit to be set in SCSIREADand/orWRITEcommands. This only has an effect with sg devices or block devices that have thesgioflag set. The 6 byte variants of the SCSIREADandWRITEcommands do not support the FUA bit. ๐ธnocacheโ useposix_fadvise()to advise corresponding file there is no need to fill the file buffer with recently read or written blocks. ๐งnocreatโ this flag is only active inoflag=FLAGS. If present thenOFILEwill be opened if it exists. IfOFILEdoesn't exist then an error is generated. Without this flag a regular (empty) file namedOFILEwill be created (and then filled). For production quality scripts whereOFILEis a device node (e.g./dev/sdc) this flag is recommended. It guards against the remote possibility ofdev/sdcdisappearing temporarily (e.g. a USB memory key removed) resulting in a large regular file called/dev/sdcbeing created. ๐nullโ has no affect, just a placeholder. ๐ptโ has the same meaning as thesgioflag. Added for compatibility with theddptutility. ๐ฆrandomโ this flag is only active withiflag=and when given replacesif=IFILE. If both are given an error is generated. The input will be a stream of pseudo random bytes. The Linuxgetrandom(2)system call is used to create a seed and thereaftermrand48(3)is used to generate a pseudo random sequence, 4 bytes at a time. The quality of the randomness can be viewed with theent(1)utility. This is not a high quality random number generator, it is built for speed, not quality. One application is checking the correctness of the copy and verify operations of this utility. โจsgioโ causes block devices to be accessed via theSG_IO ioctlrather than standard UNIXread()andwrite()commands. When theSG_IO ioctlis used the SCSIREADandWRITEcommands are used directly to move data. sg devices always use theSG_IO ioctl. This flag offers finer grain control compared to the otherwise identicalblk_sgio=1option. ๐sparseโ after eachBS * BPTbyte segment is read from the input, it is checked for being all zeros. If so, nothing is written to the output file unless this is the last segment of the transfer. This flag is only active with theoflagoption. It cannot be used when the output is not seekable (e.g.stdout). It is ignored if the output file is/dev/null. Note that this utility does not remove theOFILEprior to starting to write to it. Hence it may be advantageous to manually remove theOFILEif it is large prior to usingoflag=sparse. The last segment is always written so regular files will show the same length and so programs likemd5sumandsha1sumwill generate the same value regardless of whetheroflag=sparseis given or not. This option may be used when theOFILEis a raw device but is probably only useful if the device is known to contain zeros (e.g. a SCSI disk after aFORMATcommand). ๐
๐ธ RETIRED OPTIONS ๐ธ
here are some retired options that are still present โ yes, they're still here, living their best life. ๐ฆ
append=0 | 1โ when set, equivalent tooflag=append. When clear the action is to overwrite the existing file (if it exists); this is the default. See theappendflag.fua=0 | 1 | 2 | 3โ force unit access bit. When3, fua is set on bothIFILEandOFILE; when2, fua is set onIFILE;, when1, fua is set onOFILE; when0(default), fua is cleared on both. See thefuaflag. ๐
๐๏ธ NOTES ๐๏ธ
okay bestie, real talk about block devices ๐
โ you can hand /dev/sda and /dev/hda (and friends) to IFILE. If none of -iflag=direct, iflag=sgio, or blk_sgio=1 is given, then normal block IO involving buffering and caching is performed. If only -iflag=direct is given, then the buffering and caching is bypassed โ and yes, that applies to both SCSI devices and ATA disks. If iflag=sgio or blk_sgio=1 is given, then the SG_IO ioctl is used on the given file, causing SCSI commands to be sent to the device, and that also bypasses most of the actions performed by the block layer โ but this is only applicable to SCSI devices, not ATA disks. The same applies for block devices given for OFILE. ๐ซถ
Various numeric arguments (e.g. SKIP) may include multiplicative suffixes or be given in hexadecimal. Go peek at the "NUMERIC ARGUMENTS" section in the sg3_utils(8) man page for that tea. โ
The COUNT, SKIP, and SEEK arguments can take 64 bit values (i.e. very big numbers โ main character energy ๐ฅ). Other values are limited to what can fit in a signed 32 bit number.
Data usually gets to 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 > /sys/module/sg/parameters/allow_dio
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. ๐
Even if READ LONG succeeds on a โbadโ block when 'coe=2' (or 'coe=3') is given, the recovered data may not be useful. There are no guarantees that the user data will appear "as is" in the first 512 bytes. ๐ญ
A raw device must be bound to a block device prior to using sg_dd. See 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. ๐ธ
Disk partition information can often be found with fdisk(8) [the "-ul" argument is useful in this respect].
For sg devices (and block devices when blk_sgio=1 is given) this utility issues SCSI READ and WRITE (SBC) commands which are appropriate for disks and reading from CD/DVD/HD-DVD/BD 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 SCSI READ(16) and WRITE(16) commands. ๐
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:
sg_dd if=/dev/sdb2 blk_sgio=1 of=t bs=512
๐ง NVME SUPPORT ๐ง
Some support for copying from and to NVMe devices in Linux has been added. There are two varieties of NVME โcharโ devices, examples: /dev/nvme<cid> and /dev/ng<cid>n<nsid>, where <cid> is the controller identifier (starting at 0) and <nsid> is the NVMe namespace identifier (starting at 1). The latter form is called "nvme-generic" in /proc/devices. The NVMe block devices have the form: /dev/nvme<cid>n<nsid>[p<part_id>], where the optional <part_id> is the partition identifier (starting at 1). In the case of NVMe block devices, the default action of sg_dd is to access them using standard Unix IO (i.e. read(2) or write(2)). To access them using SCSI/NVMe commands, the flag "sgio" or "pt" needs to be given (e.g. iflag=pt if=/dev/nvme0n1). โจ
๐จ Just as with partitions on SCSI disks, it is dangerous to access NVMe partitions (e.g.iflag=pt if=/dev/nvme0n1p2) using a pass-through interface. The reason is that both SCSI and NVMe commands are oblivious to any partitioning arrangement which Linux (or any other OS) has set up on those disks. In other words, in the above example the"p2"at the end ofif=/dev/nvme0n1p2is ignored when a pass-through is being used. ๐
The READ and WRITE commands in NVMe are in the "NVM" command set, which requires an NVMe namespace to be specified. This means that the char device /dev/nvme0 is not useful for the utility โ only administrative commands can be sent to it. That leaves the /dev/ng<cid>n<nsid> as the only NVMe โcharโ device that can be used with this utility. Since it is not a block device, the standard Unix read(2) and write(2) will not work with it; so the pass-through interface, issuing SCSI/NVME commands, is assumed by this utility. ๐
The term "SCSI/NVME command" refers to the fact that this utility issues SCSI commands and a lower level, within libsgutils, converts them to the corresponding NVMe commands. This action is known as a SCSI to NVMe Translation Layer (SNTL), and the NVMe consortium wrote a white paper on it early in the development of NVMe. ๐
๐ EXAMPLES ๐
Looks quite similar in usage to dd:
sg_dd 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 iflag=direct of=t bs=512 count=1000000
although dd's speed may improve if bs was larger and count was suitably reduced. The use of the 'iflag=direct' option bypasses the buffering and caching that is usually done on a block device. ๐จ
Using a raw device to do something similar on an ATA disk:
raw /dev/raw/raw1 /dev/hda
sg_dd 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
sg_dd 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. The partition is copied to /dev/hda3, which is an offset into the ATA disk /dev/hda. The exact number of blocks read from /dev/sg0 are written to /dev/hda (i.e. no padding). ๐
To time a streaming read of the first 1 GB (2 ** 30 bytes) on a disk, this utility could be used:
sg_dd if=/dev/sg0 of=/dev/null bs=512 count=2m time=1
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. โฑ๏ธ
The 'of2=' option can be used to copy data and take a md5sum of it without needing to re-read the data:
mkfifo fif
md5sum fif &
sg_dd if=/dev/sg3 iflag=coe of=sg3.img oflag=sparse of2=fif bs=512
This will image /dev/sg3 (e.g. an unmounted disk) and place the contents in the (sparse) file sg3.img . Without re-reading the data, it will also perform a md5sum calculation on the image. ๐งฎ
๐ก SIGNALS ๐ก
The signal handling has been borrowed from dd:
SIGINT,SIGQUIT, andSIGPIPEโ 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. ๐ซก
๐ช EXIT STATUS ๐ช
The exit status of sg_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 necessarily cause the process to exit.
90โ an additional exit status of 90 is generated if theflockflag is given and some other process holds the advisory exclusive lock. ๐
โ๏ธ AUTHORS โ๏ธ
Written by Douglas Gilbert and Peter Allworth. ๐ฏ
๐ REPORTING BUGS ๐
Report bugs to <dgilbert at interlog dot com>. ๐ฌ
ยฉ๏ธ COPYRIGHT ยฉ๏ธ
Copyright ยฉ 2000-2026 Douglas Gilbert.
This software is distributed under the GPL version 2. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. โ๏ธ
๐ SEE ALSO ๐
cmp(1)- There is a web page discussing
sg_ddathttps://sg.danny.cz/sg/sg_dd.html - A POSIX threads version of this utility called
sgp_ddis in thesg3_utilspackage. Another version from that package is calledsgm_dd, and it uses memory mapped IO to speed transfers from sg devices. - The
lmbenchpackage containslmdd, which is also interesting. For moving data to and from tapes, seedt, which is found athttps://www.scsifaq.org/RMiller_Tools/index.html - To change mode parameters that effect a SCSI device's caching and error recovery, see
sdparm(sdparm) - To verify the data on the media or to verify it against some other copy of the data, see
sg_verify(sg3_utils) - See also
raw(8),dd(1),ddrescue(GNU),ddpt
Thatโs the whole vibe, bestie โ catch you in the sg3_utils-1.49 era, April 2026, on the SG_DD(8) page ๐โจ
๐ฆ where this page comes from
- arch rolling: sg3_utils 1.49-1 ยท GPL-2.0-or-later AND BSD-2-Clause
- nixpkgs unstable: sg3_utils 1.49
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms