dd

最後更新: 2019-11-13

 

目錄

  • gzip dd disk image
  • dd with "0" or "ff"
  • Options - bs
  • bs & count Q&A
  • skip & seek & bs
  • Create urandom file
  • 修改 hex file 的某 location
  • 知到要做幾耐(status=progress)
  • 查看 dd 的 status
  • Window 上的 dd
  • IO Sync: direct, dsync, sync
  • Disk IO Test
  • dcfldd

 


gzip dd disk image

 

dd if=/dev/sda1 | gzip > /mnt/backup/sda1.img.gz

 


dd with "0" or "ff"

 

dd if=/dev/zero of=00.bin

dd if=/dev/zero | tr "\000" "\377" > ff.bin

 


Options - bs

 

read and write up to BYTES bytes at a time

# Unit

Default: bs=BYTES

K, M, G         = 1024

kB, MB, GB    = 1000

Speed test with different bs

# Default Setting: 94 MiB/s

dd if=/dev/sda | pv -i 3 > /dev/null

# 8M: 99 MiB/s

dd bs=8M if=/dev/sda | pv -i 3 > /dev/null

# 32M: 98 MiB/s

dd bs=32M if=/dev/sda | pv -i 3 > /dev/null

結論: bs 先速度沒有關係

 


bs & count Q&A

 

請問大家, 以下兩條指令的結果是不是一樣的呢 ??

# cmd_1

dd if=/dev/zero of=~/myfile1 bs=8 count=8

# cmd_2

dd if=/dev/zero of=~/myfile2 bs=64 count=1

相信大家都會答 "是的"

因為它都是會產生一個大小為 64 byte 的 myfile

那我又問, 以下兩指令的結果是不是一樣的呢 ??

# cmd_3

dd if=/dev/random of=~/myfile1 bs=8 count=8

# cmd_4

dd if=/dev/random of=~/myfile2 bs=32 count=2

答案 :

有機會一樣, 亦可能不一樣 = , =", 原因 ??

因為 /dev/random 的 output 是不保證足 64 byte, 所以就有 urandom 了

 


skip & seek & bs

 

skip=N       # Skip N ibs-sized blocks at start of input

seek=N      # Skip N obs-sized blocks at start of output

bs=BYTES  # 同時設定了 obs-size 及 ibs-size (default: 512)
                 # read and write up to BYTES bytes at a time

e.g.

應用1: dd 到一半要 stop 了, 查看 dd 到那裡

dd if=/dev/zero of=/dev/sdX bs=16M

kill -USR1 $(pgrep ^dd)

65743+0 records in
65743+0 records out
1102984511488 bytes (1.1 TB, 1.0 TiB) copied, 4964.41 s, 222 MB/s

# 再開始

1102984511488 / 65743 = 16M    # bs size

dd if=/dev/zero of=/dev/sdX bs=16M seek=65743

 


Create urandom file

 

dd if=/dev/urandom of=sample.txt bs=128M count=1

 


以 hex 修改 Binary file 的某位置

 

建立被修改的 test 檔

echo -n 0123456789 > test.txt

修改位置 0x8 的 1 byte

# 用 bs 及 count 去限制影響 (bs = read and write) !!

# bs=1 count=1 => 1 byte

# conv=notrunc => Do not truncate the output file (必須!!), 否則 x08 後的內容會被清空

# seek=8          => 跳過頭 8 個, 修改第 9 個, 由於由 0x00 計起, 所以修改緊 x08

dd if=/dev/urandom of=test.txt bs=1 count=1 conv=notrunc seek=8

查看結果

# 由於是用 urandom 做 source, 有機會係 non-printable 字, 所以要用 xxd / hexdump

xxd test.txt

00000000: 3031 3233 3435 3637 4c39                 01234567L9

當寫的位置比 file size 大時 ( ie. 16 )

echo -n 0123456789 > test.txt

dd if=/dev/urandom of=test.txt bs=1 count=1 conv=notrunc seek=16

xxd test.txt

00000000: 3031 3233 3435 3637 3839 0000 0000 0000  0123456789......
00000010: cf                                       .

當 "bs=x" 時

echo -n 0123456789 > test.txt

dd if=/dev/urandom of=test.txt bs=2 count=1 conv=notrunc seek=2

xxd test.txt

00000000: 3031 3233 a16b 3637 3839                 0123.k6789

修改成指定字符

