dd
命令在 Linux 系统中用来拷贝和转换文件。我用这个命令最多的场景是把各种 Linux 系统的安装映像(ISO)文件写入 U 盘,制作成系统安装启动盘。
虽然是拷贝文件的命令,但和有类似功能的 cp
命令还是存在一些区别。比如:
cp
命令只能操作文件或目录,但dd
命令可以直接操作存储设备。cp
同时可以拷贝多个文件或文件夹,但dd
命令一次只能操作一个文件对象。cp
命令以字节为单位读取文件,dd
命令以「块」为单位读取文件。
这些本质上的区别也让两者的用途截然不同。关于这一点可以通过参考下面的命令示例部分来体验这种差异。
dd 命令格式
dd [选项...]
dd 命令示例
完整备份磁盘 /dev/sda 到 /dev/sdb 上:
dd if=/dev/hda of=/dev/hdb
使用同步方式备份磁盘,并忽略读取错误:
dd if=/dev/hda of=/dev/hdb conv=noerror,sync
备份指定磁盘分区到自定义的映像文件:
dd if=/dev/hda1 of=~/hda1.img
之后还可以把这个映像文件还原到分区。操作方法是把输入和输出的选项值调换一下:
dd if=~/hda1.img of=/dev/hda1
测试磁盘的写入速度:
dd if=/dev/zero bs=1024 count=1000000 of=~/1Gb.file
还有我在开头说的制作 Linux 启动盘:
dd if=~/Downloads/debian-11.3.0-amd64-netinst.iso of=/dev/sdb
dd 命令选项
名称 | 说明 |
---|---|
if= file |
从 file 中读而不是标准输入。 |
of= file |
写到 file 里去而不是标准输出。除非指定 conv=notrunc ,否则, dd 将把 file 截为 O字节(或由 seek= 选项指定的大小)。 |
ibs= bytes |
一次读 bytes 字节。默认是 512。 |
obs= bytes |
一次写 bytes 字节。默认是 512。 |
bs= bytes |
一次读和写 bytes 字节。这将覆盖 ibs 和 obs 设定的值(并且,设定 bs 不等于同时将 ibs 和 obs 设为同一个值,至少在只使用 sync , noerror 或 notrunc 转换时是这样的。因为bs 规定,每个输入块都应作为单独的数据块拷贝到输出,而不把较短的块组合到一起)。 |
cbs= bytes |
为 block 转换和 unblock 转换指定转换块的大小。 |
skip= blocks |
在拷贝之前,跳过输入文件的前 blocks 块,每块大小为 ibs-byte 字节。 |
seek= blocks |
在拷贝之前,跳过输出文件的前 blocks 块,每块大小为 obs-byte 字节。 |
count= blocks |
只拷贝输入文件的前 blocks 块(每块的大小为 ibs-byte 字节),而不是全部内容,直到文件末尾。 |
conv= 转换"[,"转换"]..." |
将文件按「转换」参数指定的方式转换(在“,”两边没有空格)。可用的转换参数见下方的转换方式表格。 |
数字值选项(以字节或块为单位)后面可以跟一个乘数,例如:k=1024
,b=512
,w=2
,c=1
。最好别使用 w
,因为在 system V 中,它表示 2,在 4.2 BSD 中,它表示 4。
两个或更多的数值表达式可以通过 x
乘起来。GEU fileutils 4.0 允许在数据块大小的叙述中使用下列乘法后缀(用 bs=
,cbs=
,obs=
):M=1048576,G=1073741824,同理可得 T
,P
,E
,Z
,Y
。D
后缀表示数值是以十进制表示的:kD=1000,MD=1000000,GD=1000000000 等等。
需要注意的是,在 ls
、df
、du
命令中,M
等标记的大小是由环境变量确定的,而在 dd
命令中,它的值是固定的。
conv=
选项支持的转换方式
名称 | 说明 |
---|---|
ascii |
将 EBCDIC 转换成 ascii。 |
ebcdic |
将 ascii 转换成 ebcdic。 |
ibm |
将 ascii 转换成 alternative ebcdic。 |
block |
每一行输入,无论长短,输出都是 cbs 字节,并且其中的“换行”(NEWLINE,即 c 中的 0)用空格替换。如有必要,行尾会填充空格。 |
unblock |
用“换行”替换每个输入块(cbs 字节大小)末尾的空格。 |
lcase |
将大写字母转换成小写。 |
ucase |
将小写字母转换成大写。 |
swab |
交换每对输入字节。如果读入的字节数是奇数,最后一个字节只是简单的复制到输出(因为没有能跟它交换的字节了)。 |
noerror |
发生读错误时,继续进行。 |
notrunc |
不截断输出文件。 |
sync |
用 0 填充到每个输入块的末尾,使其大小为 ibs 字节。 |