Linux dd 命令
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