Linux dd 命令

更多资料下载,冲击月薪过万,一线经验工程师录制, 干货满满的嵌入式视频教程,请点击淘宝店:wanglitao.taobao.com

Linux dd命令,用来读取一个文件,进行格式转换,然后再写入指定的目的文件。常用的格式如下:

dd if=input of=output bs=bytes count=blocks

其中,if 是要输入的源文件,of 是要输出的目标文件,这两个参数如果不指定,默认是标准输入、标准输出文件。bs是要读取的block size大小,单位是字节。dd是按块为单位进行读取的,如果需要拷贝多个块,可以通过count来指定,若不指定,默认读取整到文件末尾。
假如从一个源文件source.txt中读取13个字节,输出到目标文件obj.txt中,可以使用下面的命令:

# cat source.txt 
hello world 
hello zhaixue.cc
hello linux

# dd if=source.txt of=obj.txt bs=13 count=1
1+0 records in
1+0 records out
13 bytes copied, 0.00060529 s, 21.5 kB/s

# cat obj.txt 
hello world

通过结果可以看到:dd命令从source.txt文件中读取了 13个字节的数据,然后输出到了obj.txt文件中。如果当前目录下没有obj.txt文件,dd命令会自己创建这个文件。

如果想从文件某个指定位置读取文件,可以使用skip=blocks参数:

# dd if=source.txt of=obj.txt bs=13  skip=1 
2+1 records in
2+1 records out
29 bytes copied, 0.000605519 s, 47.9 kB/s

# cat obj.txt 
hello zhaixue.cc
hello linux

通过skip=1,就可以跳过source.txt文件中一个block(bs=13)的字节的位置,去读取数据。如果没有指定count,默认会读取到文件末尾。
同样的道理,如果你想将读取的数据,写入到目标文件的指定位置,可以通过 seek=count 参数:

# cat source.txt 
hello world 
hello zhaixue.cc
hello linux

# cat obj.txt 
aaaaaaaa

# dd if=source.txt of=obj.txt bs=13  skip=1 seek=1
2+1 records in
2+1 records out
29 bytes copied, 0.000538769 s, 53.8 kB/s

# cat obj.txt 
aaaaaaaa
hello zhaixue.cc
hello linux

通过 conv=<关键字> 参数,可以将读取的文本进行格式转换,比如将读取的文件转换为大写格式:

# cat source.txt 
hello world 
hello zhaixue.cc
hello linux

# dd if=source.txt of=obj.txt conv=ucase
0+1 records in
0+1 records out
42 bytes copied, 0.000206256 s, 204 kB/s

# cat obj.txt 
HELLO WORLD 
HELLO ZHAIXUE.CC
HELLO LINUX

其中,conv=ucase 参数用来将小写字符转换成大写字符。除此之外,还有其他参数可以使用:

  • ucase:把小写字符转换为大写字符
  • lcase:把大写字符转换为小写字符
  • unblock:使每一行的长度都为cbs,不足部分用空格填充
  • ascii:转换ebcdic为ascii
  • ebcdic:转换ascii为ebcdic
  • swap:交换输入的每对字节
  • noerror:出错时不停止
  • notrunc:覆盖文件时,只覆盖指定的地址和大小,其余地方不清空,正常显示

dd 命令更常用的场合,是用来创建磁盘文件,或者各种磁盘设备文件。
比如,测试磁盘的读写速度:

# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
# dd if=/root/1Gb.file bs=64k | dd of=/dev/null

dd 命令经常跟/dev/zero、/dev/null这些设备文件打交道,这些设备文件的功能如下:

  • /dev/zero:当你读它的时候,它会提供无限的空字符(NULL, 0x00),一般用来产生一个特定大小的空白文件。
  • /dev/null:可以看作是一个“黑洞”、“垃圾场文件”,等价于一个只写文件。写入的内容永远丢失,是读取不到的。
  • /dev/loop:一种特殊的伪设备文件,用来将文件系统映射到一个普通文件上,形成一个虚拟的块设备,可以让用户以块设备的方式来访问一个普通文件(比如磁盘镜像文件、ISO文件)。

使用dd命令和/dev/loop制作镜像文件示例

  • 创建和管理loop设备:在Linux中,可以使用losetup命令来创建和管理loop设备,通过losetup命令,可以将文件与loop设备进行绑定或解除绑定,并管理loop设备的属性。

  • 挂载和卸载文件系统:一旦文件与loop设备绑定,就可以像挂载其他块设备一样,使用mount命令将文件系统挂载到指定的挂载点上,也可以使用umount命令将文件系统卸载

  • 使用loop设备创建虚拟磁盘:通过loop设备,可以轻松地创建虚拟磁盘。用户可以创建一个空文件,然后将其与loop设备绑定,并在其上创建文件系统,从而形成一个虚拟磁盘,用于存储数据。

  • 挂载镜像文件:将镜像文件挂载到文件系统中。例如,可以将ISO镜像文件挂载到/dev/loop上,以便浏览其内容或执行其中的程序

  • 容器技术:创建容器的根文件系统,Docker等容器平台会使用loop设备来挂载容器镜像。

使用方法示例:
1.创建一个镜像空白普通文件

dd if=/dev/zero of=/var/loop.img bs=1M count=10240

2.将该文件转换为块设备

losetup /dev/loop0 /var/loop.img

3.查看创建的块设备

lsblk | grep loop0 losetup -a

4.挂载该设备到主机的某个目录

mkdir /home/tmp 
mount /dev/loop0 /home/tmp

5.操作虚拟磁盘文件

echo "hello world!" > /home/tmp/hello.txt

6.下载该虚拟磁盘

umount /home/tmp

7.删除该loop设备

losetup -d /dev/loop0
《Linux三剑客》视频教程,从零开始快速掌握Linux开发常用的工具:Git、Makefile、vim、autotools、debug,免费赠送C语言视频教程,C语言项目实战:学生成绩管理系统。详情请点击淘宝链接:Linux三剑客