dd命令的作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。可以用于测试磁盘命令、数据备份或恢复等

dd 命令格式如下:

dd [bs=<字节数>][cbs=<字节数>][conv=<关键字>][count=<区块数>][ibs=<字节数>][if=<文件>][obs=<字节数>][of=<文件>][seek=<区块数>][skip=<区块数>][--help][--version]

dd if=path/to/input_file of=/path/to/output_file bs=block_size count=number_of_blocks
  • if=file         输入文件名,缺省为标准输入。 从file读取,如if=/dev/zero,该设备无穷尽地提供0,(不产生读磁盘IO)
  • of=file         输出文件名,缺省为标准输出。 向file写出,可以写文件,可以写裸设备。如of=/dev/null,"黑洞",它等价于一个只写文件. 所有写入它的内容都会永远丢失. (不产生写磁盘IO)
  • ibs=bytes        一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。
  • obs=bytes        一次写 bytes 个字节(即一个块大小为 bytes 个字节)。
  • bs=bytes        同时设置读写块的大小为 bytes ,可代替 ibs 和 obs。如bs=8k 每次读或写的大小,即一个块的大小为8K。
  • cbs=bytes        一次转换 bytes 个字节,即转换缓冲区大小。
  • skip=blocks      从输入文件开头跳过 blocks 个块后再开始复制。
  • seek=blocks   从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)。
  • count=blocks     仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。
  • iflag=FLAGS      指定读的方式FLAGS,参见“FLAGS参数说明”
  • oflag=FLAGS      指定写的方式FLAGS,参见“FLAGS参数说明”
测试方式:使用dd指令,对磁盘进行连续写入,不使用内存缓冲区,每次写入8k的数据,总共写入20万次,产生1.6G大小的文件。
测试指令:dd if=/dev/zero of=/data01/test.dbf bs=8k count=200k conv=fdatasync
  1. dd用于复制,从if读出,写到of;
  2. if=/dev/zero(产生字符)不产生IO,因此可以用来测试纯写速度;
  3. bs是每次读或写的大小,即一个块的大小,count是读写块的数量;
  4. conv=fdatasync表示只把文件的“数据”写入磁盘
  5. 会在/data01下生成一个文件test.dbf,count * bs 等于最终大小,记得删除。

从源 /dev/zero 读取写入到驱动盘的时候(测试写),当从驱动盘读取时写入到/dev/null(测试读)。在整个操作过程中, DD 命令会跟踪数据传输的速度并且报告出结果。

/dev/null和/dev/zero的区别

  • /dev/null,它是空设备,也称为位桶(bit bucket)、回收站、无底洞,可以向它输出任何数据。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。
  • /dev/zero,是一个输入设备,可用它来初始化文件。该设备无穷尽地提供0,可以使用任何需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。

使用sync、fsync、fdatasync、dsync

  • conv=fsync,表示把文件的“数据”和“metadata”都写入磁盘(metadata包括size、访问时间st_atime & st_mtime等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作,fsync 与fdatasync相差不大。
  • conv=fdatasync,dd命令执行到最后会真正执行一次“同步(sync)”操作,,这样算出来的时间才是比较符合实际使用结果的。conv=fdatasync表示只把文件的“数据”写入磁盘,fsync 与fdatasync相差不大。
  • oflag=dsync,dd在执行时每次都会进行同步写入操作。每次读取8k后就要先把这8k写入磁盘,然后再读取下面一个8k,一共重复4K次,生成一个32M文件。这是最慢的一种方式了,基本上没有用到写缓存(write cache)。也是比较准确的。
    conv=fdatasync与oflag=dsync的区别在于:sync函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。fsync函数只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。所以看到的fdatasync速度比dsync好。
  • 如果不加任何参数,dd默认的方式不包括“同步(sync)”命令(没加关于操作系统“写缓存”的参数,默认“写缓存”启作用),也就是说,dd命令完成前并没有让系统真正把文件写到磁盘上。dd先把数据写到操作系统“写缓存”,就完成了写操作。所以以上命令只是单纯地把数据读到内存缓冲当中(写缓存[write cache])。通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数,把“写缓存”中的数据刷入磁盘。