dd命令详解--磁盘读写测试

有时候需要测试磁盘读写速度,或者临时读写文件,不想临时写代码?有没有测试使用的命令?当然有!

dd命令

dd命令可以用于文件的拷贝或者内容转换。常见操作选项如下:

  • bs=BYTES 一次读写字节数
  • ibs=BYTES 一次读的字节数
  • obs=BYTES 一次写的字节数
  • cbs=BYTES 一次转换的字节数
  • count=N 读写次数
  • of=FILE 将内容写到FILE,默认写入标准输出
  • if=FILE 从FILE中读取,默认从标准输入读取
  • conv=CONVS 转换标志

更多选项可查看man手册。

来看一些实例。

将文件的内容进行大小写转换

加入文件test.txt中有以下内容:

1
shouwangxiansheng

现在要将内容转换为大写:

1
2
3
4
$ dd if=test.txt of=utest.txt conv=ucase
0+1 records in
0+1 records out
18 bytes copied, 0.0123523 s, 1.5 kB/s

执行完成后,再看看utest.txt中的内容:

1
SHOUWANGXIANSHEN

看到没,已经将所有内容转换为大写了。
当然还有其他方法:

1
$ cat test.txt | tr 'a-z' 'A-Z' > utest.txt

解释一下,conv=ucase,表示转换操作是转换为大写,你还可以使用:

  • lcase 转换为小写
  • ucase 转换为大写
  • swab 相邻字节交换

拷贝文件

例如将test.txt文件内容拷贝到test0.txt文件,每次拷贝1024字节:

1
$ dd if=test.txt of=test0.txt bs=1024

读取指定次数:

1
$ dd if=a of=b bs=1024 count=10 #读取10次

跳过指定块大小开始读取:
假设ibs=1,那么,每次读取1字节,而skip=4,则会从第五个字节开始读取:

1
dd if=test.txt of=test0.txt ibs=1 skip=4

得到内容:

1
2
$cat test0.txt
wangxiansheng

那如果要从指定位置开始写呢?

1
dd if=test.txt of=test0.txt obs=1 seek=5

这些写入的内容就会从test0.txt的第六个字节开始写,而会保留前面的5个字节。

注意,由于这里我设置了ibs或者obs为1,所以skip和seek的单位都是字节,但是如果前面设置的是如1M,那么跳过的就是N兆了。

生成随机文件

还记得在《Linux字符设备文件》中提到的特殊字符文件吗?结合dd命令,我们可以生成一些随机内容的文件。

1
$ dd if=/dev/urandom of=temp.txt count=2

执行之后就会读取2个块大小的数据到temp.txt中。

磁盘读写测试

由于dd命令每次执行完成后都会显示其速度,因此可以利用它来测试当前的磁盘读写情况。
这里还有一个选项oflag=FLAGS用来设置一些读写方式,FLAG常见选项有:

  • direct 使用直接IO
  • nonblock 使用非阻塞IO
  • noatime 不更新访问时间
  • nocache 丢弃缓存
  • sync 读写一次就写到磁盘
  • fsync 最后要写到磁盘
1
2
3
4
$ dd if=/dev/urandom of=testfile count=100 oflag=sync
100+0 records in
100+0 records out
51200 bytes (51 kB, 50 KiB) copied, 0.0011526 s, 44.4 MB/s

总结

dd命令可用于文件拷贝,文件内容大小写转换,磁盘读写测试等。

守望 wechat
关注公众号[编程珠玑]获取更多原创技术文章
出入相友,守望相助!