需求:使用openstack云主机+EMC存储实现oracle RAC
分析:由于openstack的磁盘设备由cinder管理,目前cinder同一个卷不支持同时连接到多台云主机,事实上其他公有云上的云磁盘也暂时不支持。故不能通过cinder添加磁盘到云主机。
临时解决方案:
手动把宿主机的磁盘(使用了multipath映射EMC存储)映射到kvm虚拟机上,命令如下:
virsh list virsh attach-disk instance-xxxxxxxx /dev/mapper/mpatha sda --sourcetype block --driver qemu virsh attach-disk instance-xxxxxxxx /dev/mapper/mpathb sdb --sourcetype block --driver qemu ...
磁盘在云主机中映射的名称由顺序决定(sdx),与映射时候指定的名称无关,但取消映射时候的名称需要与映射时候指定的名称一致,或者使用块设备路径,取消映射命令如下:
virsh detach-disk instance-xxxxxxxx [ sda | /dev/mapper/mpatha ]
以上操作是临时生效,重启云主机后即失效,如果是单独使用kvm(不使用openstack管理)的话可以写入到永久配置,通过dumpxml可以看到映射部分的配置,把配置写入配置文件中保存:
virsh edit instance-xxxxxxxx
在</disk>和<conntroller>之间插入以下内容:
<disk type=‘block‘ device=‘disk‘> <driver name=‘qemu‘ type=‘raw‘/> <source dev=‘/dev/mapper/mpatha‘/> <backingStore/> <target dev=‘sda‘ bus=‘scsi‘/> <alias name=‘scsi0-0-0-0‘/> <address type=‘drive‘ controller=‘0‘ bus=‘0‘ target=‘0‘ unit=‘0‘/> </disk> <disk type=‘block‘ device=‘disk‘> <driver name=‘qemu‘ type=‘raw‘/> <source dev=‘/dev/mapper/oggvg-ogglv‘/> <backingStore/> <target dev=‘sdb‘ bus=‘scsi‘/> <alias name=‘scsi0-0-0-1‘/> <address type=‘drive‘ controller=‘0‘ bus=‘0‘ target=‘0‘ unit=‘1‘/> </disk> <controller type=‘scsi‘ index=‘0‘> <alias name=‘scsi0‘/> <address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x06‘ function=‘0x0‘/> </controller>
保存退出,通过virsh命令关闭再启动虚拟机,不能在虚拟机中重启也不能用virsh reboot
virsh destroy instance-xxxxxxxx virsh list --all virsh start instance-xxxxxxxx
使用openstack管理的kvm虚拟机不能使用此方法是因为一旦通过openstack启动/重启虚拟机都会重新生成xml配置文件(rpm安装默认路径为/etc/libvirt/qemu/instance-xxxxxxxx.xml)导致配置失效。除非之后都没有通过openstack启动/重启该虚拟机。
修改openstack中云主机配置文件注意事项:
若云主机本身是关机状态,virsh start云主机会在nova-compute同步主机状态时根据数据库状态把云主机关闭,所以不能在云主机关闭状态下修改。
若云主机本身是开机状态,virsh destroy云主机则会在nova-compute同步主机状态时修改数据库状态,但再次virsh start云主机也会被关机。(实验证明即使在同步时间间隙里操作也会导致云主机最终被关闭)
避免nova-compute关闭云主机:修改时候关闭nova-compute服务,确认云主机启动成功后再启动nova-compute服务。