dd 是否复制所有内容,包括所有元数据和所有“空”块

dd 是否复制所有内容,包括所有元数据和所有“空”块

突然,我的分区(或者只是一个分区)出现了问题。我在金士顿 SSD 上安装了默认的 Ubuntu,根文件系统使用 LUKS 加密(我认为使用 AES)。现在我尝试从 live CD 挂载分区,但没有成功。

我很害怕造成一些无法挽回的额外伤害。所以我想做一个精确复制驱动器的。这意味着所有分区表、LUKS 分区的任何类型的元数据,以及我不知道的任何其他类型的元数据。我想我也想要所有空的街区,感觉绝对安全。

我知道dd if=/dev/sda of=/dev/sdb,但我不知道它是否包含所描述的所有数据。

也许我需要用 指定块大小-b,但我不明白它是如何工作的以及为什么它是必要的(如果是的话)。而且我也不知道如何找到分区的块大小。

请告诉我是否复制全部数据,如果没有,是否还有其他方法。

答案1

是的,甚至是那些不会(正式)包含数据以及有关分区、UUID 等的所有信息的块。

例如,可以从 dd 复制的驱动器恢复数据(即删除文件后)。

您可能想阅读关于noerrorsync选项。

除非有读取错误,否则块大小 ( bs=) 不会影响结果,但您应该将其设置为“1M”(或至少“4k”),否则会无缘无故地花费更长的时间。

答案2

做就是了:

cp /dev/block_device imgfile

如果imgfile将位于一个能够理解这些事情的文件系统上,一个 GNUcp 应该默认稀疏地写入图像。不过,您可以指定您的偏好,例如...

cp --sparse=always /dev/sda imgfile

dd的主要用处在于它能够可靠地仅采用指定的部分流,或者它可以非常有效地将某些转换应用于流。如果您想要 1:1 的副本全部一个文件然后就cp可以了。

答案3

dd不关心它复制的数据意味着什么。分区表、分区内容、文件碎片、空文件系统空间,都是字节。dd if=/dev/sda of=/dev/sdb制作/dev/sdb的精确副本/dev/sda,前提sdb是至少与 一样大(加上一些尾部垃圾,如果更大,sda则无法直接访问)。sdb

所有的魔力都在sdX块设备中。dd只是一个复制字节的工具。

但这并不意味着这dd是完成这项工作的最佳工具。它有点容易出错,而且通常不是最快的事情。我发现cat在不同磁盘之间复制时速度更快dd可能会以某种不直观的方式丢失数据(虽然我思考现代 Linux 系统在这方面是安全的)。使用cat还有一个额外的优点,即因拼写错误而破坏数据的风险较小(例如交换ifof):输出是通过熟悉的 shell 重定向运算符指定的(dd顺便说一下,您也可以使用此语法)。

cat /dev/sda >/dev/sdb

如果您的其他磁盘更大,您可以在文件中制作磁盘的映像:

cat /dev/sda >/path/to/disk.img

这样的磁盘映像不能直接使用:您无法启动它。但是将其复制回磁盘将产生原始内容的逐字节副本,因为整个内容都被复制了两次。您还可以做一个环回安装访问文件。您可以制作带有分区的循环设备,但是Ubuntu 仅在最新版本中提供了用于此目的的工具。如果您只想保留数据,单独复制分区并将它们存储在单独的文件中就足够了。

相关内容