我经常使用非持久设备映射器快照,示例表如下所示:
0 10485760 snapshot /dev/sdc3 /dev/sdc6 N 16
万一发生崩溃,我仍然拥有两者/dev/sdc3
,/dev/sdc6
因为磁盘是非易失性的。但是是否有可能取回该snapshot
设备,或者至少以某种方式恢复更改/dev/sdc6
?我知道持久快照的存在是出于我的目的,但我仍然很好奇。谢谢。
答案1
这真的不可能。有些数据可能仍然存在,只是对文件系统没有意义......
快照将块设备视为具有特定块大小的数据块。当写入进入时,每个受影响的块都会通过将其复制到快照设备来保留。
文件系统写入通常是相当随机的,因此这可以以任何顺序发生。复制的块最终位于不同的偏移处。
所以快照存储元数据,元数据是(旧偏移<->新偏移)之间的关系。
对于瞬态快照,该存储仅存在于内存中。当您重新启动或以其他方式停用快照时,它会丢失。
没有这些元数据,你还有什么?
本质上,您正在查看“随机数据块”。
为了取回该快照设备,您必须能够以某种方式确定复制的每个块的原始偏移量。
但这通常是做不到的。你不知道这些块最初来自哪里。您甚至不知道这些是否是块,或者只是创建快照之前存在的旧数据。
即使您可以解决这个难题,也只有在快照未处于活动状态时原始设备不再发生写入操作时,它才会起作用。如果设备以读写方式安装,并且快照中不存在的数据块被覆盖,那么您将不再丢失元数据。你缺少数据。
所以总而言之,它被认为是无法挽回的。
例外情况也是有可能的。
如果按顺序复制了多个块,或者如果您要查找的任何数据足够小以适合单个块,那么您仍然可能幸运地找到它。同样,如果幸运的是,您可以从失败的 raid5 集中的单个磁盘中恢复某些内容(如果它恰好小到足以容纳单个数据块)。如果您愿意在没有文件系统帮助的情况下恢复一些数据。
您可能拥有以某种方式知道其自身偏移量的数据。例如,如果将 的输出写入hexdump -C
块设备,然后对其进行快照。 hexdump 打印每一行的偏移量,以便您可以从数据中导出偏移量。假设 hexdump 没有跳过任何行......
如果您使用全磁盘加密 (LUKS) 并且对整个 LUKS 设备进行快照。您的快照将包含完全随机(加密)的数据块。 LUKS 也不知道该数据的偏移量,但只要您仍然拥有 LUKS 标头并知道密钥,您就可以尝试解密每个偏移量的每个块;如果您找到解密为非随机数据的偏移量,那么这应该是正确的。但这是假设所有加密数据都是纯文本的。一旦你加密了随机数据,你就无法知道任何一种方式。
如果您的用例中写入不是随机的而是完全确定性的,则您可以通过在新快照上重复相同的操作来重现元数据。如果您知道您只使用 dd 来通过查找和计数写入数据,以及按什么顺序,也许可以完成。
但这些是您在实践中通常不会遇到的情况。它只是效果不太好。没有任何工具可以帮助您完成这项工作。