2018年3月20日星期二

dd命令用法详解

一.dd命令用法

dd的作用是拷贝文件,从指定的来源,指定的方式进行文件创建、拷贝,过程中可以进行各种转换。
dd可以很方便的验证各种IO表现,还可以用来进行整个盘/文件的复制。
dd的拷贝方式是数据块block级别的, 忽略文件系统类型和操作系统。



介绍下主要选项:

  • bs=BYTES 一次读写BYTES个字节。是指定了block大小,默认512字节,跟扇区大小一致。
    • 包括ibs/obs
  • cbs=BYTES 一次转换BYTES个字节
  • ibs=BYTES 一次读取的字节数,默认为512
  • if=FILE 读取FILE而不是标准输入
  • iflag=FLAGS  指定读取的方法
  • obs=BYTES  一些写入BYTES个字节,默认512
  • of=FILE 写入FILE而不是标准输出
  • oflag=FLAGS  指定写入的方法
  • conv=CONVS  指定转换标记,多个用逗号分隔
  • count=N 只拷贝N个输入block
  • seek=BLOCKS
    • 针对输出,跳过BLOCKS个obs大小的block
    • 通常只用当输出文件是磁盘或磁带时才有效,即备份到磁盘或磁带时才有效。
  • skip=BLOCKS
    • 针对输入,跳过BLOCKS个ibs大小的block
  • status=LEVEL 输出到标准错误输出stderr的信息LEVEL
    • progress 显示阶段性的传输统计,便于评估进度
CONVS可取值如下,多个用逗号分隔:
  • ascii  编码EBCDIC转换为ASCII
  • ebcdic  编码ASCII转换为EBCDIC

  • ibm   编码ASCII转换为另一种EBCDIC
  • block   把每一行转换为长度为cbs,不足部分用空格填充
  • unblock
  • lcase  大写改成小写
  • ucase 小写改成大写
  • sparse  
  • swab 交换出输入的字节
  • sync  如果遇到读取的错误,则使用NULL填充输入的block,这样能保证数据的偏移量一致。
  • excl   如果输出文件已经存在则报错
  • nocreat  不创建文件
  • notrunc  不截断文件
  • fdatasync
  • fsync
  • noerror   表示读处理过程中忽略所有错误。不指定,默认表现为遇到错误就退出 
FLAG标记取值如下,多个用逗号分隔:
  • append 追加模式,只针对输出,应该与conv=notrunc合用
  • direct 使用direct IO
  • directory  除非是目录,否则报错
  • dsync 使用同步IO
  • sync   使用同步IO,包括元数据meta
  • fullblock  只针对iflag,累计所有block
  • nonblock  使用非阻塞IO
  • noatime   不更新文件的access time信息
  • nocache  忽略缓存中的数据
  • noctty   不给文件分配控制终端
  • symlinks  不跟踪软链接
  • count_bytes 只针对iflag,认为count=N为指定字节数目
  • skip_bytes 只针对iflag,认为skip=N为指定字节数目
  • seek_bytes 只针对oflag,认为seek=N为指定字节数目

二.用法示例

1)克隆一个设备,注意会包括启动扇区,所有分区,UUID和数据等。
# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync status=progress
2)备份硬盘/dev/sdX,并恢复至外挂其他硬盘/dev/sdY
a) 确保没有在使用
b) Mount
c) 备份
考虑避免过大单文件
# dd if=/dev/sdX conv=sync,noerror bs=64K | gzip -c | split -a3 -b2G - /path/to/backup.img.gz 
考虑直接传到远程主机
# dd if=/dev/sdX conv=sync,noerror bs=64K | gzip -c | ssh user@remotehost dd of=backup.img.gz 
备份额外的原硬盘分区表等信息
# fdisk -l /dev/sdX > /path/to/list_fdisk.info
d) 恢复
# gunzip -c /path/to/backup.img.gz | dd of=/dev/sdY
如果是已经分隔的文件,则如下方式解压
# cat /path/to/backup.img.gz* | gunzip -c | dd of=/dev/sdY
 3)备份与恢复MBR
备份磁盘开始的512个字节大小的MBR信息到指定文件:
# dd if=/dev/hda of=/root/image count=1 bs=512

恢复:
# dd if=/root/image of=/dev/had
将备份的MBR信息写到磁盘开始部分

4)增加swap分区文件大小
增加swap分区文件大小
a) 创建一个大小为256M的文件:
# dd if=/dev/zero of=/swapfile bs=1024 count=262144
b) 把这个文件变成swap文件:
# mkswap /swapfile
c) 启用这个swap文件:
# swapon /swapfile
d) 编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile    swap    swap    default   0 0
5)确定硬盘的最佳块大小
# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
# dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
# dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
# dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。

6)修复硬盘
# dd if=/dev/sda of=/dev/sda 或dd if=/dev/hda of=/dev/hda
当硬盘较长时间(一年以上)放置不使用后,磁盘上会产生magnetic flux point,当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数 据起死回生。并且这个过程是安全、高效的。

7)将一个大视频文件的第i个字节的值改成0x41(大写字母A的ASCII值)
# echo A | dd of=bigfile seek=$i bs=1 count=1 conv=notrunc
8)io测试1:direct io写文件,测试不刷cache的表现
dd if=/dev/zero of=./big_file bs=100M count=400 oflag=direct 
9)io测试2:第二个测试,采用cache io方式做本地写入测试
dd if=/dev/zero of=./big_file bs=100M count=300

10)转换大小写
# cat > abc
sif928j984fSOf9hf2s
sajdflk S02hSnkUUNG
# dd if=abc of=abc2  conv=ucase
0+1 records in
0+1 records out
40 bytes (40 B) copied, 0.000209984 s, 190 kB/s
# cat abc2
SIF928J984FSOF9HF2S
SAJDFLK S02HSNKUUNG 

三.其他 

/dev/null 表示一个"黑洞",如同一个只写的文件,任何写入都会丢弃,往往用于屏蔽一些无用输出,如:
# find / -name mytest  2>/dev/null
这样遇到错误如权限不足等,都直接丢弃,不会忽略打印影响交互。

/dev/zero 是一个输入设备,可以用来初始化文件,其提供无穷无尽的null(二进制的零流,而不是ASCII型的0)
# dd if=/dev/zero of=mytest.log bz=10 count=1

参考

https://wiki.archlinux.org/index.php/disk_cloning
https://www.cnblogs.com/jikexianfeng/p/6103500.html

没有评论:

发表评论