Linux中dd命令用法详解


原文地址:Linux中dd命令用法详解

Linux中的dd命令是用于复制和转换文件的强大实用程序。本文详细介绍了dd命令的一些实际示例。

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

有人认为该名称是旧的IBM Job Control Language函数的派生词,其中dd代表“数据定义”。在Linux中,根据您的来源,缩写代表“ Data Duplicator”或“ Disk Dump”或其他各种形式。

dd是一个非常危险的命令,我曾就就dd掉自己一个硬盘的数据,大概有400G的数据。所以DD有“数据破坏者”的美称。自己的很多大学照片和还有视频,歌曲都没了。

该命令会造成严重的损坏。请务必仔细检查语法,以避免代价高昂的错误。您不希望成为混淆分区名并在其根分区被破坏并替换为空白文件时痛苦的人。

了解dd命令

这是dd命令的语法:

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

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

物理媒体/分区克隆/备份

在以上语法中,“ if”和“ of”分别用于输入文件和输出文件。这是dd的核心功能。它将数据从一个来源复制到另一个。您无需将物理介质与dd一起使用。

文字处理

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

我之前提到过IBM暗指该程序的悠久历史。该命令的原始功能之一实际上是围绕将IBM创建的编码模式EBCDIDC转换为ASCII。

文件系统操作

您也可以使用它来复制文件,但是对于此简单应用程序,建议在dd上使用cp命令。我们有一篇文章,您可以在其中阅读有关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”,并假定它们的大小相同。

[linuxhandbook@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。

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

我将继续以自己定义的块大小(2048)的CD-ROM为例。每个块的最大长度为2048个字节。即使一个块仅包含100字节的数据,它仍将占用相同的2048字节。

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

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

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

未指定块大小的性能

[linuxhandbook@fedora ~]$ 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时的性能

[linuxhandbook@fedora ~]$ 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值可能会带来意想不到的后果。例如,执行校验和时可能会导致差异。

示例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设备的相应驱动器名称。

 

评论

登录后评论

服务器优惠活动

Top