这里写自定义目录标题
- 一、openstack虚机重启无法启动或者云盘无法挂载问题(rbd的header元数据丢失问题)
- 1、openstack计算节点报错现象
- 2、存储侧的rbd报错
- 3、解决思路
- 4、解决办法
- 4.1 先看下正常的rbd的元数据信息
- 4.2 查找丢失的header
- 4.3 生成反编码属性
- 4.3.1 features
- 4.3.2 object_prefix
- 4.3.3 order
- 4.3.4 size
- 4.3.5 snap_seq
- 4.3.6 parent(系统盘)
- 4.4 操作汇总
- 5、如果是vms_pool出现问题
- 5.1 替换vms_config
- 6、定位header
一、openstack虚机重启无法启动或者云盘无法挂载问题(rbd的header元数据丢失问题)
1、openstack计算节点报错现象
场景:用户在基于openstack的平台上申请了云主机及挂载了对应的云盘,使用过程发现数据盘异常,重启后发现数据盘无法挂载:
2024-07-03 21:01:29.178 6 ERROR nova.virt.block_device [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] six.reraise(c, e, tb)
2024-07-03 21:01:29.178 6 ERROR nova.virt.block_device [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/eventlet/tpool.py", line 83, in tworker
2024-07-03 21:01:29.178 6 ERROR nova.virt.block_device [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] rv = meth(*args, **kwargs)
2024-07-03 21:01:29.178 6 ERROR nova.virt.block_device [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/usr/lib64/python2.7/site-packages/libvirt.py", line 605, in attachDeviceFlags
2024-07-03 21:01:29.178 6 ERROR nova.virt.block_device [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] if ret == -1: raise libvirtError ('virDomainAttachDeviceFlags() failed', dom=self)
2024-07-03 21:01:29.178 6 ERROR nova.virt.block_device [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] libvirtError: internal error: unable to execute QEMU command '__com.redhat_drive_add': Device 'drive-virtio-disk1' could not be initialized
2024-07-03 21:01:29.178 6 ERROR nova.virt.block_device [instance: 78137d40-c031-45cf-a6df-922b3c69fb22]
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [req-014e3f73-4eda-4725-8fd3-5bdaf93528a3 aaee0e146d5b46dca639ee70ce6a2e4e 8f187a7003bb4aa0aa8e731066f857e1 - - -] [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] Failed to attach 3cba4ee1-b2cd-4761-afcd-ea600fc5e78c at /dev/vdb
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] Traceback (most recent call last):
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/nova/compute/manager.py", line 4926, in _attach_volume
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] do_check_attach=False, do_driver_attach=True)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/nova/virt/block_device.py", line 48, in wrapped
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] ret_val = method(obj, context, *args, **kwargs)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/nova/virt/block_device.py", line 291, in attach
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] connector)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/usr/lib/python2.7/site-packages/oslo_utils/excutils.py", line 220, in __exit__
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] self.force_reraise()
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/usr/lib/python2.7/site-packages/oslo_utils/excutils.py", line 196, in force_reraise
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] six.reraise(self.type_, self.value, self.tb)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/nova/virt/block_device.py", line 282, in attach
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] device_type=self['device_type'], encryption=encryption)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/nova/virt/libvirt/driver.py", line 1362, in attach_volume
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] self._disconnect_volume(connection_info, disk_dev)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/usr/lib/python2.7/site-packages/oslo_utils/excutils.py", line 220, in __exit__
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] self.force_reraise()
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/usr/lib/python2.7/site-packages/oslo_utils/excutils.py", line 196, in force_reraise
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] six.reraise(self.type_, self.value, self.tb)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/nova/virt/libvirt/driver.py", line 1351, in attach_volume
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] guest.attach_device(conf, persistent=True, live=live)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/nova/virt/libvirt/guest.py", line 309, in attach_device
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] self._domain.attachDeviceFlags(device_xml, flags=flags)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/eventlet/tpool.py", line 186, in doit
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] result = proxy_call(self._autowrap, f, *args, **kwargs)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/eventlet/tpool.py", line 144, in proxy_call
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] rv = execute(f, *args, **kwargs)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/eventlet/tpool.py", line 125, in execute
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] six.reraise(c, e, tb)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/var/lib/kolla/venv/lib/python2.7/site-packages/eventlet/tpool.py", line 83, in tworker
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] rv = meth(*args, **kwargs)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] File "/usr/lib64/python2.7/site-packages/libvirt.py", line 605, in attachDeviceFlags
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] if ret == -1: raise libvirtError ('virDomainAttachDeviceFlags() failed', dom=self)
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22] libvirtError: internal error: unable to execute QEMU command '__com.redhat_drive_add': Device 'drive-virtio-disk1' could not be initialized
2024-07-03 21:01:29.427 6 ERROR nova.compute.manager [instance: 78137d40-c031-45cf-a6df-922b3c69fb22]
2024-07-03 21:01:29.533 6 ERROR oslo_messaging.rpc.server [req-014e3f73-4eda-4725-8fd3-5bdaf93528a3 aaee0e146d5b46dca639ee70ce6a2e4e 8f187a7003bb4aa0aa8e731066f857e1 - - -] Exception during message handling
2、存储侧的rbd报错
[root@rg8-ceph001 mmwei]# rbd info -p sata_pool volume-3cba4ee1-b2cd-4761-afcd-ea600fc5e78c
2024-07-02 00:57:50.150559 7ff4b56b3700 -1 librbd::image::OpenRequest: failed to retreive immutable metadata: (2) No such file or directory
rbd: error opening image volume-3cba4ee1-b2cd-4761-afcd-ea600fc5e78c: (2) No such file or directory
3、解决思路
大致的解决思路:
- 通过反编码生成对应的元数据的各个属性,比如features、object_prefix、order、parent、size、snap_seq
- 其中这里如果是系统盘,则会多一个parent属性(基于镜像启动)
- 具体的每个属性的编码情况需要在同集群的同pool下找一个正常的观察比对
- 建议有条件的定期对rbd的header信息进行备份
4、解决办法
4.1 先看下正常的rbd的元数据信息
[root@rg8-ceph001 mmwei]# rados -p sata_pool listomapvals rbd_header.24555242b39104 # 普通数据盘
features
value (8 bytes) :
00000000 01 00 00 00 00 00 00 00 |........|
00000008
object_prefix
value (27 bytes) :
00000000 17 00 00 00 72 62 64 5f 64 61 74 61 2e 32 34 35 |....rbd_data.245|
00000010 35 35 32 34 32 62 33 39 31 30 34 |55242b39104|
0000001b
order
value (1 bytes) :
00000000 16 |.|
00000001
size
value (8 bytes) :
00000000 00 00 00 00 19 00 00 00 |........|
00000008
snap_seq
value (8 bytes) :
00000000 00 00 00 00 00 00 00 00 |........|
00000008
[root@rg8-ceph001 mmwei]# rados -p sata_pool listomapvals rbd_header.7954f2d5e14dff # 基于镜像的系统盘
features
value (8 bytes) :
00000000 01 00 00 00 00 00 00 00 |........|
00000008
object_prefix
value (27 bytes) :
00000000 17 00 00 00 72 62 64 5f 64 61 74 61 2e 37 39 35 |....rbd_data.795|
00000010 34 66 32 64 35 65 31 34 64 66 66 |4f2d5e14dff|
0000001b
order
value (1 bytes) :
00000000 16 |.|
00000001
parent
value (48 bytes) :
00000000 01 01 2a 00 00 00 02 00 00 00 00 00 00 00 0e 00 |..*.............|
00000010 00 00 66 63 32 36 36 37 36 62 36 31 32 31 63 35 |..fc26676b6121c5|
00000020 53 0c 00 00 00 00 00 00 00 00 00 40 01 00 00 00 |S..........@....|
00000030
size
value (8 bytes) :
00000000 00 00 00 00 19 00 00 00 |........|
00000008
snap_seq
value (8 bytes) :
00000000 00 00 00 00 00 00 00 00 |........|
00000008
4.2 查找丢失的header
需要先根据debug的信息,确认丢失的volume的header信息,比如这块盘hdd3_pool/volume-1fa15d38-3e0a-450a-b60f-288faf6235b3
# 这条命令的目的是以详细模式获取特定RBD镜像的信息,并在必要时调整调试级别以获取更详细的信息
[root@rg8-ceph001 mmwei]# rbd info hdd3_pool/volume-1fa15d38-3e0a-450a-b60f-288faf6235b3 --debug-rbd 20 --debug-ms 1
......
# 这里输出信息比较多,就不展示了,可以找如下类似语句:
2024-07-04 14:13:46.051067 xxx osd_op(client.1396044205.0:3 3.9660c11e rbd_header.24555242b39104 [call rbd.get_size,call rbd.get_object_prefix] snapc 0=[] ack+read+known_if_redirected e820954) v7 -- ?+0 0x7f49740079c0 con 0x7f4974006560
# 可以看到以上输出信息中能够确认:rbd_header.24555242b39104 就是我们要还原的rbd的header
命令解释:
-
rbd
: 是用于管理Ceph块设备(RBD)的命令行工具。 -
info
: 是命令,用于获取指定RBD镜像的信息。 -
hdd3_pool/volume-1fa15d38-3e0a-450a-b60f-288faf6235b3
: 是要查询的RBD镜像的完整名称,格式为<pool-name>/<image-name>
。 -
--debug-rbd 20
: 是用于设置RBD调试信息的选项,这里设置为20级别的详细度。 -
--debug-ms 1
: 是用于设置与Ceph Messenger调试相关的选项,这里设置为1级别的详细度。
4.3 生成反编码属性
4.3.1 features
- features
- 我们可以看到这个需要生成的features属性信息如下:
features
value (8 bytes) :
00000000 01 00 00 00 00 00 00 00 |........|
00000008
- 键名:
features
- 值:
01 00 00 00 00 00 00 00
这个值是一个8字节的数据,以十六进制表示为 01 00 00 00 00 00 00 00
。在Ceph的RADOS Block Device(RBD)中,features
字段通常用于指示RBD镜像的特性和支持的功能。
- 第一个字节 (0x01):
- 这通常用来表示一个位掩码的开关,用于指示特定的功能是否启用或支持。在很多系统中,第一个字节的最低位(最右边的位)被用来表示一个功能的状态,例如是否启用或禁用某项功能。
- 其余字节 (0x00 00 00 00 00 00 00):
- 这些字节通常用作填充或保留位,以确保整个字段达到了8字节的长度。在一些系统中,这些字节可能会用来表示更多的功能位或是其他的状态信息,取决于具体的实现和需求。
features
字段的具体含义和使用取决于具体的应用和RBD镜像的配置。它可以用来指示RBD镜像的能力和支持的功能,例如是否启用了快照、克隆、异步复制等特性
那么了解了这个字段后,我们该如何生成呢:
事实上我们可以直接操作rados,而不需要去操作DB, 我们需要提前找个正常的volume,观察下features属性,并进行编码
[root@rg8-ceph001 mmwei]# echo -en \\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00 | sudo rados -p hdd1_pool setomapval rbd_header.24555242b39104 features
# 这个操作将会生成:(通过rados -p hdd1_pool listomapvals rbd_header.24555242b39104)
features
value (8 bytes) :
00000000 01 00 00 00 00 00 00 00 |........|
00000008
4.3.2 object_prefix
- object_prefix
- 我们可以看到这个需要生成的object_prefix属性信息如下:
object_prefix
value (27 bytes) :
00000000 17 00 00 00 72 62 64 5f 64 61 74 61 2e 32 34 35 |....rbd_data.245|
00000010 35 35 32 34 32 62 33 39 31 30 34 |55242b39104|
0000001b
- 键名:
object_prefix
- 值:
17 00 00 00 72 62 64 5f 64 61 74 61 2e 32 34 35 35 35 32 34 32 62 33 39 31 30 34
这个值是一个27字节的数据,以十六进制表示为 17 00 00 00 72 62 64 5f 64 61 74 61 2e 32 34 35 35 35 32 34 32 62 33 39 31 30 34
。在Ceph的RADOS Block Device(RBD)中,object_prefix
字段通常用于标识RBD镜像中数据对象的前缀。
详细解释每个字节的含义:
- 前四个字节 (0x17 00 00 00):
- 这可能是一个表示长度或标识符的字段。在这里,
0x17
可能指示后续的字符串长度为 23 个字节。
- 这可能是一个表示长度或标识符的字段。在这里,
- 接下来的字符串 (0x72 62 64 5f 64 61 74 61 2e 32 34 35 35 35 32 34 32 62 33 39 31 30 34):
- 这部分是实际的对象前缀字符串,通常用来标识RBD镜像中数据对象的前缀。在这个例子中,字符串是
rbd_data.24555242b39104
。
- 这部分是实际的对象前缀字符串,通常用来标识RBD镜像中数据对象的前缀。在这个例子中,字符串是
object_prefix
字段的具体含义是为了帮助唯一标识和组织RBD镜像中的数据对象。
那么了解了这个字段后,我们该如何生成呢:
同样需要找个正常的volume进行属性观察比较
# 这里拿 rbd_header.84ccce2a65a8a3 做测试
[root@rg8-ceph001 mmwei]# echo -en \\x17\\x00\\x00\\x00\\x72\\x62\\x64\\x5f\\x64\\x61\\x74\\x61\\x2e\\x38\\x34\\x63\\x63\\x63\\x65\\x32\\x61\\x36\\x35\\x61\\x38\\x61\\x33 |rados -p sata_pool setomapval rbd_header.84ccce2a65a8a3 object_prefix
# 或者使用另外一种方式也可以:
[root@rg8-ceph001 mmwei]# echo -en \\x17\\x00\\x00\\x00rbd_data.84ccce2a65a8a3 |rados -p sata_pool setomapval rbd_header.84ccce2a65a8a3 object_prefix
这个操作将会生成:
object_prefix
value (27 bytes) :
00000000 17 00 00 00 72 62 64 5f 64 61 74 61 2e 38 34 63 |....rbd_data.84c|
00000010 63 63 65 32 61 36 35 61 38 61 33 |cce2a65a8a3|
0000001b
# 比对发现:
除了占位符:其他都是对rbd_data.84ccce2a65a8a3 编码
具体编码:将字符串 rbd_data.84ccce2a65a8a3
中的每个字符转换为其对应的 ASCII 十六进制值。
字符 | ASCII 十六进制 |
---|---|
r | 72 |
b | 62 |
d | 64 |
_ | 5f |
d | 64 |
a | 61 |
t | 74 |
a | 61 |
. | 2e |
8 | 38 |
4 | 34 |
c | 63 |
c | 63 |
c | 63 |
e | 65 |
2 | 32 |
a | 61 |
6 | 36 |
5 | 35 |
a | 61 |
8 | 38 |
a | 61 |
3 | 33 |
4.3.3 order
- order
- 我们可以看到这个需要生成的order属性信息如下:
order
value (1 bytes) :
00000000 16 |.|
00000001
- 键名:
order
- 值:
16
这个值是一个字节的数据,以十六进制表示为 16
。在Ceph的RADOS Block Device(RBD)中,order
字段通常用于表示数据存储的顺序。
- 值
16
: 这个字节表示RBD镜像的数据存储顺序。具体的含义可以因实现和上下文而有所不同,但通常情况下,这个值可能表示数据块的大小或存储的排列顺序。
在一些情况下,order
字段可能是预先定义的数值,用来指定RBD镜像的一些基本特性或配置参数。
那么了解了这个字段后,我们该如何生成呢:
[root@rg8-ceph001 mmwei]# echo -en \\x16|rados -p sata_pool setomapval rbd_header.84ccce2a65a8a3 order
这个操作将会生成:
order
value (1 bytes) :
00000000 16 |.|
00000001
4.3.4 size
- size
- 我们可以看到这个需要生成的size属性信息如下:
size
value (8 bytes) :
00000000 00 00 00 80 0c 00 00 00 |........|
00000008
- 键名:
size
- 值:
00 00 00 80 0c 00 00 00
这个值是一个8字节的数据,以十六进制表示为 00 00 00 80 0c 00 00 00
。在Ceph的RADOS Block Device(RBD)中,size
字段通常用于表示RBD镜像的大小。
- 前四个字节 (0x00 00 00 80):
- 这部分是一个32位整数,表示RBD镜像的大小。在这个例子中,大小为
0x800c0000
,转换为十进制是134217728
字节,或约128 MB
。
- 这部分是一个32位整数,表示RBD镜像的大小。在这个例子中,大小为
- 后四个字节 (0x0c 00 00 00):
- 这部分可能是填充字节或保留字段,在这个例子中没有显示具体的用途或值。
size
字段用来指示RBD镜像的存储空间大小,这对于管理和配置存储分配非常重要。
那么了解了这个字段后,我们该如何生成呢:
[root@rg8-ceph001 mmwei]# echo -en \\x00\\x00\\x00\\x80\\x0c\\x00\\x00\\x00 | sudo rados -p sata_pool setomapval rbd_header.84ccce2a65a8a3 size
这个操作将会生成:
size
value (8 bytes) :
00000000 00 00 00 80 0c 00 00 00 |........|
00000008
4.3.5 snap_seq
- snap_seq
- 我们可以看到这个需要生成的snap_seq属性信息如下:
snap_seq
value (8 bytes) :
00000000 00 00 00 00 00 00 00 00 |........|
00000008
- 键名:
snap_seq
- 值:
00 00 00 00 00 00 00 00
这个值是一个8字节的数据,以十六进制表示为 00 00 00 00 00 00 00 00
。在Ceph的RADOS Block Device(RBD)中,snap_seq
字段通常用于表示RBD镜像的快照序列号。
- 这个字段的值为全零,表示当前RBD镜像没有任何快照。快照序列号通常用来标识和管理RBD镜像的快照,每创建一个新的快照,序列号会增加。然而,如果值为全零,说明当前没有任何快照存在。
那么了解了这个字段后,我们该如何生成呢:
[root@rg8-ceph001 mmwei]# echo -en \\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00 | sudo rados -p sata_pool setomapval rbd_header.84ccce2a65a8a3 snap_seq
这个操作将会生成:
snap_seq
value (8 bytes) :
00000000 00 00 00 00 00 00 00 00 |........|
00000008
4.3.6 parent(系统盘)
- parent
- 我们可以看到这个需要生成的parent属性信息如下:
parent
value (48 bytes) :
00000000 01 01 2a 00 00 00 02 00 00 00 00 00 00 00 0e 00 |..*.............|
00000010 00 00 66 63 32 36 36 37 36 62 36 31 32 31 63 35 |..fc26676b6121c5|
00000020 53 0c 00 00 00 00 00 00 00 00 00 40 01 00 00 00 |S..........@....|
00000030
- 键名:
parent
- 值:
01 01 2a 00 00 00 02 00 00 00 00 00 00 0e 00 00 00 66 63 32 36 36 37 36 62 36 31 32 31 63 35 53 0c 00 00 00 00 00 00 00 00 00 40 01 00 00 00
这个值是一个48字节的数据,以十六进制表示。在Ceph的RADOS Block Device(RBD)中,parent
字段通常用于表示RBD镜像的父镜像信息。
- 这个值包含了父镜像的相关信息,具体结构和含义取决于实际的使用场景和实现细节。通常,父镜像信息可能包括父镜像的ID、大小、特性等。
- 那么了解了这个字段后,我们该如何生成呢:
[root@rg8-ceph001 mmwei]# echo -en \\x01\\x01\\x2a\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x0e\\x00\\x00\\x00\\x66\\x63\\x32\\x36\\x36\\x37\\x36\\x62\\x36\\x31\\x32\\x31\\x63\\x35\\x53\\x0c\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x40\\x01\\x00\\x00\\x00 |rados -p sata_pool setomapval rbd_header.84ccce2a65a8a3 parent
这个操作将会生成:
parent
value (48 bytes) :
00000000 01 01 2a 00 00 00 02 00 00 00 00 00 00 00 0e 00 |..*.............|
00000010 00 00 66 63 32 36 36 37 36 62 36 31 32 31 63 35 |..fc26676b6121c5|
00000020 53 0c 00 00 00 00 00 00 00 00 00 40 01 00 00 00 |S..........@....|
00000030
# 或者可以反编码确认下是什么信息,直接echo -ne也是可以的
4.4 操作汇总
# 普通云盘
[root@rg8-ceph001 mmwei]# echo -en \\x3d\\x00\\x00\\x00\\x00\\x00\\x00\\x00 | sudo rados -p sata_pool setomapval rbd_header.55057c65d568a6 features
[root@rg8-ceph001 mmwei]# echo -en \\x16\\x00\\x00\\x00rbd_data.2a41bd7632bf16 | sudo rados -p sata_pool setomapval rbd_header.2a41bd7632bf16 object_prefix
[root@rg8-ceph001 mmwei]# echo -en \\x16 | sudo rados -p sata_pool setomapval rbd_header.2a41bd7632bf16 order
[root@rg8-ceph001 mmwei]# echo -en \\x00\\x00\\x00\\x\\x00\\x00\\x00\\x00 | sudo rados -p sata_pool setomapval rbd_header.2a41bd7632bf16 size
[root@rg8-ceph001 mmwei]# echo -en \\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00 | sudo rados -p sata_pool setomapval rbd_header.2a41bd7632bf16 snap_seq
# 基于镜像启动的系统盘
需要多添加一个parent
[root@rg8-ceph001 mmwei]# echo -en \\x01\\x01\\x2a\\x00\\x00\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x0e\\x00\\x00\\x00\\x66\\x63\\x32\\x36\\x36\\x37\\x36\\x62\\x36\\x31\\x32\\x31\\x63\\x35\\x53\\x0c\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x40\\x01\\x00\\x00\\x00 |rados -p sata_pool setomapval rbd_header.84ccce2a65a8a3 parent
# 正常后
[root@rg8-ceph001 mmwei]# rbd info sata_pool/volume-3cba4ee1-b2cd-4761-afcd-ea600fc5e78c
rbd image 'volume-3cba4ee1-b2cd-4761-afcd-ea600fc5e78c':
size 200 GB in 51200 objects
order 22 (4096 kB objects)
block_name_prefix: rbd_data.2a41bd7632bf16
format: 2
features: layering
flags:
[root@rg8-ceph001 mmwei]#
5、如果是vms_pool出现问题
5.1 替换vms_config
虚机重启发现无法启动,提升ffed7c31-5749-4ddd-8b88-a44b85d70e87_disk.config (2) No such file or directory
# 假设ffed7c31-5749-4ddd-8b88-a44b85d70e87 系统盘出现问题
# 假设8fed7c31-5749-4ddd-8b88-a44b85d70e88 系统盘正常
[root@rg8-ceph001 mmwei]# rbd rm ffed7c31-5749-4ddd-8b88-a44b85d70e87_disk.config -p vms
[root@rg8-ceph001 mmwei]# rbd cp ffed7c31-5749-4ddd-8b88-a44b85d70e87_disk.config 8fed7c31-5749-4ddd-8b88-a44b85d70e88_disk.config
# 硬重启虚机,变可恢复
6、定位header
# 先确认云盘在哪个osd上
[root@rg8-ceph001 mmwei]# ceph osd map sata_pool rbd_header.84ccce2a65a8a3
osdmap e536228 pool 'sata_pool' (1) object 'rbd_header.84ccce2a65a8a3' -> pg 1.867bd707 (1.1707) -> up ([309,118,27], p309) acting ([309,118,27], p309)
# 然后去对应的osd上寻找
[root@rg8-ceph004 DIR_B]# pwd
/var/lib/ceph/osd/ceph-27/current/1.1707_head/DIR_7/DIR_0/DIR_7/DIR_D/DIR_B
# 使用 find . -name '*84ccce2a65a8a3*'
# 通过osd正常便能找到
[root@rg8-ceph004 DIR_B]# getfattr -d -m - rbd\\uheader.84ccce2a65a8a3__head_867BD707__1
# file: rbd\134uheader.84ccce2a65a8a3__head_867BD707__1
user.ceph._=0sEAhgAgAABAM6AAAAAAAAABkAAAByYmRAAYDHAAAAAEAAAAAAAAA/////wAAAABTi9CgAAAACnLggAAgIVAAAACBi1xT8AAAAABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAgYtcU/AAAAAAQDlAAAAIDYHemUVQAAHgAAAA==
user.ceph._@1=0sAAAAAPSmhiYAAgAArB/QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQAvQoAAAAAAAAAAAABAAAAgNgd6ZRVAAAIGLXFPwAAAAAEA5QAAACA2B3plFUAAB4AAAAAAAAA9KaGJgACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
user.ceph._@2=0sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcAAAAplKGZo4gFR7//////////wAAAAAAAAAAAAAAAAAAAAAAAAAA
user.ceph.snapset=0sAgIZAAAAAAAAAAAAAAAAAAAA==
user.cephos.spill_out=0sMAA=
但是能否通过这个header的内容快速找到对应的扩展属性信息就需要进一步研究了。