# \x2a => "*"          # "2a" 係 "*" 的 Hex 值. A = \x41, a = \x61, 0 = \x30

echo -n 0123456789 > test.txt

printf '\x2a\x2a\x2a' | dd of=test.txt bs=1 count=1 seek=4 conv=notrunc

cat test.txt

# 跳過了頭 4 個
0123*56789

 


知到要做幾耐(status=progress)

 

# visual size/percentage progress indicator

status=LEVEL

  • 'none' suppresses everything but error messages,
  • 'noxfer' suppresses the final transfer statistics,
  • 'progress' shows periodic transfer statistics

i.e.

dd status=progress if=/dev/mapper/centos-root of=/dev/null

715182592 bytes (715 MB) copied, 3.006233 s, 238 MB/s

 


查看 dd 的 status

 

[Terminal 1]

dd if=/dev/mapper/centos-root of=/dev/null

[Terminal 2]

kill -USR1 $(pgrep ^dd)

[Terminal 1]

2310657+0 records in
2310657+0 records out
1183056384 bytes (1.2 GB) copied, 1.81717 s, 651 MB/s

 


Window 上的 dd

 

Home Page: http://www.chrysocome.net/dd

# Go to un-zip folder

cd C:\dd-0.5>

# 查看本機上的 Disk

dd --list

\\.\Volume{a4942ba8-deae-11e6-b2c7-e0cb4eeccb4b}\
  link to \\?\Device\HarddiskVolume7
  removeable media
  Mounted on \\.\e:

\\.\Volume{2c9987c2-cf93-11e3-b215-806e6f6e6963}\
  link to \\?\Device\CdRom0
  CD-ROM
  Mounted on \\.\o:

Virtual input devices
 /dev/zero   (null data)
 /dev/random (pseudo-random data)
 -           (standard input)

Virtual output devices
 -           (standard output)

 * dd 只對有 "Mounted on \\.\N:" 的地方作操作

# Clone (Partition0 --> DuinOS.img)

dd of=\\?\Device\Harddisk1\Partition0 if=c:\DuinOS.img bs=1M

# IO test

# wirte

ddrelease64.exe if=/dev/zero of=test.bin bs=1M count=10240 --progress

# read

ddrelease64.exe if=test.bin of=/dev/null bs=1M count=10240 --progress

 * 只能對 Partition 作操作

 


dcfldd

 

Enhanced version of dd for forensics and security

HomePage: http://dcfldd.sourceforge.net/

  • Hashing on-the-fly
    dcfldd can hash the input data as it is being transferred, helping to ensure data integrity.
  • Status output
    dcfldd can update the user of its progress in terms of the amount of data transferred and how much longer operation will take.
  • Flexible disk wipes
    dcfldd can be used to wipe disks quickly and with a known pattern if desired.
  • Image/wipe Verify
    dcfldd can verify that a target drive is a bit-for-bit match of the specified input file or pattern.

 


IO Sync: direct, dsync, sync

 

說明

direct (use direct I/O for data)

Direct I/O open mode O_DIRECT
= bypass kernel page cache
= no extra copies from userland to the kernel
=>  userland buffer -> Disk
=> saving the kernel work
     (no need to perform most buffer cache management operations)

 * 應用: applications do their own caching

 * Due to the lack of caching, sequential reads would have a heavier impact.

 * doesn't guarantee that data of a successful write() call will survive sudden power loss.
    "O_SYNC" 才有此功能

dsync (use synchronized I/O for data)

sync (likewise, but also for metadata)

direct 與 dsync/sync 的分別

dsync/sync 是一次寫一個 bs 大小的資料, 之後同步寫到磁碟後再繼續寫下一個 IO

 => This bypasses all caches including the hardware cache on the drive itself.

Usage

iflag=direct         # this bypasses kernel caching and substantially increases performance.

 


Disk IO Test

 

寫入 HDD

cd /ssd                                              # 去要 test 的 device

dd if=/dev/zero of=test.bin bs=1G count=50G oflag=direct

oflag=dsync    # direct: use direct I/O for data
                     # dsync: use synchronized I/O for data

查看情況

# dstat - versatile tool for generating system resource statistics

dstat -d -r -D sde

--dsk/sde-- ---io/sde--
 read  writ| read  writ
   7B  178k|0.00  0.61
   0   188M|   0   655
   0   177M|   0   622
   0   183M|   0   640
...

 


More

 

 

 

Creative Commons license icon Creative Commons license icon