dd命令是Linux系统中一个功能强大的底层数据复制与转换工具。它的全称是"data duplicator"(数据复制器),常用于创建文件、分区或整个磁盘的精确副本,因此非常适合备份数据、克隆硬盘或将磁盘镜像写入物理介质等任务。该命令可以在文件或设备之间复制和转换数据,并提供控制块大小、跳过或定位数据,甚至应用字节交换等过滤器的选项。由于其工作在非常底层的级别,使用dd时必须格外小心,错误的操作可能导致数据丢失或损坏。

在本教程中,我们将通过一些简单易懂的示例来讨论dd命令的工作原理。需要注意的是,本文中的所有示例均已在Ubuntu 24.04上测试通过。

Linux dd命令

简而言之,dd命令允许你复制和转换文件。该工具提供了一些操作数(operand),可用于指定你希望进行何种格式化。以下是其man页中描述的通用语法:

dd [OPERAND]...
dd OPTION

使用dd命令从ISO文件创建可启动USB驱动器

dd命令在Linux中的一个常见用途是从ISO文件创建可启动USB驱动器。这通常在准备用于安装操作系统的U盘时完成。相关命令如下所示:

sudo dd if=/path/to/your.iso of=/dev/sdX bs=4M status=progress && sync

在这个示例中:

  • if=/path/to/your.iso 指定输入文件,即ISO镜像。
  • of=/dev/sdX 指定输出文件,即USB驱动器(将X替换为你的USB设备对应的字母)。
  • bs=4M 将块大小设置为4兆字节,以优化复制过程。
  • status=progress 提供复制进度的实时更新。
  • sync 确保在操作完成之前所有数据都已写入USB设备。

该命令将创建一个可启动USB驱动器,用于安装ISO文件中包含的操作系统。

常见问题解答

以下问答形式的示例将帮助你更好地理解dd命令的工作方式。

Q1. 如何使用dd命令更改输入文本的大小写?

假设你有一些小写的文本行,需要快速将它们转换为大写。你可以使用conv命令行选项,并将其值设置为ucase

例如:

dd conv=ucase

上述命令会显示命令本身以及输入文本。使用Ctrl+d组合键告诉dd输入结束,随后命令将产生以下输出:

可以看到,输入文本已从小写转换为大写。最后几行是操作相关的统计信息。

注意:同样地,你可以使用值lcase将大写文本转换为小写。

Q2. 如何从文件读取并写入到文件?

在第一个示例中,我们通过stdin(标准输入)输入了文本。不过,你也可以使用输入文件和输出文件。要指定输入和输出文件的名称,请使用ifof命令行选项。

例如,如果你想将file1中的文本转换大小写后写入file2,可以按以下方式操作:

dd if=file1 of=file2 conv=ucase

Q3. 如何在读取输入时跳过部分内容?

如果需要,你可以让dd在读取输入文本时跳过一些起始字节。这可以通过skip选项实现,该选项需要一个数值。假设该值为N,那么dd将在输入开头跳过N个ibs大小的块。这就引出了另一个命令行选项ibs,其值指定工具每次读取的字节数(默认值为512)。

因此,假设你想跳过输入文件的前4个字节。你应该先将ibs设置为4,然后使用1作为skip值。这样可以确保工具在读取输入文件时跳过1个4字节的块。

可以看到,在读取file1时跳过了文本hey,,因此它没有出现在file2中。

Q4. 如何交换输出中每对输入字节?

如果有这种需求,你还可以使用dd交换每对输入字节。这可以通过将swab作为conv命令行选项的值来实现。

Q5. 如何让dd仅在输出文件不存在时才工作?

如果要求dd命令在输出文件已存在时不执行任何操作,那么可以使用conv选项的excl值来强制满足这一条件。

Q6. 如何确保输出文件以追加模式更新?

默认情况下,dd会覆盖输出文件(如果该文件已存在)。但如果你希望它以追加方式写入文本,请为oflag标志使用值append,并为conv选项使用notrunc

例如:

dd if=file1 of=file3 oflag=append conv=notrunc

Q7. 如何让dd不创建输出文件?

如果需要,你还可以强制dd命令在命令中指定的输出文件不存在时不创建该文件。这可以通过使用conv命令行选项的nocreat值来实现。

Q8. 如何控制输出到stderr的信息量?

如果需要,你还可以限制命令在stderr上打印的信息量。这可以通过status命令行选项实现。例如,如果你想只抑制除错误消息以外的所有内容,可以将值none传递给该命令行选项:

dd if=file1 of=file3 status=none

其他可用值包括noxferprogress。man页对status选项的说明如下:

status=LEVEL
              The  LEVEL  of information to print to stderr; 'none' suppresses
              everything but error messages,  'noxfer'  suppresses  the  final
              transfer  statistics, 'progress' shows periodic transfer statis?
              tics

结论

本教程中讨论的示例只是dd命令所能实现功能的冰山一角。举个例子,你可以使用该工具创建虚拟文件系统、备份硬盘或系统分区。有关dd的更多信息,请参阅其man页