OpenNebula 目前不支持将虚拟机从一种类型的数据存储迁移到另一种不同类型的数据存储。我一直在研究一种行之有效的方法,并希望在此处记录它以获取有关该方法的一些反馈和意见。
数据存储类型主要由传输管理器驱动程序“TM_MAD”设置标识。无法通过 Sunstone 或 cli 更改此设置。所以我们需要一种方法来做到这一点。这就是我所做的。我开始在一个 VM 中全新安装 OpenNebula 5.4.13,2 个 VM 节点都在 VMware 虚拟机中运行 Debian 9(不要忘记检查 VM CPU 选项的虚拟化)。
注意:这是一个实验过程,因此请确保先备份所有内容!
脚步
要迁移到不同的商店,我们需要执行几个步骤。它们如下:
- 设置 NFS 共享导出,
- 将 VM 映像移动到 NFS 共享并挂载数据存储,
- 更改数据存储类型,
- 为 NFS 共享配置节点。
设置 NFS 服务器
我们要做的第一件事是设置我们想要使用的 NFS 共享。我为基本数据存储文件夹使用单个共享,但您可以为来自不同 NFS 服务器的每个数据存储 ID 使用单独的共享。
- 在 NFS 服务器上创建数据存储文件夹
mkdir /share/one_datastore
,即
- 将数据存储路径添加到导出并导出新共享
exportfs -rav
,
- 确认共享可用
showmount -e localhost
准备迁移
在我们修改数据存储之前,首先要做一些事情:
- 关闭所有正在运行的虚拟机并取消部署它们。这会保存机器状态并将图像复制回图像存储,
- 停止 Sunstone 和 OpenNebula 服务
systemctl stop opennebula && systemctl stop opennebula-sunstone
。
迁移数据
共享存储共享 VM 磁盘映像,因此所有节点都可以访问相同的数据。因此,将 VM 数据复制到准备挂载的 NFS 共享。
- 从 Sunstone 前端服务器确认 NFS 共享
showmount -e [nfs-server]
,
- 创建一个临时文件夹以挂载共享
mkdir /mnt/datastore
,
- 临时挂载 NFS 文件夹
mount [nfs-server]:/share/one_datastore /mnt/datastore
,
- 将数据存储文件夹移动到共享
mv /var/lib/one/datastores/* /mnt/datastore/
- OpenNebula 数据存储文件夹现在位于 NFS 服务器上:
ls /mnt/datastore
应该列出文件夹 0、1 和 2,
- 挂载 NFS 共享以替换 OpenNebula 数据存储文件夹
mount [nfs-server]:/share/one_datastore /var/lib/one/datastores
,
- 确认文件夹可用
ls /var/lib/one/datastores
应列出我们的 3 个文件夹 0、1 和 2,
- 将挂载添加到 /etc/fstab 以在启动时保持挂载。
OpenNebula 前端现在配置为从 NFS 共享访问数据存储文件夹。接下来,我们要将数据存储类型从 ssh 更改为 shared。
更改数据存储类型
数据存储配置的数据存储在 OpenNebula 数据库/var/lib/one/one.db
中。我们可以通过编辑数据存储配置数据来更改驱动程序类型,然后告诉 OpenNebula 使用哪些驱动程序,以及如何处理数据存储数据。默认情况下,OpenNebula 使用带有 MySql 选项的 sqlite 数据库。我正在使用 sqlite,但同样适用于 MySql。
- 打开 OpenNebula 数据库
sqlite3 /var/lib/one/one.db
,
- 查看所有带有 的表格
.tables
。datastore_pool
是我们要修改的表,
- 列出表中的所有记录
select * from datastore_pool;
将导致屏幕充满配置数据。每条记录都有一个oid
与数据存储 ID 匹配的标识符,如下所示(第一个 0 是默认 SYSTEM 数据库的数据存储 ID):
0|system|<DATASTORE><ID>0</ID><UID>0</UID><GID>0</GID><UNAME>oneadmin</UNAME><GNAME>oneadmin</GNAME><NAME>system</NAME><PERMISSIONS><OWNER_U>1</OWNER_U><OWNER_M>1</OWNER_M><OWNER_A>0</OWNER_A><GROUP_U>1</GROUP_U><GROUP_M>0</GROUP_M><GROUP_A>0</GROUP_A><OTHER_U>0</OTHER_U><OTHER_M>0</OTHER_M><OTHER_A>0</OTHER_A></PERMISSIONS><DS_MAD><![CDATA[-]]></DS_MAD><TM_MAD><![CDATA[ssh]]></TM_MAD><BASE_PATH><![CDATA[/var/lib/one//datastores/0]]></BASE_PATH><TYPE>1</TYPE><DISK_TYPE>0</DISK_TYPE><STATE>0</STATE><CLUSTERS><ID>0</ID></CLUSTERS><TOTAL_MB>0</TOTAL_MB><FREE_MB>0</FREE_MB><USED_MB>0</USED_MB><IMAGES></IMAGES><TEMPLATE><ALLOW_ORPHANS><![CDATA[NO]]></ALLOW_ORPHANS><DISK_TYPE><![CDATA[FILE]]></DISK_TYPE><DS_MIGRATE><![CDATA[YES]]></DS_MIGRATE><RESTRICTED_DIRS><![CDATA[/]]></RESTRICTED_DIRS><SAFE_DIRS><![CDATA[/var/tmp]]></SAFE_DIRS><SHARED><![CDATA[NO]]></SHARED><TM_MAD><![CDATA[ssh]]></TM_MAD><TYPE><![CDATA[SYSTEM_DS]]></TYPE></TEMPLATE></DATASTORE>|0|0|1|1|0
- 现在更改数据存储类型。从第 3 列
body
(您可以运行select body from datastore_pool where oid=0;
)获取数据并复制到您喜欢的文本编辑器(即以 <DATASTORE> 开头并以 </DATASTORE> 结尾的块)。查找和替换:
查找:<TM_MAD><![CDATA[ssh]]></TM_MAD>
替换为:<TM_MAD><![CDATA[shared]]></TM_MAD>
查找:<SHARED><![CDATA[NO]]></SHARED>
替换为:<SHARED><![CDATA[YES]]></SHARED>
- 现在更新 SYSTEM 数据存储记录。在数据库上运行以下命令,将 [datastore-config] 替换为您刚刚修改的文本块
update datastore_pool set body='[datastore-config]' where oid=0
,
- 更新 IMAGE 数据存储有点不同。没有 SHARED 选项,但我们想使用
shared
或qcow2
驱动程序。我用的是qcow2。所以select body from datastore_pool where oid=1;
:
查找:<TM_MAD><![CDATA[ssh]]></TM_MAD>
替换:<TM_MAD><![CDATA[qcow2]]></TM_MAD>
- 更新记录:
update datastore_pool set body='[datastore-config]' where oid=1;
,
- 通过使用上述方法替换和更新来更新 FILES 数据存储 (oid=3)
<TM_MAD><![CDATA[ssh]]></TM_MAD>
。<TM_MAD><![CDATA[shared]]></TM_MAD>
现在数据存储已更新为使用共享驱动程序,让我们启动 Sunstone 并检查数据存储是否显示。
systemctl start opennebula && systemctl start opennebula-sunstone
跳转到 Sunstone 网站并转到数据存储区。打开每个数据存储以检查是否启用了 SHARED,并显示正确的驱动程序,即 shared 或 qcow2。
〜不要做任何事情〜仍然需要配置节点!
配置节点
因此,因为我们停止并取消了虚拟机的部署,节点数据存储中不应该有任何数据。因此,我们只需将 NFS 共享设置到数据存储文件夹即可。首先确认文件夹是空的,并确保进行备份!这是一个实验过程,因此请注意!好吧,让我们开始吧:
- 检查的内容
/var/lib/one/datastores
。如果要将每个基于数据存储 ID 的文件夹挂载到其自己的 NFS 共享,则可以执行此操作而不是整个数据存储文件夹。清空包含 0、1 和 2 个文件夹的所有文件夹。否则从数据存储文件夹中删除所有文件夹,
- 如果尚未安装:
apt-get install nfs-common
,
- 检查 NFS 共享:
showmount -e [nfs-server]
,
- 将 nfs 共享挂载到数据存储文件夹:
mount [nfs-server]:/share/one_datastore /var/lib/one/datastores
,
- 确认安装
df
,即
- 编辑
/etc/fstab
添加挂载,以便在下次启动时挂载。
- 重新启动您的节点以确认数据存储 nfs 仍然存在,并重新启动它们!
对所有主机节点重复。
测试一下
在 Sunstone 中,转到 Hosts TAB 并检查它们是否已启动并正在运行。接下来去获取一个虚拟机并部署它。它应该毫无问题地部署并开始启动。
一旦启动并运行,我喜欢在测试实时迁移时不断地 ping 虚拟机。因此,开始 ping(ping [vm-ip] -t
在 Windows 中),然后在 Sunstone 中打开 VM 并执行“实时迁移”到另一个节点。观察 ping 并检查日志以确保它成功。我发现我必须刷新显示,然后转到主机选项卡以检查 VM 是否已迁移。之后它显示正确,但我认为这是我浏览器中的缓存问题。在实时迁移之后,您应该仍然可以看到 ping 滚动,结果中可能有一个失败的 ping。
结论
这就是我用来从 ssh 本地存储迁移到共享存储的过程。我已经对其进行了测试,它可以正常工作。但是,如果您对此过程有任何问题或有意见,请告诉我。如果我忽略了任何陷阱,请也告诉我。
好吧,玩得开心。我要去尝试将共享存储移动到某种共享集群,如 Ceph 或 GlusterFS!