功能强大的命令dd

作者:张志强 发布于:2013-7-9 21:03 Tuesday 分类:Linux学习笔记

1. dd 的主要选项

1.1. 说明

  • 指定数字的地方若以下列字符结尾, 则乘以相应的数字:
    • b=512, c=1, k=1024, w=2, xm=number m

1.2. 选项

  • if=file
    • 输入文件名,缺省为标准输入。
  • of=file
    • 输出文件名,缺省为标准输出。
  • ibs=bytes
    • 一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。
  • obs=bytes
    • 一次写 bytes 个字节(即一个块大小为 bytes 个字节)。
  • bs=bytes
    • 同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。
  • cbs=bytes
    • 一次转换 bytes 个字节,即转换缓冲区大小。
  • skip=blocks
    • 从输入文件开头跳过 blocks 个块后再开始复制。
  • seek=blocks
    • 从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。
  • count=blocks
    • 仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
  • conv=conversion[,conversion...]
    • 用指定的参数转换文件。
    • 转换参数:
      • ascii 转换 EBCDIC 为 ASCII。
      • ebcdic 转换 ASCII 为 EBCDIC。
      • ibm 转换 ASCII 为 alternate EBCDIC.
      • block 把每一行转换为长度为 cbs 的记录,不足部分用空格填充。
      • unblock 使每一行的长度都为 cbs ,不足部分用空格填充。
      • lcase 把大写字符转换为小写字符。
      • ucase 把小写字符转换为大写字符。
      • swab 交换输入的每对字节。
      • noerror 出错时不停止。
      • notrunc 不截短输出文件。
      • sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
  • 总结, 通过以上的说明可以看到,参数主要分为以下几个部分:
    • 指定输入和输出: if, of
    • 指定一个块的大小, 可以用 ibs, obs, bs, cbs这几个参数
    • 指定动作及操作的块数: skip, seek, count, 具体的大小就是上一个参数指定的块大小和本参数指定的块数的乘积.
    • 此条与上一条并列:指定转换几转换参数 conv

使用举例:高通平台,读取emmc最后的backup gpt 的方法如下:
if=/dev/block/mmcblk0 of=/system/gpt skip=61071327 count=33 

2. 实例分析

2.1. 数据备份与恢复

2.1.1. 整盘数据备份与恢复

  • 备份
    • dd if=/dev/hdx of=/dev/hdy
      • 将本地的/dev/hdx整盘备份到/dev/hdy
    • dd if=/dev/hdx of=/path/to/image
      • 将/dev/hdx全盘数据备份到指定路径的image文件
    • dd if=/dev/hdx | gzip >/path/to/image.gz
      • 备份/dev/hdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
  • 恢复
    • dd if=/path/to/image of=/dev/hdx
      • 将备份文件恢复到指定盘
    • gzip -dc /path/to/image.gz | dd of=/dev/hdx
      • 将压缩的备份文件恢复到指定盘

2.1.2. 利用netcat远程备份

  • dd if=/dev/hda bs=16065b | netcat < targethost-IP > 1234
    • 在源主机上执行此命令备份/dev/hda
  • netcat -l -p 1234 | dd of=/dev/hdc bs=16065b
    • 在目的主机上执行此命令来接收数据并写入/dev/hdc
  • netcat -l -p 1234 | bzip2 > partition.img
  • netcat -l -p 1234 | gzip > partition.img
    • 以上两条指令是目的主机指令的变化分别采用bzip2 gzip对数据进行压缩,并将备份文件保存在当前目录。

2.1.3. 备份MBR

  • 备份
    • dd if=/dev/hdx of=/path/to/image count=1 bs=512
      • 备份磁盘开始的512Byte大小的MBR信息到指定文件
  • 恢复
    • dd if=/path/to/image of=/dev/hdx
      • 将备份的MBR信息写到磁盘开始部分

2.1.4. 备份软盘

  • dd if=/dev/fd0 of=disk.img count=1 bs=1440k
    • 将软驱数据备份到当前目录的disk.img文件

2.1.5. 拷贝内存资料到硬盘

  • dd if=/dev/mem of=/root/mem.bin bs=1024
    • 将内存里的数据拷贝到root目录下的mem.bin文件

