实验环境是使用vmware搭建的centos 7虚拟机,生产环境需要换到openstack上跑虚拟机。
首先, 在vmware里面导出虚拟机,导出格式为ovf

这其实是一个压缩文件,把这个.ovf 用解压软件tar -xvf提取出其中的 CentOS7-disk1.vmdk 文件,并把这个文件上传到openstack服务器。
qemu-img convert -f vmdk CentOS7-disk1.vmdk -O qcow2 CentOS7JMH.qcow2
openstack image create "CentOS7-fvmware" \
--file CentOS7JMH qcow2c \
--disk-format qcow2 --container-format bare \
--public
在dashboard里面,从刚刚上传的CentOS7JMH镜像创建实例。但是,肯定会创建失败的,不要慌。可以删除失败的实例,然后在Dashboard的 卷 中选择刚刚创建的CentOS7的卷,从这个卷 Launch as instance。
如果是CentOS很容易出现:/dev/disk/by-uuid/d8366f41-f65d-4034-9aa4-ab137c5c1f7f does not exist 的错误,这种错误表现实例在dashboard的状态是running的,但是查看console有类似于下图的结果:

从错误信息来看,应该是原来从vmware的拷贝过来的启动扇区把文件系统里面的磁盘设备依然保留为原来的磁盘,而没有主动更新。那个找不到的设备其实是原来vmware虚拟机的硬盘,现在已经从openstack的volume启动了,那么应该是寻找openstack的volume而不是原来的硬盘,于是我只要想办法把整个引导区中的设备修改好就可以了。
解决方法:
sudo dracut -f /boot/initramfs-$(uname -r).img $(uname -r)
然后重启就可以了。
参考:https://ask.openstack.org/en/question/101733/error-when-booting-instance-created-from-vmdk-file/
实测发现,Ubuntu的迁移没有Centos的磁盘找不到之类的狗屁错误。
如果启动失败,可以查两个地方的日志:
实例启动日志:
sudo journalctl -a -u devstack@n-cpu.service | grep ERROR
volume创建日志:
sudo journalctl -a -u devstack@c-vol.service | grep ERROR