📜  使用 dd 命令在 Linux 中进行磁盘克隆

📅  最后修改于: 2022-05-13 01:57:27.549000             🧑  作者: Mango

使用 dd 命令在 Linux 中进行磁盘克隆

每个人都喜欢拥有磁盘驱动器的副本以便有机会恢复。即使您现在不想要副本,您也会想要您的第一个 HDD 何时损坏。它用于将所有数据从初始标准具转储磁盘克隆到多个主机磁盘。它将为您节省大量的部分时间。但是克隆磁盘的操作选项是什么——让我们看看:

  • 有足够大的磁盘驱动器以将您的主机磁盘驱动器转储存储在此驱动器的文件中
  • 将多个磁盘驱动器连接到您的本地主机并按设置复制它
  • 将多个磁盘驱动器连接到远程主机,并通过网络将主机磁盘驱动器数据传输到远程主机磁盘驱动器

所有这些选项都可以在 Linux 命令行中使用,并且易于建立和理解。 Linux下的“一切都是文件”:从磁盘驱动到应用层文件

Linux 中的“一切都是文件”

让我们看看磁盘驱动器分区和文件在 Linux 中的样子:

脚本主体:

#!/usr/bin/env bash
ls -l /dev/sda5
ls -l just_a_file

黄色矩形中的脚本主体,输出在矩形旁边

ls是按名称列出所选文件的命令: /dev/ sda5 是与磁盘驱动器分区关联的特殊文件, just_a_file是控制台显示的文件系统中的文件。输出有什么区别?第一个字母“ b ”表明/dev/sda5是一个块设备文件——不仅仅是一个文件。让我们从 Linux 内部来看:Linux 中数据存储和操作的全球概念是——“一切都是文件”。这意味着即使是从 Linux 角度来看的设备也可以表示为文件。在操作系统代码的深处,您会发现该文件是一个抽象实例,它具有几个结构良好的函数,特定于它所保存的日期:

  • 读取函数
  • 写函数
  • 开放函数(在多个读取器/写入器上进行正确的数据访问)
  • 关闭函数
  • ioctl函数(设备驱动程序文件的非常具体的操作函数)

在这个概念中 - 硬盘驱动器表示为/dev/文件夹中的文件。作为一个文件,这个 HDD 定义了一个读取函数。这种读取就像在任何应用层程序中读取文件数据一样。所以——我们可以读取硬盘条目。如果这个文件也定义了一个写函数,我们将在逻辑上。

如何检测磁盘驱动器文件?

合理的问题是——如何检测文件和副本的“文件大小”。可以通过使用“ lsblk ”和“ df ”Linux 实用程序来实现。系统块设备文件的第一个实用程序列表。第二个实用程序以块为单位显示设备的大小。

lsblk 脚本主体:

#!/usr/bin/env bash

lsblk

lsblk 脚本执行控制台:

黄色矩形中的脚本主体,输出在矩形旁边,橙色矩形包含我们的磁盘信息

在控制台输出中,我们可以看到带有子文件的磁盘文件“ /dev/sda ”代表该磁盘的分区:“ /dev/sda1 ”、“ /dev/sda2 ”、“ /dev/sda3”

df 脚本正文:

#!/usr/bin/env bash
df /dev/sda

黄色矩形中的脚本主体,输出在矩形旁边

在控制台输出中,我们可以看到设备文件的大小(以 1K 块为单位)。

dd – Linux 的标准磁盘转储实用程序

现在让我们看看“ dd ”Linux 标准磁盘转储实用程序。 “ dd ” 在输入和输出中对文件(精确地具有数据流)进行操作,并且只是从输入文件中逐块获取数据并将此数据传递给输出文件。 “dd”实用程序有几个运行参数——我们将查看主要参数并概述如何使用它。

dd 使用主要广泛使用的参数运行格式:

dd运行说明:

“if”参数可以减少——如果减少输入,则可以从应用程序的标准输入流中收集。 “ of ”参数可以减少——在减少的情况下,输出被定向到应用程序的标准输出流。 “ bs ”参数可以减少——在减少的情况下,选择一些系统特定的默认参数。 “ count ”参数可以减少——在减少的情况下,所有 dd 参数输入文件条目都被转储到 dd 输出文件参数接收器。
(您应该拥有使用 dd 操作的 root 权限。请确保您将这样做——您的数据可能会因错误操作而受到损害)

使用 dd 将磁盘转储存储在文件中:

现在我们一个一个地用用例来看看如何使用“ dd ”。首先,让我们看看将磁盘映像存储到文件中。在我们的例子中,我们会将 cdrom 设备磁盘映像克隆复制到我们将指定的文件中。

dd 磁盘到文件克隆脚本正文:

#!/usr/bin/env bash
dd if=/dev/sr0 of=cdrom_disk_dump_file
ls -l cdrom_disk_dump_file
rm cdrom_disk_dump_file

在控制台运行的 dd 磁盘到文件克隆脚本:

黄色矩形中的脚本主体,输出在矩形旁边

正如我们在控制台的输出中看到的那样,原始 cdrom 转储已以 392Mb/s 的速率复制到我们磁盘上的文件中。吞吐率可能因您使用的磁盘类型和选择的“ bs ”参数而异。 “ 1457256+0”是在“ dd ”运行时复制进出的块数。
(请注意 /dev/sr0 是我系统中的 cdrom 磁盘名称 - 您的系统可以保存其他名称)

使用 dd 将原始磁盘映像存储在连接到主机的其他磁盘上:

如前所述,按原样克隆主磁盘非常有用:从一个磁盘驱动器克隆到另一个磁盘驱动器。 “ dd ” 在这种情况下也很有用。

dd 原始磁盘映像克隆到其他磁盘脚本主体:

#!/usr/bin/env bash
lsblk /dev/sda /dev/sdb
sudo dd if=/dev/sda /dev/sdb bs=1k
lsblk /dev/sda /dev/sdb

dd 原始磁盘映像克隆到在控制台运行的其他磁盘脚本:

黄色矩形中的脚本主体,输出在矩形旁边

正如我们之前看到的复制目标磁盘/dev/sdb没有数据。但是复制后/dev/sda的分区结构等于/dev/sdb的结构。

注意:请注意这里需要“sudo”命令才能直接处理 dev 文件。

将磁盘转储存储在另一个网络连接的主机磁盘上

在此示例中,我们将使用nc实用程序通过网络转换磁盘的转储。该实用程序将在我们的主机上运行,以将数据放入网络并从网络中获取数据。它将在本地运行——但您可以在不同的主机上编写发送和接收脚本。

发送磁盘转储正文的脚本:

#!/usr/bin/env bash
lsblk /dev/sda /dev/sdb
sudo dd if=/dev/sda | nc -l 

黄色矩形中的脚本主体,输出在矩形旁边

dd这里没有“ of ”参数——在这种情况下它将写入标准输出流。此流通过使用“ | ”重定向到以下nc调用标准输入流。 “。 nc通过 TCP 连接将磁盘数据传输到“ localhost ”(out current host)端口9000 。我们只需要在 9000 端口有一个合适的 TCP 监听器就可以成功。接下来会跟上。

接收磁盘转储正文的脚本:

#!/usr/bin/env bash
lsblk /dev/sda /dev/sdb
nc -l 9000 | sudo dd of=/dev/sdb bs=1M
lsblk /dev/sda /dev/sdb 

黄色矩形中的脚本主体,输出在矩形旁边

这里我们通过nc 在 9000 端口监听 TCP 连接。接下来nc将所有连接数据传输到nc标准输出流。这通过使用“ |传递给dd标准输入流。 ”重定向命令。 dd这里没有“ if ”参数——在这种情况下它将获得标准输入流作为输入(表示nc 标准输出流)。最后,我们可以看到 - /dev/sdb分区结构与预期的一样等于/dev/sda