Linux 中的 dd 命令是用于复制和转换文件的实用程序,具有许多实际用途。
有人建议该名称是一个较旧的名称的派生词 IBM 作业控制语言 dd 代表“数据定义”的函数。 在 Linux 中,缩写代表“Data Duplicator”或“Disk Dump”或其他各种头韵,具体取决于您的来源。
它甚至可能赢得了“数据破坏者”这个尖锐的绰号,这让我想到了一个重要的点。 练习 dd 命令时请小心。
这个命令能够造成一些严重的损害。 请务必仔细检查您的语法以避免代价高昂的错误。 您不希望成为混淆分区名称并痛苦地看着他们的根分区被破坏并替换为空白文件的人。
了解 dd 命令
下面是 dd 命令的语法:
dd if=<filename> of=<filename> [options]
这个命令有很广泛的用途,我将介绍一些常用的方法。
物理媒体/分区克隆/备份
在上述语法中,’if’ 和 ‘of’ 分别用于输入文件和输出文件。 这是dd的核心功能。 它将数据从一个来源复制到另一个来源。 您不需要将物理媒体与 dd 一起使用。
文本操作
可以使用键盘上的标准输入(标准输入)来收集输入并将其指向文件。 还可以快速转换大小写,并且手册页中包含各种其他有用的文本编辑工具。
我之前提到过 IBM,暗指该程序的悠久历史。 此命令的原始功能之一实际上集中在将 IBM 创建的编码模式 EBCDIDC 转换为 ASCII。
文件系统操作
您也可以使用它来复制文件,但是对于这个简单的应用程序,建议使用 cp 命令而不是 dd 命令。 我们有一篇文章,您可以在其中阅读有关 cp 命令的信息。
一些行为说明
复制时 dd
,您还应该知道,默认情况下,它将从指定来源复制完整信息。
这意味着如果您尝试复制分区或磁盘,它也会复制可用空间。
因此,例如,如果您要克隆 4 TB 的硬盘驱动器,则需要一个至少 4 TB 的目标驱动器,以防止文件被截断和错误。 还要记住,如果磁盘只有 1 TB 的数据,dd 仍然会复制另外 3 TB 的空间。 这是一个糟糕的举动,会浪费大量的时间和资源。
我们可以在 dd 中添加一些约束,并且可以采取其他措施来改变这种行为。 实际上有大量的控件可以与 dd 结合使用。 我将尝试解决一些我认为可能对我们的读者最有利的问题,但本文的目标是提供 dd 的入门知识,而不是记录所有可能的函数。
注意力! 为了练习,使用虚拟机
我敦促您概念化您的目标并仔细执行它以避免损坏或破坏重要文件。 显然,我们不对您的信息丢失承担责任。 如果你犯了错误。 不要说我们没有警告你。
我建议在尝试更改任何“现实世界”资产之前在虚拟虚拟机上练习以熟悉自己。 这是因为 dd 命令具有更改的能力,因此如果您不正确地使用它会损坏您的文件系统。
对于本教程,我决定尝试 Debian 家族之外的一些东西,并制作了一份 Fedora 31 英寸 VirtualBox.
5 dd命令的实例
通过警告和一些上下文信息,我们准备继续使用这个简单但功能强大的命令的一些应用程序。
示例 1:克隆磁盘
使用 dd 将一个磁盘克隆到另一个磁盘非常容易。 对于我的 example,我有两个磁盘名为“sda”和“sdb”。
请记住,’sda’ 将尝试使用驱动器的全部内容将自身复制到 ‘sdb’,而不仅仅是数据。
您需要在输出文件上分配足够的空间以容纳扇区上未使用的空间。 您还可以选择将驱动器重新分区为当前由数据填充的确切大小。 我会推荐这种方法。 它将减少执行操作所需的时间并创建更有用的文档。
当您准备好克隆磁盘时,您可以运行 fdisk
来识别您的磁盘、它们的分区和它们的容量。
sudo fdisk -l
运行此命令将列出可用的驱动器和分区及其各自的大小。 这有助于正确识别您的目标设备。
同样,对于我们的应用程序,我们使用名称“sda”和“sdb”,我们假设它们的大小相同。
[[email protected] ~]$ 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 命令中处理块大小
在我们进入下一个之前 example,让我们谈谈BS,或块大小。 如果您已经看到它用于使用 dd 命令指定一个值,您可能想知道为什么它在那里。
如果您的好奇心引导您上网搜索,那么我敢打赌您可能仍然想知道它为什么会在那里。
我会尽力给出通俗易懂的解释。 块设备通常是具有有限存储的物理介质。
您可以通过查找特定数据块来查找光盘等介质上的信息。 因此,例如,系统可以读取 CD-ROM 并从块 500(任意数字)开始搜索信息。 它也可以用于“书本”信息,并可能使用从块 500 到块 1500 的信息。
这些块可以以使系统有效分析的方式进行分段。 这可能反映了介质的存储空间,或介质可能关联的标准系统规范。
我会继续 example 具有自己定义的块大小 (2048) 的 CD-ROM。 每个块必须有最大 2048 字节。 即使一个块只包含 100 个字节的数据,它仍然会占用相同的 2048 个字节。
在某些情况下,您可能希望定义块大小以使 dd 运行得更快或防止数据损坏。 回到我们的 CD-ROM example,创建不同大小的块可能会在读取数据时导致异常。
如果未定义,dd 将使用 512 的块大小。这是典型硬盘驱动器可以读取的最小块大小。
如果您的介质不限于特定的块大小,您可能可以安全地调整它以提高性能(写入时间)。 让我们看几个例子。
未指定块大小的性能
[[email protected] ~]$ sudo dd if=/dev/sda of=home_backup.img
[sudo] password for linuxhandbook:
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 的性能
[[email protected] ~]$ sudo dd if=/dev/sda of=home_backup.img bs=1024
[sudo] password for linuxhandbook:
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 值可能会产生意想不到的后果。 为了 example,执行校验和时可能会导致差异。
示例 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 的标准字节大小是 2048。我们将设置字节大小以匹配该大小以避免转换问题,然后添加一些其他命令。
dd if=/dev/cdrom of=space_jam_dvd.iso bs=2048 conv=noerror,sync
让我解释几件事。 和 转换=无错误,任何错误都将被忽略。 程序将继续到最后一个块,不会停止。 它不会为他们停下来。
当与 ‘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”的入门读物。 您可以通过多种不同的方式使用此命令。 我试图涵盖很多更有用的例子。 如果您有什么想看的或直接的问题,我很乐意提供帮助。 请在评论下方告诉我您的想法。