dd是Linux中最重要的命令之一,主要用于备份硬盘和分区。如果使用得当,dd 可以成为一种强大的工具,用于将数据从一个分区写入另一个分区并使用文件执行不同的任务。这里我们向您展示如何充分利用 dd 命令。
另请阅读: 5 个更易于安装和使用的 Arch Linux 发行版
该命令最初是由一位名叫 Ken Thompson 的计算机科学家于 20 世纪 70 年代在 AT&T 贝尔实验室开发的。它是为基于 Unix 的系统开发的,并被命名为参考 IBM 作业控制语言中的一条语句,称为“DD”。可以注意到,该命令的语法与作业控制语言中的语句非常相似。
该命令最初设计为将 ASCII 转换为 EBCDIC 的实用程序,反之亦然。它于 1974 年首次与 Unix 版本集成,并发布了第五版操作系统。
dd 在 Unix 社区中被戏称为“磁盘破坏者”,因为它能够在使用不当时破坏硬盘上的数据。
另请阅读: 如何使用 Rclone 加密云中的文件
基本操作数
现在您已经了解了该命令的背景及其错误使用时的破坏性能力,现在是时候学习如何利用它为不同 Linux 发行版的用户提供的所有功能了。
首先,使用查看手册--help旗帜:
dd --help
该命令有两个最常用的操作数。他们是if和of,分别代表“输入文件”和“输出文件”。这if操作数用于表示源位置,而of操作数用于表示要保存输入位置数据的位置。
dd if=<input file> of=<output file>最常见的源和输出位置包括硬盘、分区和磁盘映像。
在使用该命令之前,使用以下命令可能会有所帮助fdisk实用程序来查看系统上的分区。这可以使用命令轻松完成-l旗帜:
sudo fdisk -l
另请阅读: 在 Linux 上克隆整个硬盘的 4 种方法
在这种情况下,if用于表示“/dev/sda”驱动器,并且of代表“/dev/sdb”驱动器,“/dev/sda”中的数据将保存到:
dd if=/dev/sda of=/dev/sdb
创建磁盘映像
该命令的最佳用例之一是以“.img”文件格式创建磁盘映像。这对于备份基于 Linux 的系统上的数据非常有用,并且可能是备份整个硬盘的最快、最简单的方法。
在这种情况下,这里的逻辑基本上是相同的,if代表“/dev/sda”驱动器的操作数和of代表“.img”文件的操作数,硬盘中的数据将保存到:
dd if=/dev/sda of=/tmp/image.img
另请阅读: Apt 和 Apt-Get 命令终极指南
将磁盘映像保存到分区
使用该命令创建磁盘映像相当简单,但该过程的反向版本也是如此。
在这种情况下,我们的磁盘映像文件充当输入文件,而我们的新分区充当输出文件。该实用程序将磁盘映像中的数据保存到“/dev/sdb”分区:
dd if=/tmp/image.img of=/dev/sdb
另请阅读: 如何在Linux中使用ps命令杀死进程
创建压缩磁盘映像
如果您创建全尺寸硬盘的磁盘映像,您可以想象最终磁盘映像的文件大小可能会相当大。因此,dd 实用程序具有创建压缩磁盘映像的功能。
可以使用管道创建压缩磁盘映像|命令。在本例中,它用于获取输入文件的内容并执行gzip命令与-c标志,内容被打包成“.gz”文件:
dd if=/dev/sda | gzip -c > /tmp/image.gz
另请阅读: 如何使用 cURL 进行命令行数据传输等
指定块大小
您还可以尝试一下 dd 命令的操作速度。这可以使用以下方法来完成bs操作数,用于表示块大小。块大小表示在单个实例中 dd 复制到输出文件的字节数。它使用 1024 字节的倍数表示,默认值设置为 512 字节。块大小越大,数据保存到输出文件的速度就越快。
在本例中,我们将块大小设置为 2048:
dd if=/dev/sda of=/tmp/image.img bs=2048块大小也可以以千字节为单位指定:
dd if=/dev/sda of=/tmp/image.img bs=2K
另请阅读: 如何在 Linux 中使用 lsof 命令列出打开的文件
擦除硬盘
dd 也可用于擦除硬盘。这是通过从“/dev/zero”或“/dev/urandom”读取零或随机字符并将它们保存到硬盘/分区,从而覆盖其上的数据来完成的。当您希望确保在出售或以其他方式处置硬盘后数据不易被检索时,这非常有用。
使用零覆盖硬盘:
dd if=/dev/zero of=/dev/sdb
您还可以使用随机字符覆盖设备:
dd if=/dev/urandom of=/dev/sdb
另请阅读: 如何在 Linux 中后台运行 Bash 命令
创建可启动 USB 驱动器
可启动的创建USB 闪存驱动器通过命令使用“.iso”文件很简单:
dd if=os.iso of=<USB drive location>
使用 dd 克隆特定分区
另一个出色的用途dd正在克隆 Linux 系统上的活动分区。与 IMG 文件不同,克隆允许您创建特定分区的精确副本并立即使用它。如果您有多磁盘设置并且想要为系统创建冗余分区,这会很有用。
将分区从“/dev/sda4”克隆到“/dev/sdd1”。
dd if=/dev/sda4 of=/dev/sdb1 conv=noerror,sync这conv参数允许您包含其他选项来修改 dd 的行为。这可以像将文件名转换为大写一样简单,也可以像更改块的属性一样复杂。在这种情况下,我正在使用noerror和sync:
- “noerror”选项告诉 dd 继续复制设备文件,即使它报告设备错误。如果分区所在的设备已经出现故障,这会很有帮助,因为“noerror”可确保 dd 复制该分区中的所有可恢复数据。
- “sync”选项告诉 dd 将每个传入数据块填充到复制缓冲区。这意味着 dd 将确保它可以复制的每一位数据在源和目标之间完全相同。这是为了确保您正在克隆的分区数据的完整性。

