在我们的 OpenStack 云中,有一台带有 的服务器server_id
和一个带有 的卷<volume_id>
。我们遇到的情况是,从 Nova 的角度来看,似乎有一个卷已连接,但从 Cinder 的角度来看却没有。nova 数据库中有一条关于此连接的记录:MariaDB [(none)]> select * from block_device_mapping where instance_uuid = "<volume_id>"
,显示该条目。
Nova 显示附件:
openstack server show <server_id>
+-------------------------------------+----------------------------------------------------------+
| Field | Value |
+-------------------------------------+---------------------------------------------------------
| volumes_attached | id='...' |
| | id='<volume_id' |
+-------------------------------------+----------------------------------------------------------+
Cinder,不知道此附件:
openstack volume show <volume_id>
+--------------------------------+--------------------------------------+
| Field | Value |
+--------------------------------+--------------------------------------+
| attachments | [] |
从虚拟机内部来看,该卷似乎已连接并可进行操作。
我尝试将卷设置为available
和detached
状态,但在我尝试过的任何状态下都无法将其连接。
它也尝试完全删除附件。当运行openstack server remove volume
或nova volume-detach
命令完成且没有错误时,cinder 日志显示:Roll detaching of volume completed successfully.
但是,情况并没有改变。
从这种情况中恢复的最佳方法是什么?对于这个特定的虚拟机,我想我可以从中删除数据库条目block_device_mapping
并重建虚拟机?对于未来,我想知道是否也可以修复 OpenStack 中的情况以反映现实世界的情况。这意味着,我有什么方法可以添加附件,以便它也可以在 Cinder 中看到?
答案1
对于任何情况,如果有人仍在寻找解决方案:您需要在表 block_device_mapping(nova DB)中找到记录并将其删除。
select * from nova.block_device_mapping where deleted_at is NULL and volume_id = 'vol_id'\G
用事务删除时要小心,因为错误的操作可能会带来很大的危害:
BEGIN;
UPDATE nova.block_device_mapping SET deleted=id, deleted_at=NOW() WHERE id='vol_id' LIMIT 1;
#select to check that you have made it right and, if all is correct, COMMIT (ROLLBACK if it is wrong)
COMMIT;
之后硬重启虚拟机。
在 cinder DB 中,您可以检查 volume_attachment 表(以确保)
select * from cinder.volume_attachment where volume_id = '' and deleted <> '1'\G