我正在使用设备映射器快照。
假设这/dev/sda
是只读的原始设备,并且/dev/sdb
是 COW 设备。我通过以下方式创建了持久快照:
# cat /dev/zero > /dev/sdb
# dmsetup create mysnap
0 1000000000 snapshot /dev/sda /dev/sdb P 16
^D
# ls /dev/mapper/
control mysnap
#
一段时间内,它运行良好。
每次启动后,为了重新连接我的持久快照,我都会运行相同的命令:
dmsetup create mysnap
0 1000000000 snapshot /dev/sda /dev/sdb P 16
但有一天我在操作过程中不小心断开了只读的 origin 设备(COW 设备还在)。出现了这样的内核消息:
device-mapper: snapshots: Invalidating snapshot: error reading/writing
发生这种情况后,任何尝试附加快照(在任何机器上)都会导致错误:
device-mapper: snapshots: Snapshot is marked invalid
设备mysnap
已创建,但它拒绝任何读/写并显示“输入/输出错误”。
是否可以清除 DM 快照上的“无效”状态并将其恢复,或者至少恢复数据?
我相信这种“无效”状态完全是人为的,因为根据我的经验,持久性 DM 快照在整个系统崩溃后仍能幸存下来。
源代码
drivers/md/dm-snap-persistent.c
说没有办法恢复无效的快照:那么您有什么选择?
但只有当所有元数据(和数据本身)完整存在时它才会起作用。
在最简单的情况下,有效标志只是在磁盘头中从 1 变为 0。
有效快照的示例:
无效快照的示例:
因此你可以盲目地尝试使其有效:
但是,这忽略了所有其他情况。在失效的快照上,数据一致性不再得到保证。因此,所呈现的数据可能仍然无效。此外,由于快照是可写的,它还可能对快照数据造成额外的损害。
在数据恢复的情况下,您可以先进行完整复制,或者...在快照上尝试这个实验...哈哈。
祝你好运?