修改 OpenNebula 虚拟机实例的内存大小

OpenNebula 创建虚拟机(实例)以后将不能直接更改虚拟机的配置参数,如 CPU、内存等。如果创建虚拟机以后发现内存给的太大,想改小怎么办呢?如何给 OpenNebula 上的虚拟机修改内存呢?(注:OpenNebula 没有直接操作的命令,需要到节点上用 virsh setmem 动态修改。)让人不可思议的是,OpenNebula 推荐的方法是删除原有虚拟机以后重新创建一个配置合适的虚拟机,一些云计算平台认为虚拟机(计算资源)应该像自来水一样打开就用,不用就关闭。个人觉得云计算应该至少能随时改变计算资源(配置),而不是删除+创建。

比如下面这个 id 为28的虚拟机实例用了 2GB 内存,想修改到 1GB:

# onevm list
ID USER     GROUP    NAME         STAT CPU     MEM        HOSTNAME        TIME
...
14 root     oneadmin queue        runn   3      1G         cloud06 40 20:38:50
18 root     oneadmin grid03       runn 144     24G         cloud18 39 00:47:01
19 root     oneadmin grid02       runn 143     32G         cloud21 39 00:26:26
28 root     oneadmin monitor      runn   9      2G         cloud03 05 22:04:14
...

首先找到这个28号虚拟机实例所在的 OpenNebula 计算节点(node),从上面的 HOSTNAME 看出 monitor 运行在 cloud03 这个节点上,我们 ssh 到这个节点操作发现这台 OpenNebula ID 为28的虚拟机实例在这个节点上名字为 one-28:

# ssh root@cloud03

# virsh list
 Id Name                 State
----------------------------------
 39 one-20               running
 42 one-25               running
 45 one-28               running

可以动态修改 one-28 的内存参数为 1GB,但是这种办法重启后就会丢失配置重回到 2GB:

# virsh setmem one-28 1048576

所以最好关闭 one-28 后再修改 one-28 配置文件,改动 memory 部分为 1048576(1GB),修改完毕后启动虚拟机:

# virsh shutdown one-28

# virsh edit one-28
...
1048576
...

# virsh start one-28

修改完后 onevm list 会发现 one-28 内存大小依然是 2GB,没有变,这是因为这部分纪录在 OpenNebula 的数据库里,需要修改数据库,先 select 一下发现 OpenNebula 把 VM 的 XML 配置文件写在数据库里,这容易办,用 SQL 语句的 update 操作更新一下数据库:

# sqlite3 /var/lib/one/one.db

sqlite> select * from vm_pool where oid='28';
28|monitor|...2097152...|0|0|1337014904|3|3|1|0|0

sqlite> update vm_pool set body="...1048576..." where oid="28";

然后 onevm list 就会得到正确的、修改过内存的虚拟机实例了:

# onevm list
ID USER     GROUP    NAME         STAT CPU     MEM        HOSTNAME        TIME
...
14 root     oneadmin queue        runn   3      1G         cloud06 40 23:44:51
18 root     oneadmin grid03       runn 144     24G         cloud18 39 03:47:01
19 root     oneadmin grid02       runn 143     32G         cloud21 39 03:32:27
28 root     oneadmin monitor      runn   9   1024M         cloud03 05 01:10:15
...

评论 (14 Comments)

  1. 这个很不人性化,openNebula 相对openstack cloudstack 还有很长的路要走啊。
    你的博客是用wordpress做的么?配色方案很清爽,非常喜欢,不知能否共享。

  2. 呵呵,过来观摩学习一下~

  3. 请教下opennebula和openstack在应用上有什么区别,分别是负责什么功能的?他们是同一种应用的不同产品吗 谢谢

  4. 您好,xen虚拟环境下使用OpenNebula创建虚机,linux镜像根据官方说明,disk.0设备应该使用xvd开头的,但是使用xvd开头在节点上启动虚机,过一会就自动shutdown了,修改为hd开头就没有问题了。 为什么呢?
    disk = [
    ‘tap:aio:/one_images/88/images/disk.0,hda,w’,
    ‘tap:aio:/one_images/88/images/disk.1,hdc:cdrom,r’,
    ]

  5. @kevinbin
    嗯,是同一种应用,不同的产品。

  6. @david
    有的系统(不同 linux 发行版)启动不能自动映射虚拟硬盘,还要看虚拟机里面 /etc/fstab 是如何挂载的,有的 /dev/xvda 有的 /dev/sda 等等。

  7. 想询问一下,opennebula的模版中cpu参数的设置,=1是使用完整cpu,0.5使用50%cpu么?那么对多核的cpu比如i5的也是遵循这个么?谢谢了

  8. @lamefox
    OpenNebula 里面 CPU 参数是 VCPU,是虚拟 CPU,1 是1个 VCPU.

  9. 那么是不是模板设置CPU=1,VCPU=1的话,那么虚拟机可以100%的使用主机的cpu,虚拟系统显示cpu的数量1个呢
    而模板设置为CPU=0.5,就是虚拟机只能使用50%的主机cpu呢?
    多谢!

  10. @lamefox
    不是。VCPU 和 CPU 之间从某个角度说没多大关系,1个 CPU 可以分成 n 个 VCPU 用,如果你服务器只有 1 个物理 CPU,完全可以造出 n 个虚拟机,而且每个虚拟机都有 n 个 CPU(不推荐,但是可以。)

  11. 额,我可能表达的不是很清楚,在模版的参数中关于cpu设置的有这么一句说明,
    Percentage of CPU divided by 100 required for the Virtual Machine. Half a processor is written 0.5.
    原文在http://opennebula.org/documentation:archives:rel3.0:template
    这个的意思是不是说,虚拟机cpu的使用限制,完全使用主机的cpu就设置为1,只允许最多使用一半的cpu资源设置为0.5

  12. @lamefox
    要看 opennebula 是否针对不同的 hypervisor 实现了对应的调度,我看了一下在 kvm 下,opennebula 传过去的 CPU 参数不起作用;在 xen 下应该是起作用的,会配合 xm sched-credit 来限制和调度 CPU 资源

  13. opennebula 4.2 里面
    使用virsh shutdown one-xx 关机后,
    virsh list –all 就看不到这个实例了。
    请问楼主这个是哪个版本的?

  14. @tait
    这篇文章是2012年5月写的,版本估计是 3.2 左右。

发表评论