另请阅读: 如何在 Linux 中使用 lp 命令从终端打印文件
使用 dd 转储 CD 的内容
还可以使用 dd 作为磁盘内容的转储工具。与 IMG 文件类似,您可以通过使用磁盘驱动器作为输入并使用 .ISO 扩展名作为输出来完成此操作。考虑以下示例:
dd if=/dev/cdrom of=/tmp/dump.iso conv=noerror,sync该命令将告诉 dd 加载 CD-ROM 设备并将其内容复制到 ISO 文件。

完成后,您可以使用file命令来验证转储的文件是否是ISO 9660图像:
file /tmp/dump.iso将 ISO 转储刻录到 CD
接下来,您可以使用 dd 创建刚刚创建的 ISO 文件的副本。为此,您需要将空白光盘插入驱动器并使用“/dev/cdrom”作为 dd 的输出文件。这样,您就可以运行以下命令将 ISO 文件正确刻录到磁盘:
dd if=/tmp/image.iso of=/dev/cdrom obs=32k seek=0此命令不会尝试使用任何错误绕过或完整性检查。相反,它设置了两个特定于写入 CD-ROM 的选项:
- “obs”选项设置 dd 将写入磁盘的块的大小。在本例中,该命令使用 32 KB 作为光学介质传输的基线。
- 另一方面,“seek”选项告诉 dd 将传输的开始设置为特定的数据块。为了正确地传输到 CD-ROM,将其设置为 0 非常重要,这样 dd 将立即写入第一个磁盘扇区。

另请阅读: 8 个有用且有趣的 Bash 提示
常见问题解答
是否可以看到dd操作的进度?
是的!查看 dd 操作的进度非常容易。为此,您需要做的就是包括statusdd 命令末尾的参数:
dd if=/dev/sda4 of=/dev/sdd1 conv=noerror,sync status=progress
“progress”选项告诉 dd 打印当前正在复制到标准输出的块,这有效地允许您查看命令的进度。除了“progress”选项之外,status 参数还接受两个附加值:
- 诺克斯费尔:“noxfer”值与“progress”类似,但它不会在命令末尾打印总体传输信息。如果您使用 dd 命令作为大型 UNIX 管道的一部分,这会很有用。
- 没有任何:“none”值告诉dd在运行时不打印除错误之外的任何信息。如果您正在运行计划的 dd 任务(例如为当前活动分区创建备份 IMG 文件),这会很有帮助。
是否可以始终设置较高的块大小以加快传输速度?
不会。虽然设置较高的块大小肯定会加快 dd 的传输速率,但这样做并不能确保您正在写入的设备正确初始化。例如,为 CD-ROM 或 DVD-ROM 等光学介质设置较高的块大小可能会导致在磁盘播放器上播放时无法读取磁盘。
一个好的经验法则是仅在从光盘和闪存驱动器等介质转储时才使用高块大小。此外,将最大块大小仅设置为 2048 KB 也是一种很好的做法。这样做可以确保您仍然可以将光盘的内容放回 CD 或 DVD。
我尝试创建可启动 USB 驱动器,但无法启动。 dd 不起作用吗?
不!无法启动的最可能原因是 dd 复制到 USB 驱动器的文件不是可启动文件。例如,将 CD 安装程序写入 USB 驱动器不会设置正确的标志以使其可引导。
确保它可启动的一种方法是通过检查其属性file程序。例如:
file /Downloads/ubuntu-21.10.iso
然后,您需要查看标准输出中打印的属性。可启动文件应该是磁盘映像或 ISO 混合文件。
图片来源:未飞溅






