Linux 中的 dd 命令:解释 5 个真实示例Linux 中的 dd 命令:解释 5 个真实示例Linux 中的 dd 命令:解释 5 个真实示例Linux 中的 dd 命令:解释 5 个真实示例
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

Linux 中的 dd 命令:解释 5 个真实示例

发表 admin at 2025年2月28日
类别
  • 未分类
标签

Linux 中的 dd 命令是一个用于复制和转换文件的强大实用程序。这篇详细的文章解释了 dd 命令的一些实际示例。

Linux 中的 dd 命令是一个用于复制和转换文件的实用程序,具有许多实际用途。

有人建议该名称源自较早的 IBM 作业控制语言函数,其中 dd 代表“数据定义”。在 Linux 中,该缩写代表“Data Duplicator”或“Disk Dump”或各种其他头韵,具体取决于您的来源。

它甚至可能赢得了“数据毁灭者”这个令人心酸的绰号,这让我想到了一个重要的观点。练习 dd 命令时请务必小心。

该命令能够造成一些严重的损害。请务必仔细检查您的语法,以避免代价高昂的错误。您不想成为混淆分区名称并痛苦地看着根分区被破坏并被空白文件替换的人。

了解 dd 命令

dd 命令的语法如下:

dd if=<filename> of=<filename> [options]

该命令的用途很广泛,我将介绍一些常见的方法。

物理介质/分区克隆/备份

在上面的语法中,‘if’和‘of’分别用于输入文件和输出文件。这是dd的核心功能。它将数据从一个源复制到另一个源。 dd 不需要使用物理介质。

文本处理

可以使用键盘上的 stdin(标准输入)来收集输入并将其指向文件。还可以快速转换大小写,并且手册页中包含各种其他有用的文本编辑工具。

我之前提到 IBM 时提到了该计划的悠久历史。该命令的原始功能之一实际上是将 EBCDIDC(IBM 创建的一种编码模式)转换为 ASCII。

文件系统操作

您还可以使用它复制文件,但对于这个简单的应用程序,建议使用 cp 命令而不是 dd 命令。我们有一篇文章,您可以阅读有关 cp 命令的文章。

一些行为注意事项

使用dd复制时,您还应该注意,默认情况下它会从指定源复制完整信息。

这意味着如果您尝试复制分区或磁盘,它也会复制可用空间。

因此,举例来说,如果您要克隆 4 TB 的硬盘驱动器,则需要至少 4 TB 的目标驱动器,以防止文件被截断和错误。另请记住,如果磁盘只有 1 TB 的数据,dd 仍将复制其他 3 TB 的空间。这是一个糟糕的举动,会浪费大量时间和资源。

我们可以向 dd 添加一些约束,并采取其他措施来改变这种行为。实际上有大量的控件可以与 dd 结合使用。我将尝试解决一些我认为可能对读者最有利的问题,但本文的目标是提供 dd 的入门知识,而不是记录每个可能的功能。

注意!为了练习,请使用虚拟机

我敦促您概念化您的目标并仔细执行它,以避免损坏或破坏重要文件。显然,我们对您的信息丢失不承担责任。如果你犯了一个错误。不要说我们没有警告你。

我建议在尝试更改任何“现实世界”资产之前先在虚拟虚拟机上进行练习以熟悉情况。这是因为 dd 命令能够更改,如果使用不正确,就会损坏您的文件系统。

在本教程中,我决定尝试 Debian 系列之外的东西,并在 VirtualBox 中创建 Fedora 31 的副本。

5 dd命令的实际例子

有了警告和一些上下文信息,我们就可以继续使用这个简单但功能强大的命令的一些应用程序了。

示例 1:克隆磁盘

使用 dd 将一个磁盘克隆到另一个磁盘非常容易。对于我的示例,我有两个名为“sda”和“sdb”的磁盘。

请记住,“sda”将尝试使用驱动器的全部内容(而不仅仅是数据)将自身复制到“sdb”上。

您需要在输出文件上分配足够的空间以容纳扇区上未使用的空间。您还可以选择将驱动器重新分区为当前数据填充的确切大小。我会推荐这个方法。它将减少执行操作所需的时间并创建更有用的文档。

当您准备好克隆磁盘时,可以运行 fdisk 来识别您的磁盘、其分区及其容量。

sudo fdisk -l 

运行此命令将列出可用的驱动器和分区及其各自的大小。这有助于正确识别您的目标设备。

同样,对于我们的应用程序,我们使用名称“sda”和“sdb”,并且我们假设它们的大小相同。

[linux@fedora ~]$ sudo dd if=/dev/sda of=/dev/sdb
[[enter pw for sudo]]
dd: writing to 'dev/sdb': No space left on device
8108369+0 records in
8108369+0 records out
4151484416 bytes (4.2 GB, 3.9 GiB) copied, 12.3602 s 336 MB/s

输出让我们知道写入成功,我们可以忽略“sdb”上不再有任何空间的消息。

摘要还列出了复制的数据量、花费的时间以及复制的速度。当我讨论块大小时,我们会更多地讨论这个问题。

示例2:备份磁盘分区

克隆设备和备份分区的步骤类似。我们可以创建一个“.img”(原始磁盘映像)文件,而不是设备的目标文件。

假设我们的系统在“sda2”处有一个单独的主目录分区,我们希望将其备份到当前目录中名为“home_backup.img”的文件中。

dd if=/dev/sda2 of=home_backup.img

就是这么简单!所以现在您没有理由没有良好的备份例程。

