修改 OpenNebula 虚拟机实例的内存大小
2012年05月25日 | 标签: kvm, opennebula, virsh
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 ...