几天前,我们的 Ceph 集群死机了 - 没有人知道原因,但似乎监视器刚刚被删除。当尝试将它们重新添加到 ceph.conf 时,我们在启动 ceph 时遇到超时并出现以下错误:
7f1b04382700 0 -- :/3908692206 >> 172.16.50.2:6789/0 pipe(0x7f1b0005a060 sd=3 :0 s=1 pgs=0 cs=0 l=1 c=0x7f1b0005e350).fault
(172.16.50.2 是 ceph 监视器应该运行的节点...)
由于我们无法重新启动集群 (Proxmox),因此我们希望从 Ceph OSD 中的所有虚拟机中提取映像。为此,我编写了一个脚本,从 OSD 收集有关数据的信息并重新组合收集的文件。
这些文件的名称类似于
current/1.382_head/DIR_2/DIR_8/DIR_3/rbd\udata.147082238e1f29.0000000000009238__head_CB25F382__1
其中 147082238e1f29 似乎是 VM 映像的 ID,0000000000009238 似乎是“偏移量”。因此,我列出了具有相同 ID 的所有文件,并根据它们的偏移量对它们进行了排序。问题是:存在间隙...并非所有偏移都出现在 OSD 上。
因此,当使用 dd 将所有这些文件放在一起时,图像似乎已损坏 - 因为存在间隙。
任何人都可以帮助我们解决启动 ceph 时的超时问题,或者至少帮助我们提取 VM 映像吗?
答案1
经过更多的祈祷后,我真的得到了:
我指定了错误的块大小,并更改为使用偏移量进行复制,而不是插入“0-块”。
仅从 OSD 提取图像(没有其他工作):
https://gitlab.lbader.de/kryptur/ceph-recovery/tree/master
现在我可以从 OSD 中提取虚拟机并将映像复制到新的集群。