Linux下常用的dd命令

2015/8/28 posted in  Linux

今天在微博看到了关于服务器硬盘负载的测试(原文见:使用 dd 命令进行硬盘 I/O 性能检测),前一段时间在搭建Minecraft服务器,我就经常怀疑IO爆表,但是内存可以用free,CPU和内存可以用top,可IO怎么查,我怎么知道这台服务器到底是哪里爆表了。 文章里提出用dd进行硬盘写入操作,通过写入情况分析现在负载到了一个什么程度。

但是,我并不太敢认可这种做法,这种做法就像判断瓶子满没满,再向里面注入写就知道了。但我目前并没有其他能看出磁盘当前性能的办法,暂且认可。因为如果瓶子已经满了,这些注入岂不是又增加负担。 也许我的担忧是在我无法负担更好的VPS的基础上的吧,就像好多朋友已经现在游戏服务器上玩的happy,我想看下服务器IO当前性能,结果一个dd就把服务器搞崩了,全线玩家集体掉线,也是挺无语。

继续说dd命令,之前看过一篇关于介绍新手级命令的文章(原文见:对 Linux 新手有用的 20 个命令),因为已经接触linux有一段时间了,几乎对这些命令用了不知多少遍了,唯独dd,之前就用过一次,就是帮同学写镜像,好像还写砸了。 dd的作用事把指定的输入文件拷贝到指定的输出文件中,并且在拷贝的过程中可以进行格式转换。现在就说下dd的常用用法。 先说下dd的语法和参数:

  • if =输入文件(或设备名称)。
  • of =输出文件(或设备名称)。
  • ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。
  • skip = blocks 跳过读入缓冲区开头的ibs*blocks块。
  • obs = bytes 一次写入bytes字节,即写 入缓冲区的字节数。
  • bs = bytes 同时设置读/写缓冲区的字节数(等于设置obs和obs)。
  • cbs = bytes 一次转换bytes字节。
  • count = blocks 只拷贝输入的blocks块。
  • conv = ASCII 把EBCDIC码转换为ASCII码。
  • conv = ebcdic 把ASCII码转换为EBCDIC码。
  • conv = ibm 把ASCII码转换为alternate EBCDIC码。
  • conv = blick 把变动位转换成固定字符。
  • conv = ublock 把固定们转换成变动位
  • conv = ucase 把字母由小写变为大写。
  • conv = lcase 把字母由大写变为小写。
  • conv = notrunc 不截短输出文件。
  • conv = swab 交换每一对输入字节。
  • conv = noerror 出错时不停止处理。
  • conv = sync 把每个输入记录的大小都调到ibs的大小(用ibs填充)。

1.对硬盘(西数黑盘)进行测试:

hypo@Hypo-TP:~$ dd if=/dev/zero of=test.img bs=512M count=4 oflag=dsync
记录了4+0 的读入
记录了4+0 的写出
2147483648字节(2.1 GB)已复制,19.7395 秒,109 MB/秒
hypo@Hypo-TP:~$ dd if=/dev/zero of=test.img bs=1G count=1 oflag=dsync
记录了1+0 的读入
记录了1+0 的写出
1073741824字节(1.1 GB)已复制,9.12763 秒,118 MB/秒

可以看到写入延时和写入速度。 其中/dev/zero事unix和linux下设计的白洞,可以源源不断的提供null字节,而也有一个unix和Linux的黑洞,那就是/dev/null。 2.写iso镜像:

sudo dd if=archlinux-2015.03.01-dual.iso of=/dev/sdd && sync
记录了1218560+0 的读入
记录了1218560+0 的写出
623902720字节(624 MB)已复制,0.910181 秒,685 MB/秒

3.备份整个磁盘,比如:

dd if=/home of=home.img bs=4M

4.备份MBR 备份: 备份磁盘开始的512Byte大小的MBR信息到指定文件:

dd if=/dev/hdx of=/path/to/image count=1 bs=512

恢复: 将备份的MBR信息写到磁盘开始部分:

dd if=/path/to/image of=/dev/hdx

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

dd if=/dev/sda of=/dev/sda

6.销毁磁盘数据 利用随机的数据填充硬盘:

dd if=/dev/urandom of=/dev/hda1

在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/hda1将无法挂载,创建和拷贝操作无法执行。