我的问题在 dd/harddisk/iso-images 上下文中更为通用。以下是详细信息。
我有一个 live iso 映像,其中包含两个分区,分别挂载为/dev/loop1p1
和/dev/loop1p2
,并且我有一个硬盘,末尾有大量未分配的空白空间。此外,我还连接了一个 usb 驱动器(写入了相同的映像),内容可在/dev/sdb1
、 和 处找到/dev/sdb2
。
所以我的任务非常简单:
/dev/sdb2
将USB 分区(或已安装的 ISO )克隆/dev/loop1p2
到 HDD 中的空白/未分配空间。
我相信dd
这是前进的方向,而且情况始终如此。
if=
边:
尽管dd
接受整个磁盘( )或/dev/sdb
分区(等)作为第一个参数,来自 HDD( )的剩余参数需要是同质的并且似乎是决定性的一方。/dev/sdb1
/dev/sdb2
if=
of=
/dev/sda
of=
边:
我还没有在硬盘端创建分区来将其传递给of=
命令的参数dd
。如果我使用完整的硬盘/dev/sda
作为of
描述符,硬盘上现有的分区将会丢失,这绝对是不可取的。
因此,重申一下这个问题:
如何将特定的 USB 驱动器克隆到 HDD?
/dev/sdb2
除此之外,如果我以某种方式在硬盘上创建一个新的、空的分区,其尺寸与或的“精确”尺寸相同/dev/loop1p2
,并将其用作参数,这会有帮助吗of=
?
答案1
/dev/sdb2
如果我以某种方式在硬盘上创建一个新的、空的分区,其尺寸与或的“精确”尺寸相同/dev/loop1p2
,并将其用作参数,这会有帮助吗of=
?
是的,这可能是最简单的方法。大小不必完全相等,可以更大。严格地说,它必须至少与 里面的文件系统一样大/dev/loop1p2
,可能比其本身小得多/dev/loop1p2
。获取给定文件系统的确切大小的方法取决于文件系统(ext、btrfs 等使用不同的工具)。不过,文件系统比其分区小得多的情况并不常见,因此的大小/dev/loop1p2
是合理的,安全的最低限度。
如果新分区对于文件系统来说太小,您最终会得到不健康的文件系统克隆,可能会丢失一些数据和/或元数据。合适的fsck
工具可能会或可能不会使克隆正式恢复健康,但它不会恢复任何不适合的数据。无论源文件系统有多少可用空间,都可能发生数据丢失。
如果新分区大于,则不会发生任何坏事。无论 中有什么文件系统/dev/loop1p2
,它都不应该关心目标分区是否更大。但是,创建更大的分区将浪费空间,除非您计划随后扩大文件系统以占用整个分区。
所以是的, 的大小/dev/loop1p2
很可能是新分区的最佳大小。有些工具可能会注意分区类型,因此您应该正确设置新分区的 ID(对于MBR 中的 DOS 分区表和GUID 分区表)。
您可以在不创建新分区的情况下进行克隆吗?可以,但是不值得。
像设备节点这样的/dev/sdx3
只是一个有用的抽象,用于访问预定义的片段/dev/sdx
(并且该片段之外没有任何东西)。这意味着dd of=/dev/sdx3
你可以dd of=/dev/sdx
运行恰当的偏移量(obs=
,seek=
),一般来说,注意不要写入超出片段(count=
)的内容。虽然很麻烦,但完全可以将您的数据克隆/dev/sdb2
到目标硬盘上的未分配空间,而无需在那里创建分区。但是:
- 任何拼写错误或计算错误都可能导致覆盖您不想触碰的目标硬盘的一部分(然后您就会知道
dd
代表“数据销毁器”); - 尽管很少有工具可以与
/dev/sdx
偏移一起使用,但您确实需要一个分区,/dev/sdx3
例如方便地在实践中使用克隆的文件系统,所以迟早你都会创建它; - 在没有分区的情况下,克隆占用的空间被视为空闲空间;任何理智的工具都不应该主动使用它,但是你可能会忘记被占用片段的确切大小,甚至忘记它被占用的事实。
出于这些原因,在克隆之前创建一个分区是正确的做法。一旦有了它,of=
指向它是正确的方法dd
。