zzxworld

Linux dd 命令使用指南

Linux dd 命令使用指南

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 字节。这将覆盖 ibsobs 设定的值(并且,设定 bs 不等于同时将 ibsobs 设为同一个值,至少在只使用 sync, noerrornotrunc 转换时是这样的。因为bs 规定,每个输入块都应作为单独的数据块拷贝到输出,而不把较短的块组合到一起)。
cbs=bytes 为 block 转换和 unblock 转换指定转换块的大小。
skip=blocks 在拷贝之前,跳过输入文件的前 blocks 块,每块大小为 ibs-byte 字节。
seek=blocks 在拷贝之前,跳过输出文件的前 blocks 块,每块大小为 obs-byte 字节。
count=blocks 只拷贝输入文件的前 blocks 块(每块的大小为 ibs-byte 字节),而不是全部内容,直到文件末尾。
conv=转换"[,"转换"]..." 将文件按「转换」参数指定的方式转换(在“,”两边没有空格)。可用的转换参数见下方的转换方式表格。

数字值选项(以字节或块为单位)后面可以跟一个乘数,例如:k=1024b=512w=2c=1。最好别使用 w,因为在 system V 中,它表示 2,在 4.2 BSD 中,它表示 4。

两个或更多的数值表达式可以通过 x 乘起来。GEU fileutils 4.0 允许在数据块大小的叙述中使用下列乘法后缀(用 bs=cbs=obs=):M=1048576,G=1073741824,同理可得 TPEZYD 后缀表示数值是以十进制表示的:kD=1000,MD=1000000,GD=1000000000 等等。

需要注意的是,在 lsdfdu 命令中,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 字节。