2.1.6. 从光盘拷贝iso镜像

  • dd if=/dev/cdrom of=/root/cd.iso
    • 拷贝光盘数据到root文件夹下,并保存为cd.iso文件

2.2. 增加Swap分区文件大小

  • dd if=/dev/zero of=/swapfile bs=1024 count=262144
    • 创建一个足够大的文件(此处为256M)
  • mkswap /swapfile
    • 把这个文件变成swap文件
  • swapon /swapfile
    • 启用这个swap文件
  • /swapfile swap swap defaults 0 0
    • 在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行

2.3. 销毁磁盘数据

  • dd if=/dev/urandom of=/dev/hda1
    • 利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。

2.4. 磁盘管理

2.4.1. 得到最恰当的block size

  • 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
    • 通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小

2.4.2. 测试硬盘读写速度

  • dd if=/root/1Gb.file bs=64k | dd of=/dev/null
  • dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
    • 通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度

2.4.3. 修复硬盘

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

2.5. 怎样对一个大文件的某个字节进行直接修改

  • 在ChinaUnix上看到一个帖子:http://bbs2.chinaunix.net/viewthread.php?tid=1469980&extra=&page=1
  • 比如我想把一个很大的视频文件中的第i个字节的值改成0x41(也就是大写字母A的ASCII值),不用C的话,有没有现成的工具可以用啊?
  • 实现:echo A | dd of=bigfile seek=$i bs=1 count=1 conv=notrunc

3. 系统提供的特殊输入输出

  • 以上的例子中涉及到以下三个输入输出
    • /dev/zero
    • /dev/urandom
    • /dev/null
  • /dev/zero/
    • 是一个输入设备,你可你用它来初始化文件。
    • 该设备无穷尽地提供0,可以使用任何你需要的数目--设备提供的要多的多。他可以用于向设备或文件写入字符串0。
  • /dev/urandom
    • 如上面的例子,该输出提供随机数. 可以用来销毁磁盘上的数据, 清除作案痕迹, 哈哈~~
  • /dev/null
    • 外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
    • 它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
    • 把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到.
    • /dev/null对命令行和脚本都非常的有用

本文出自 张志强的博客,转载时请注明出处及相应链接。


正确用DD测试磁盘读写速度


from : http://blog.csdn.net/xrb66/article/details/7180919


问: 以下几种方式测试磁盘读写速度有什么区别?

1
2
3
4

dd bs=1M count=128 if=/dev/zero of=test 
dd bs=1M count=128 if=/dev/zero of=testsync 
dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync
dd bs=1M count=128 if=/dev/zero of=test oflag=dsync

答:区别在于内存中写缓存的处理方式。
1.

dd bs=1M count=128 if=/dev/zero of=test

没有加任何参数,dd默认的方式不包括“同步(sync)”命令。也就是说,dd命令完成前并没有让系统真正把文件写到磁盘上。所以以上命令只是单纯地把这128MB的数据读到内存缓冲当中(写缓存[write cache])。所以你得到的将是一个超级快的速度。因为其实dd给你的只是读取速度,直到dd完成后系统才开始真正往磁盘上写数据,但这个速度你是看不到了。所以如果这个速度很快,先不要偷着乐。呵呵
2.

dd bs=1M count=128 if=/dev/zero of=testsync

和前面1中的完全一样。分号隔开的只是先后两个独立的命令。当sync命令准备开始往磁盘上真正写入数据的时候,前面dd命令已经把错误的“写入速度”值显示在屏幕上了。所以你还是得不到真正的写入速度。
3.

dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync

加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,所以这时候你得到的是读取这128M数据到内存并写入到磁盘上所需的时间,这样算出来的时间才是比较符合实际的。
4.

dd bs=1M count=128 if=/dev/zero of=test oflag=dsync

加入这个参数后,dd在执行时每次都会进行同步写入操作。也就是说,这条命令每次读取1M后就要先把这1M写入磁盘,然后再读取下面这1M,一共重复128次。这可能是最慢的一种方式了,因为基本上没有用到写缓存(write cache)。

问:那应该用哪一种呢?
答:建议使用

dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync

因为这种方式最接近计算机实际操作,所以测出来的数据最有参考价值。


你可能感兴趣的:(功能强大的命令dd)