突然,我的分区(或者只是一个分区)出现了问题。我在金士顿 SSD 上安装了默认的 Ubuntu,根文件系统使用 LUKS 加密(我认为使用 AES)。现在我尝试从 live CD 挂载分区,但没有成功。
我很害怕造成一些无法挽回的额外伤害。所以我想做一个精确复制驱动器的。这意味着所有分区表、LUKS 分区的任何类型的元数据,以及我不知道的任何其他类型的元数据。我想我也想要所有空的街区,感觉绝对安全。
我知道dd if=/dev/sda of=/dev/sdb
,但我不知道它是否包含所描述的所有数据。
也许我需要用 指定块大小-b
,但我不明白它是如何工作的以及为什么它是必要的(如果是的话)。而且我也不知道如何找到分区的块大小。
请告诉我是否复制全部数据,如果没有,是否还有其他方法。
答案1
是的,甚至是那些不会(正式)包含数据以及有关分区、UUID 等的所有信息的块。
例如,可以从 dd 复制的驱动器恢复数据(即删除文件后)。
您可能想阅读这关于noerror
和sync
选项。
除非有读取错误,否则块大小 ( 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
还有一个额外的优点,即因拼写错误而破坏数据的风险较小(例如交换if
和of
):输出是通过熟悉的 shell 重定向运算符指定的(dd
顺便说一下,您也可以使用此语法)。
cat /dev/sda >/dev/sdb
如果您的其他磁盘更大,您可以在文件中制作磁盘的映像:
cat /dev/sda >/path/to/disk.img
这样的磁盘映像不能直接使用:您无法启动它。但是将其复制回磁盘将产生原始内容的逐字节副本,因为整个内容都被复制了两次。您还可以做一个环回安装访问文件。您可以制作带有分区的循环设备,但是Ubuntu 仅在最新版本中提供了用于此目的的工具。如果您只想保留数据,单独复制分区并将它们存储在单独的文件中就足够了。