当然,这很容易,但总有更多东西需要学习。

在 dd 命令中处理块大小

在我们进入下一个例子之前,让我们先讨论一下 BS,即块大小。如果您看到它用于通过 dd 命令指定值,您可能想知道为什么它在那里。

如果您的好奇心引导您进行互联网搜索,那么我敢打赌您可能仍然想知道它为什么在那里。

我会尽力给出通俗易懂的语言解释。块设备通常是具有有限存储空间的物理介质。

您可以通过查找特定的数据块来查找光盘等介质上的信息。例如,系统可以读取 CD-ROM 并搜索从块 500(任意数字)开始的信息。它还可以用于“书尾”信息,并且可能使用从块 500 到块 1500 的信息。

这些块可以按照系统高效分析的方式进行分段。这可能反映介质的存储空间,或介质可能与之关联的标准系统规格。

我将继续以 CD-ROM 为例,它有自己定义的块大小 (2048)。每个块最多必须有 2048 字节。即使一个块只包含 100 字节数据,它仍然会占用同样的 2048 字节。

在某些情况下,您可能需要定义块大小以使 dd 运行得更快或防止数据损坏。回到我们的 CD-ROM 示例,创建不同大小的块可能会在读取数据时导致异常。

如果未定义,dd 将使用块大小 512。这是典型硬盘驱动器可以读取的最小块大小。

如果您的介质不限于特定的块大小,您可能可以安全地调整它的性能(写入时间)。让我们看几个例子。

未指定块大小的性能

[linux@fedora ~]$ sudo dd if=/dev/sda of=home_backup.img
[sudo] password for linux: 
dd: writing to 'home_backup.img': No space left on device
31974953+0 records in
31974952+0 records out
16371175424 bytes (16 GB, 15 GiB) copied, 113.848 s, 144 MB/s

块大小为 1024 时的性能

[linux@fedora ~]$ sudo dd if=/dev/sda of=home_backup.img bs=1024
[sudo] password for linux: 
dd: error writing 'home_backup.img': No space left on device
15987477+0 records in
15987476+0 records out
16371175424 bytes (16 GB, 15 GiB) copied, 75.4371 s, 217 MB/s

您可以看到该过程以更快的速度执行。块大小为 4096 的另一次运行速度更快,但速率为 327 MB/s。系统缓存也可以在速度方面发挥作用,但这是另一天的主题。

您可能已经注意到传入和传出的记录数量的变化。这是因为我们正在更改每个块的大小,从而更改各个块的容量,尽管输出文件保持相同的大小。因此,调整 bs 值可能会产生意想不到的后果。例如,执行校验和时可能会导致差异。

示例 3:删除数据并将磁盘清零

还记得之前的所有警告吗?该命令将用零替换“sda”的每个块。

dd if=/dev/zero of=/dev/sda

这是如何运作的?本质上,与所有其他 in 和 out dd 命令相同。什么是“/dev/zero”?

它是 Unix/Linux 操作系统中包含的伪设备,它将向文件写入零,直到到达文件末尾。

您可以类似地使用“dev/random”来输出随机数据位。如果您计划使用原始图像文件来替换内容,这可能是不必要的,因为使用 dd 已经复制了未使用的空间。

请注意,一些讨厌的人会在各种 Linux 论坛上欺骗毫无戒心的用户运行此命令。既然您知道这个命令的作用,您就不会成为这个邪恶恶作剧的牺牲品了。

示例 4:从 CD/DVD 创建 .ISO

如果您的计算机还有 CD-ROM 驱动器,您可以直接从 CD-ROM 驱动器复制。前面我提到过 cd-rom 的标准字节大小是 2048。我们将设置字节大小以匹配该大小以避免转换问题,然后添加其他几个命令。

dd if=/dev/cdrom of=space_jam_dvd.iso bs=2048 conv=noerror,sync

让我解释一些事情。使用conv=noerror,任何错误都将被忽略。程序将继续进行到最后一个块而不会停止。这不会为他们停止。

当与“noerror”结合使用时,“sync”将确保任何丢失的数据块将自动用空信息填充。

这意味着现有数据将被映射到相同的位置,大概会保留尽可能多的内容。

确保源文件和目标文件为这些操作设置相同的“bs”非常重要,否则它们将不会获得预期的结果。

示例 5:创建可启动 USB

您可以使用 dd 创建可启动 USB,这就像您想象的一样简单。事实上,这是 dd 命令最流行的用法之一。

这里涉及一个额外的步骤。在运行“dd”之前,我们使用 mkfs 命令将文件系统构建到 USB。

如果没有选项,它使用默认的 ext2 系统。因此,假设我们要准备的 USB 名为“sdb”,并且我们想要将文件系统更改为 ext4,我们将运行以下命令:

sudo mkfs.ext4 /dev/sdb

如果您想在 Windows 系统上使用,您可以将命令的第一部分替换为 mkfs.ntfs。

您还可以使用以下语法:

mkfs -t [for type] $filesystem.

一旦准备好可启动介质,我们就可以继续执行 dd 命令。

dd if=someFile.iso of=/dev/sdb

使用 .iso 可安装映像并将其复制到 USB 设备对应的驱动器名称。

结论

谢谢阅读。我希望您喜欢这本关于“dd”的入门读物。您可以通过多种不同的方式使用此命令。我试图涵盖许多更有用的示例。如果您有想看的内容或有直接的问题,我很乐意提供帮助。请在下面的评论中告诉我您的想法。

©2015-2025 Norria support@norria.com