升级 OpenNebula 3.x 到 OpenNebula 4.0

正在测试 OpenNebula 的升级工作,安装和测试新版 OpenNebula 4.0 是一件事,还有一件事是测试升级过程中可能遇到的问题和解决办法。升级是危险操作,每一个阶段都可能会有问题,所以升级前的各种备份和测试工作都需要准备妥当,配置文件、虚拟机、数据库等等都是必须备份的。好的升级除了应该保证数据完整、各部分运行正常外还应该尽量让用户察觉不到。

OpenNebula 官方文档说如果要升级的话需要参考相关版本的文档然后逐个版本依次升级:

If you are upgrading from a version prior to 3.8, read the 3.4 upgrade guide, 3.6 upgrade guide and 3.8 upgrade guide for specific notes.

逐个版本升级的过程太麻烦,我们看看能不能一次升级到位。

先停掉 OpenNebula 3.x 的相关服务:

$ sunstone-server stop
$ econe-server stop
$ occi-server stop
$ oneacctd stop
$ one stop

导出数据库(会在 /var/lib/one 下生成一个名为 one.db.bck 的备份文件):

$ onedb backup -v -f --sqlite /var/lib/one/one.db

关闭所有虚拟机后,然后在控制节点和计算节点正常安装 OpenNebula 4.0.

安装完 OpenNebula 4.0 后用新版的 onedb 升级数据库(也就是升级 one.db.bck 里面的表结构、字段等),这个升级过程将会自动从 3.2.1 到 3.3.0 到 3.3.80 到 … 逐个版本升级到 3.9.80,整个过程完成后会纪录在当前目录的 one.upgrade.log 日志文件里:

$ onedb upgrade -v -f --sqlite one.db.bck

注意升级前(onedb upgrade)一定要关闭所有虚拟机,否则升级数据库会报错:

> Running migrator /usr/lib/one/ruby/onedb/3.3.0_to_3.3.80.rb
You can't have active VMs. Please shutdown or delete the following VMs:
...

如果不想(或者不允许)关闭所有虚拟机的话,可以通过直接修改数据库的办法 “骗过” 升级脚本(onedb),只需要到数据库里手动把所有 VMs 的状态(state)改成 shutdown 就可以了:

$ sqlite3 one.db.bck
sqlite> SELECT oid,name,state,lcm_state FROM vm_pool WHERE (state <> 1 AND state <> 6);
sqlite> UPDATE vm_pool set state=1 WHERE (state <>1 and state <>6);

数据库升级完后就要开始升级配置文件,OpenNebula 4.0 一些配置文件、参数以及目录结构有改动,比如 OpenNebula 配置文件里的一些驱动名改了,im_kvm 改成了 kvm、vmm_kvm 改成了 kvm,为了兼容,所以需要增加 im_kvm 和 vmm_kvm. 修改 oned.conf 配置文件:

$ vi /etc/one/oned.conf
...
IM_MAD = [
      name       = "kvm",
      executable = "one_im_ssh",
      arguments  = "-r 0 -t 15 kvm" ]
IM_MAD = [
      name       = "im_kvm",
      executable = "one_im_ssh",
      arguments  = "-r 0 -t 15 kvm" ]
...
VM_MAD = [
    name       = "kvm",
    executable = "one_vmm_exec",
    arguments  = "-t 15 -r 0 kvm",
    default    = "vmm_exec/vmm_exec_kvm.conf",
    type       = "kvm" ]
VM_MAD = [
    name       = "vmm_kvm",
    executable = "one_vmm_exec",
    arguments  = "-t 15 -r 0 kvm",
    default    = "vmm_exec/vmm_exec_kvm.conf",
    type       = "kvm" ]
...

注意 authn 这一行需要有 server_cipher:

$ vi /etc/one/oned.conf
...
AUTH_MAD = [
    executable = "one_auth_mad",
    authn = "ssh,x509,ldap,server_cipher,server_x509"
]
...

/var/lib/one 目录结构中增加了一些新目录,比如 datastore, vms 等,OpenNebula 3.x 老版本的虚拟机镜像在 /var/lib/one 需要移到新的 /var/lib/one/vms 下,所以需要登陆到每个 OpenNebula 节点移动虚拟机镜像目录:

$ mkdir /var/lib/one/vms
$ mv /var/lib/one/[0-9]* /var/lib/one/vms

然后启动所有服务和虚拟机、观察日志文件,看看新版 OpenNebula 有什么问题:

$ one start
$ occi-server start
$ sunstone-server start

评论 (10 Comments)

  1. 学习了~谢谢!

  2. 挺不错

  3. 大神就是厉害,把结构都玩得一清二楚,要好好学习,就是有个问题想咨询下,原来你说过是因为用xen选的opennebula,不知道目前运行的是xen还是kvm,谢谢!

  4. 看官方文档,4.2好象要求ruby>=1.8.7,就是说只能装在centos6了,centos5是1.8.5,不知现在是一个什么架构,想学习一下,因为记得以前是用的centos5,不能直接升级到centos6,还是说在centos5上编译安装ruby1.8.7,谢谢!

  5. @mice
    直接用 centos 6:)

  6. 谢了,过段时间闲下来玩玩

  7. 您好,请教您个问题。我用opennebula 链接esxi 的时候在sunstone上的novnc 不能输入大写字母,请问您遇到过么,是怎样解决的

  8. 楼主,如果DB是Mysql的是不是只要直接把数据库导出来就可以了?

  9. 嗯,应该差不多的~

  10. 在密码正确的情况下为什么还是提示拒绝连接,有没有修改密码的超级用户

发表评论