我做了一些愚蠢的事情,破坏了我的主要 linux 安装,并且正在处理磁盘以备份所有内容。在此过程中,我遇到了不知道如何处理的 dd 和/或 LUKS 问题。dd 似乎没有创建一个真正的克隆!
原盘没问题,只是安装坏了。我的数据仍然完好无损。我将它放在一个外部 USB 机箱中,并将它连接到我的笔记本电脑(与主 PC 完全相同的 Ubuntu 版本)。
fdisk 显示了 3 个分区的标准 LUKS 加密星座(所有 ext4):
/dev/sda1 is boot,
/dev/sda2 is an extended partition consuming the rest of the disk
/dev/sda5 is the same size as /dev/sda2, but for LUKS.
如果我运行“cryptsetup luksOpen /dev/sdb5”然后挂载,我可以访问磁盘的内容就好了。
然后我把那个磁盘和一个我漂浮的备用磁盘插入到我的脑叶切开主 PC 中,并从一个实时的 ubuntu 棒启动。两个磁盘都被识别,我跑了:
"dd if=/dev/sda of=/dev/sdb bs=4M status=progress"
并等了3个小时。它毫无怨言地跑了。
我怀疑这很重要,但源磁盘是 1.8 TB SSD,目标是 3 TB HDD。
我将 3 TB 磁盘插入外部机箱并将其连接到我的笔记本电脑。
现在,fdisk 只显示 /dev/sdb1 和 /dev/sdb2。这些看起来是正确的,但是没有 /dev/sdb5 我无法挂载 LUKS 加密卷,也无法访问我的数据。
我的理解是 dd 复制每个字节,并且没有遗漏任何隐藏的元数据,但我不是现代磁盘控制器的专家。我错过了什么(/dev/sdb5 除外)吗?
我需要在笔记本电脑上做些什么吗?如果它是原始的真正字节克隆,则密码应该相同。我认为磁盘序列号没有任何密钥,因为这让我觉得在基于软件的加密方案中没有人想要这种东西。
任何见解将不胜感激!在确定可以访问备份磁盘上的数据之前,我会犹豫是否要做任何事情。
5 TB 磁盘的 gdisk 输出:GPT fdisk (gdisk) 版本 1.0.1
逻辑分区的 EBR 签名无效;读取 0x0000,但应该是 0xAA55 读取逻辑分区时出错!列表可能会被截断!分区表扫描: MBR:仅 MBR BSD:不存在 APM:不存在 GPT:不存在
发现无效的 GPT 和有效的 MBR;在内存中将 MBR 转换为 GPT 格式。
磁盘 /dev/sdb:1220942646 个扇区,4.5 TiB 逻辑扇区大小:4096 字节磁盘标识符(GUID):已编辑分区表最多可容纳 128 个条目第一个可用扇区为 6,最后一个可用扇区为 1220942640 分区将在 256 个扇区上对齐边界总可用空间为 1220444971 个扇区 (4.5 TiB)
编号 开始(扇区) 结束(扇区) 大小 代码 名称 1 2048 499711 1.9 GiB 8300 Linux 文件系统
gdisk output for 5 TB disk:
GPT fdisk (gdisk) version 1.0.1
EBR signature for logical partition invalid; read 0x0000, but should be 0xAA55
Error reading logical partitions! List may be truncated!
Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: not present
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory.
***************************************************************
Disk /dev/sdb: 1220942646 sectors, 4.5 TiB
Logical sector size: 4096 bytes
Disk identifier (GUID): REDACTED
Partition table holds up to 128 entries
First usable sector is 6, last usable sector is 1220942640
Partitions will be aligned on 256-sector boundaries
Total free space is 1220444971 sectors (4.5 TiB)
Number Start (sector) End (sector) Size Code Name
1 2048 499711 1.9 GiB 8300 Linux filesystem
干杯,肯
[编辑] 在花费大量时间起草、修改、查找参考资料、引用和发布此答案之后,我至少可以说 OP 已经回答了他们自己的问题。我最初的想法是删除我的答案,因为其中大部分是无关紧要的,但在投入大量时间可能毫无意义的事情之后,这仍然很困难。尽管我希望解决 OP 的未标记答案中提到的新发现的问题。
更新问题:
既然它在内部连接时似乎可以工作,并且您已经确定问题出在机箱上,为什么不重新复制驱动器并更改您的
bs
值呢?毕竟,当您通过机箱插入原始驱动器时,您可以访问文件,因此以这种方式识别它。所以奇怪的是,原始驱动器可以通过机箱读取,但不能通过新副本读取,除非.........碰巧我的回答确实适用。然后也许使用循环设备场景,您可以计算原始驱动器的偏移量,您可以尝试使用此脚本来确定当它作为 USB 连接时报告的偏移量,以解决无法识别的分区。
否则,更简单但更繁琐的修复方法是在重新复制主驱动器之前重新格式化备用驱动器以备份它,这样当它作为外部 USB 设备插入时,芯片组不会混淆并导致 linux 转换不正确的字节偏移。
[结束编辑]
旧的和不适用的过度简化的解释
发生的情况是,您可能没有格式化在
dd
用于备份主要 linux 安装之前找到的备用磁盘,并且您在主要 linux 安装硬盘驱动器上的内容是MBR 分区方案,而备用磁盘具有GPT 分区方案。@oldfred已经在评论中指出了这一点,但尚未收到对输出以下命令的请求的响应
(而我已经替换了 X 来表示磁盘在 GPT/MBR 相关错误的参考中的显示方式,也就是笔记本电脑)
因此,当您过去
dd
将整个磁盘复制到备用磁盘上时,该磁盘比原始(或源)磁盘大,并且实际上是逐字节复制驱动器的字节,因此它通过分区方案复制(包括前硬盘的分区表和标题)并将其放置在较大磁盘的 GPT 分区方案之上。这意味着它会被 GPT 的保护 MBR 层阻止,该层旨在防止基于 MBR 的磁盘实用程序错误识别并可能覆盖 GPT 磁盘,并与位于设备开头的 LUKS 标头冲突,在同一个地方保护 MBR 就位。因此,当不允许编写这部分时,它无法包含正确的标题信息/dev/sdb5
或/dev/sda5
任何情况。而且,如果您想知道为什么dd
在完成时没有将其中任何一个报告为错误或以“投诉”运行,这可能就是为什么dd
如果没有完成时显示的输出,我将无法告诉您,通常看起来像这样:但否则如果它提到它,它就会被实时报告,而不是在最后显示。否则,您可能必须在内核日志消息(
dmesg
或/var/log/kern.log
)中查看更详细的消息,以防它被认为是硬件错误。在这种情况下,您可能还会发现smartctl -x /dev/sda
它很有用,因为它可能是在开始分区或其他内容之前写入部分的内容,这也可能会显示在内核日志中。特别是因为直到之后才报告此错误:随着这个“过于简单的答案”变得多么复杂,我离题了,不会费心讨论它如何与MBR 磁盘分区与GPT 分区表头和GPT 分区条目一起工作的具体冲突,以及它如何受到 BIOS、UEFI 的影响,或带有 CSM 条件的 UEFI,以进一步可能不必要地“为什么”,因为这可能超出了如何解决您的问题的范围,但希望能提供一定程度的洞察力。
为了在未来解决这个问题,您可以在连接到笔记本电脑的所有麻烦之前检查备份映像的一致性,以了解备份副本是否存在任何问题
这提醒了我,当
dd
“无怨无悔”完成时,live bootstick系统能看到第三个分区吗??因为如果可以的话,是否有任何尝试从那里访问您的数据?如果两者都是,那么这可能会使我刚才认为的一切无效,您的硬盘驱动器机箱的控制器可能是嫌疑人。嗯嗯...
前进 - 备份您的数据
取决于你的最终目标是什么,是否:
那么您可能希望如何进行会有所不同。这里推断和/或需要假设的主要区别是,对于上面的每个场景,然后分别在以下情况下:
既然您提到“在 [您] 确定 [您] 可以访问 [您的] 备份磁盘上的 [您的] 数据之前,您会犹豫做任何事情”,我假设您只想备份您的数据当您着手修复您的 PC 并假设
fdisk
as的输出中提到的扩展分区/dev/sda2
不包含任何需要保留的数据时,这只是/dev/sda5
相关的,因为它被提到了然后我建议您更改您的选项和标志,
dd
以便不要通过将整个磁盘直接复制到备用磁盘来备份整个磁盘,而是通过更改to 点来of
制作整个磁盘的备份映像副本dd
到已安装的备用磁盘上保存的映像文件,然后您可以将该映像虚拟地安装为虚拟系统,以避免备用驱动器上的任何分区冲突,或者更好的是,更改if
标志dd
并仅复制您的分区/dev/sda5
如果在安装两个磁盘并从 live Stick 系统引导时使用引用的命名方案,则需要。由于您在复制磁盘时避免使用
oflag=direct
or选项,因此我强烈建议您在执行上述操作时查看dd 手册页中的选项。oflag=sync
解决您的问题
是的,您是对的,但正如我们所发现的,如果没有正确记录隐藏的元数据,可能会忽略轻微的写入错误。因为它读得很好,它就是写不出来。所以,虽然很难量化你所缺少的东西,因为你似乎已经知道很多了,但我至少会简单地提到
dd
,确实会逐字节复制每一位,而且它会走这么远甚至复制未分区空间的空白空间或 NULL 字节,甚至复制曾经存在但被删除但可以恢复的未标记的“空白空间”,因此如果使用“dd”的副本包含该“空白空间”,则可以恢复。但它不仅仅是简单地读取stdin
和输出,stdout
尽管它需要结合一些选项,如果有的话,我敢说大多数人可能经常忘记考虑的是复制每个字节的实际含义或转换为,这取决于场景以及正在复制/读取的内容或使用的保存数据的介质,例如在大小或类型上与要复制的源不相似的设备。详细说明这一点的一个具体参考是,如果它不能被读取,
dd
它就不能被写入dd
. 因此,在将文件系统从一个驱动器复制到一个几乎或完全相似的驱动器方面,一些硬件级编码数据将不会被传递,并且不会被其他未存储在文件中的数据用于硬件寻址的信息位或设备本身和此类不会改变。但对一些人来说,这是显而易见的,而对另一些人来说则不是。可以肯定的是,如果它存在于一个块中并且可以被计算机读取但不显示给用户,那么它可以被复制。正如我们现在所推测的那样,导致问题的不是笔记本电脑,而是数据精确复制到不匹配的硬件和不匹配的分区方案(但更多的是后者,稍后将解释),导致分区可以' t 被操作系统识别,因此导致无法挂载。至于密码是一样的,是的,你是对的,它是一样的。
更进一步,如1.2 警告 - 克隆/成像下的LUKS 常见问题解答中所述:
是的,你是对的,它是一样的。但你的问题不是它不能识别密码,而是分区本身。
更详细的解释(不要太技术化)
虽然通过检查所提供的错误消息,不匹配的分区方案是该问题的指定嫌疑人,但该结论源于许多假定适用的经验,但与它们相关的细节可能由于它们看似无关的参与而被省略创建问题。这些考虑包括:
/dev/sda2
是扩展分区并且仅存在于 MBR 中。缺少确凿证据的部分是 PC 是在 BIOS/Legacy 还是支持 CSM 的 UEFI 中运行dd
为每个字节制作正确的副本需要离线副本,这意味着您不会安装它们来查看是否可以实际访问它们。但是我们也不知道使用什么系统来制作副本或dd
使用什么版本附加说明和注意事项
一些琐碎的符号可以帮助您在将来更有效地获得帮助或找到答案,请随意接受或留下,因为我只是将它们作为建议而不是任何形式的批评或嘲笑,因为我相信任何人都可以同样指出我也从这篇文章中指出了我的错误(意思是说我并不比你好),恕我直言:
fdisk
输出指示/dev/sda1
/dev/sda2
,/dev/sda5
然后参考使用cryptsetup
我/dev/s**d**b5
了解设备位置随每个系统而变化,但它可能会对您具体尝试的内容造成混淆,例如什么,何时,和在哪里。即从上下文中查看如何fdisk
显示分区/dev/sda
我可以假设这是在笔记本电脑上运行的,当你提到dd
命令时,通过输入标志(或if=
)判断我可以假设它是源磁盘,但如果我假设基于信息前提cryptsetup
是它与 fdisk 中提到的同一驱动器在同一驱动器上运行,并且dd
那么它必须在不同的系统上才能有不同的设备分配。相反,如果我假设它是笔记本电脑,那么我必须假设发生了某种交换以构成相同的驱动器,或者它不是接收设备映射名称更改的同一设备。虽然在这种情况下它可能不那么相关,但在其他情况下,它可能意味着一个错误超过另一个。gdisk
5TB 磁盘的输出时,可能会更清楚这是多么令人困惑这表明在引用 3 TB 磁盘时存在拼写错误,或者您的意思是说 HDD 的 3TB 分区,而后者将有助于指出由于执行命令选项标志而不是其他内容而导致的问题。dd
备份时,大小和驱动器类型非常重要。特别是如果重要数据不被视为细微差别,那么最好注意这些事情,因为我会提出可能导致使用后未报告的可能错误的问题dd
(例如dmesg
仅从bufferbloat)如果不是这里规定的情况,更具体地说是当您从较低容量驱动器转移到较高容量驱动器以及从固态驱动器转移到硬盘驱动器时使用的有效选项dd
以减轻性能问题、缓存错误以及最终传输数据的可靠性。(尽管我已经删除了所有重要事项的原始摘要,因为无论如何它都无助于解决您的问题)这似乎与使用 USB 机箱测试 3.5" 备份硬盘驱动器有关。虽然答案与 dd 无关,但我会发布它以防有人遇到类似问题。
原始驱动器使用 512 字节扇区,但显然大多数外部 3.5 英寸 USB 机箱使用的芯片组决定 Windows 是任何人可能想要使用的唯一操作系统。比尔盖茨说扇区是 4K,所以它们必须是 4K。然后很高兴报告分区的原始扇区起始编号。但现在它报告了 4K 扇区大小,然后 linux 将其转换为错误的字节偏移量。它还解释了报告的 14.6T 分区大小。
使用具有正确偏移量的环回设备确实允许安装和访问分区 --- 尽管我似乎仍然无法访问 LUKS sdb5 分区(因为它没有被报告),即使我输入了从计算的地址原始驱动器上的偏移量。数据就在那里,但令人费解的报告使 cryptsetup 无法正常工作。不确定除了获得不那么自以为是的 USB 机箱之外是否还有其他解决方法。
将 HDD(通过 sata)插入原始 PC 会显示 sdb5 分区。DD 显然确实按预期工作,甚至复制了磁盘 ID。我的 2.5" usb 机箱(用于将原始驱动器连接到笔记本电脑)没有同样的问题。它不是为 Windows 设计的,或者它只是将 512 的块大小与 SSD 相关联。无论哪种情况,它返回正确的扇区大小,我可以访问 LUKS 分区。
所以......一个关于假设即使是最简单的设备也不会试图“纠正”你的警示故事。在所有可能的世界中,一切都是最好的。