Linux中DD命令实例

时间:2020-03-05 15:26:29  来源:igfitidea点击:

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

了解DD命令

这是DD命令的语法:

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

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

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

在上面的语法中,"如果'和'的'和'分别用于输入文件和输出文件。
这是DD的核心功能。
它将数据从一个源重新编写到另一个源。
我们无需使用DD使用物理媒体。

文本操纵

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

我提到IBM早些时候暗指这个计划的悠久历史。
此命令的原始功能之一实际偏心在转换EBCDIDC,由IBM创建的编码模式进行转换为ASCII。

文件系统操纵

我们还可以使用它复制文件,但在DD上建议使用CP命令进行此简单应用程序。
我们有一篇文章可以阅读CP命令的文章。

一些行为票据

使用"DD"复制时,我们还应该意识到默认情况下,它将从指定的源复制完整信息。

这意味着如果我们尝试复制分区或者磁盘,则它也将复制可用空间。

因此,例如,如果我们克隆了4 TB的硬盘驱动器,则需要一个具有至少4 TB的目标驱动器以防止截断的文件和错误。
另外,如果磁盘只有1 TB的数据,DD仍将复制其他3 TB的空间。
这是一个糟糕的举动,浪费了很多时间和资源。

5个DD命令示例

示例1:克隆磁盘

用DD克隆到另一个磁盘可以非常容易。
对于我的例子,我有两个名为'SDA'和'SDB'的磁盘。

请记住,"SDA"将尝试使用驱动器的整个内容复制到"SDB"上,而不仅仅是数据。

我们需要在输出文件上分配足够的空间,以适应该扇区上未使用的空间。
我们还可以选择将驱动器重新分区为当前按数据填充的精确尺寸。
我会推荐这种方法。
它将减少执行操作所需的时间并创建更有用文档。

当我们准备克隆磁盘时,我们可以运行fdisk以识别磁盘,分区和其容量。

sudo fdisk -l

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

再次,对于我们的应用程序,我们正在使用名称'SDA'和'SDB',我们将假设它们的大小相同。

[Hyman@theitroad ~]$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"中为我们的主目录有一个单独的分区,我们希望将其备份到当前目录中名为"主页_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.这是典型硬盘驱动器可以读取的最小块大小。

如果介质不限于某个块大小,则我们可能会安全调整它以进行性能(写入时间)。
让我们来看看一些例子。

具有未指定块大小的性能

[Hyman@theitroad ~]$sudo dd if=/dev/sda of=home_backup.img
[sudo] password for theitroad: 
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的性能

[Hyman@theitroad ~]$sudo dd if=/dev/sda of=home_backup.img bs=1024
[sudo] password for theitroad: 
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

这是如何运作的?
基本上,与其他相同的另一个进出DD命令。
什么是'/dev/zero'?

它是一个包含在UNIX/Linux操作系统上的伪设备,它将将Zeroes写入文件,直到它到达文件的末尾。

我们可以类似地使用输出随机数据的"开发/随机"。
如果我们计划使用原始图像文件替换内容以替换内容,则可能是不必要的,因为使用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

让我解释一些事情。
使用conv = noerror,任何错误都会被忽略。
该计划将继续到最终块而不停止。
它不会停止他们。

当与"NoError"结合使用时,"同步"将确保任何丢失的数据块都会自动使用空信息填充。

这意味着现有数据将被映射到相同的位置,可能会尽可能多地保留含量。

重要的是要确保源文件和目标文件具有相同的"BS"为这些操作设置,否则它们不会具有预期的结果。

示例5:创建一个可启动的USB

我们可以使用DD来创建一个可引导的USB,它就像我们期望的那样简单。
事实上,这是DD命令最受欢迎的使用之一。

这里有一个另外的一步。
我们使用MKFS命令在运行"DD"之前将文件系统构建到我们的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设备的相应驱动器名称。