使用 DevStack 快速搭建 OpenStack 实验环境

安装 OpenStack 对新手来说是个痛苦的过程,尤其是 OpenStack 和它依赖的一些组件在快速发展中,经常出现这个版本 keystone 对不上那个版本 dashboard 类似的情况。如果只是想看看 OpenStack 的话,使用 DevStack 是个不错的办法。DevStack 实际上是个 shell 脚本,可以用来快速搭建 OpenStack 的运行和开发环境,特别适合 OpenStack 开发者下载最新的 OpenStack 代码后迅速在自己的笔记本上搭建一个开发环境出来。正如 DevStack 官方所强调的,devstack 不适合用在生产环境。

Can I use DevStack for production?
A: No. We mean it. Really. DevStack makes some implementation choices that are not appropriate for production deployments. We warned you!

维护一个支持多 Linux 发行版的脚本需要很多工作,为了保持简单,DevStack 目前只支持 Ubuntu 11.10 发行版。使用 devstack 脚本很简单,安装 git,然后下载 devstack 代码到本地,运行 stack.sh 脚本依次设定 MySQL, RabbitMQ, OpenStack Dashboard 和 Keystone 的密码,密码输入后 stack.sh 脚本会自动开始安装必要的软件包和库并下载最新的 OpenStack 及其组件代码,整个过程自动完成无需干预:

$ sudo apt-get install git

$ git clone git://github.com/openstack-dev/devstack.git
$ cd devstack/
$ ./stack.sh 

################################################################################
ENTER A PASSWORD TO USE FOR MYSQL.
################################################################################
This value will be written to your localrc file so you don't have to enter it 
again.  Use only alphanumeric characters.
If you leave this blank, a random default value will be used.
Enter a password now:
...

horizon is now available at http://192.168.2.240/
keystone is serving at http://192.168.2.240:5000/v2.0/
examples on using novaclient command line is in exercise.sh
the default users are: admin and demo
the password: vpsee
This is your host ip: 192.168.2.240
stack.sh completed in 684 seconds.
$

如果对默认的 tty.tgz 镜像不满意,想用 ubuntu 11.10 镜像的话编辑 stack.sh 脚本,在 for image_url in ${IMAGE_URLS//,/ }; do 一行上面加入 IMAGE_URLS=http://uec-images.ubuntu.com/oneiric/current/oneiric-server-cloudimg-amd64.tar.gz 这行,然后重新运行 stack.sh 脚本:

$ vi stack.sh
...
    IMAGE_URLS=http://uec-images.ubuntu.com/oneiric/current/oneiric-server-cloudimg-amd64.tar.gz
    for image_url in ${IMAGE_URLS//,/ }; do
        # Downloads the image (uec ami+aki style), then extracts it.
        IMAGE_FNAME=`basename "$image_url"`
        if [ ! -f $FILES/$IMAGE_FNAME ]; then
            wget -c $image_url -O $FILES/$IMAGE_FNAME
        fi

        KERNEL=""
        RAMDISK=""
...

$ ./stack.sh 

还有一点值得注意的地方,如果想使用现有的网络,比如安装 devstack 的这台服务器地址是 192.168.2.240,想让所有运行在上面的 instance 的地址为 192.168.2.241-192.168.2.247 的话,需要修改 stack.sh 里面的 TEST_FLOATING_RANGE,然后重新运行 stack.sh 脚本:

$ vi stack.sh
...
#TEST_FLOATING_RANGE=${TEST_FLOATING_RANGE:-192.168.253.0/29}
TEST_FLOATING_RANGE=${TEST_FLOATING_RANGE:-192.168.2.240/29}
...

$ ./stack.sh

DevStack 安装结束后打开浏览器访问 http://192.168.2.240/ 就可以看到 OpenStack Dashboard 界面,用户名是 admin,密码是刚才设定的密码,输入正确后就会进入 Dashboard,最新的 OpenStack Dashboard 已经有了很大改善,可以创建或导入 keypairs,启动或终止 instance,分配和注射 IP 给 instance,创建和分配 volume 等,还可以添加和管理用户等。界面如下:

openstack-dashboard

如何在 VMware ESXi 虚拟机上运行 KVM

记得以前就有人问过 “能不能在一个虚拟机上运行虚拟机”,答案当然是可以的,Xen HVM, KVM, VMware, Qemu 等 Hypervisor 都可以这样嵌套虚拟,不过由于性能低下实际用处不大。在 VMware ESXi 虚拟机上运行虚拟机,被称为多层虚拟或者嵌套虚拟机(Nested VMs)。如果只有一台电脑想测试多节点 OpenStack 环境的话,使用 VMware ESXi 虚拟几个运行 KVM Hypervisor 的 OpenStack 计算节点是个不错的办法。VMware ESXi 5.0 默认情况下不支持嵌套虚拟,所以在 VMware ESXi 虚拟机里安装完 KVM 以后会发现 KVM 虽然能装但不可用:

# kvm-ok 
INFO: Your CPU does not support KVM extensions
KVM acceleration can NOT be used

解决办法很简单:1、修改 VMware ESXi 的设置;2、修改对应虚拟机的设置。

登陆 VMware ESXi 控制台打开 VMware ESXi 5.0 的 SSH 服务(默认 SSH 服务是关闭的),然后用 ssh 登陆 VMware ESXi 后在 config 文件中最后加入 vhv.allow = “TRUE” 一行:

# vi /etc/vmware/config
libdir = "/usr/lib/vmware"
authd.proxy.vim = "vmware-hostd:hostd-vmdb"
authd.proxy.nfc = "vmware-hostd:ha-nfc"
authd.proxy.nfcssl = "vmware-hostd:ha-nfcssl"
authd.proxy.vpxa-nfcssl = "vmware-vpxa:vpxa-nfcssl"
authd.proxy.vpxa-nfc = "vmware-vpxa:vpxa-nfc"
authd.fullpath = "/sbin/authd"
authd.soapServer = "TRUE"
vmauthd.server.alwaysProxy = "TRUE"
vhv.allow = "TRUE"

重启 VMware ESXi 后编辑虚拟机选项(需要先关闭虚拟机),打开 Edit virtual machine settings 对话框,在 options 页面的 General Options 选项里把 Guest Operating System 的类型换成 Other 里面的 VMware ESxi 5.x,如图:

running nested vms on vmware esxi

最后启动虚拟机后再 kvm-ok 一下就可以看到 KVM 可以用了:

# kvm-ok 
INFO: /dev/kvm exists
KVM acceleration can be used

相关阅读:
在 CentOS 上安装和配置 KVM.
在 VMware ESXi 上安装 Minix.
在 VMware ESXi 虚拟机上运行不同的 Hypervisor 可以看看 VMware 的 Running Nested VMs.

为 OpenStack Nova 制作 CentOS 镜像

做 CentOS 镜像的过程和去年写的那篇为 OpenStack Nova 制作 Ubuntu 镜像的步骤差不多,不过这半年 OpenStack 发展神速,比以前要稳定多了,有些步骤可以省了,而且有些命令工具、参数、功能都有改动,比如以前的 uec-publish-image 改成了现在的 cloud-publish-image,功能也有变化。下面的制作镜像步骤在 Ubuntu 11.10 + OpenStack Diablo Release 上完成。

安装 CentOS 镜像

下载要安装的 CentOS 版本,这里选用最新的 CentOS 6.2:

$ wget http://mirrors.kernel.org/centos/6.2/isos/x86_64/CentOS-6.2-x86_64-minimal.iso

创建一个 10GB 大小的 “硬盘”(raw 格式),最好用一个较小的 “硬盘”,体积太大提交到云里会花很长时间,而且每次运行实例也会花很长时间:

$ kvm-img create -f raw centos.img 10G
Formatting 'centos.img', fmt=raw size=10737418240

使用刚才下载的 CentOS “安装盘” 和刚创建的 “硬盘” 引导启动系统,用 -vnc 参数打开 vnc 访问,这样可以从其他机器登录到这个界面安装系统:

$ sudo kvm -m 512 -cdrom CentOS-6.2-x86_64-minimal.iso \
-drive file=centos.img -boot d -net nic -net tap -nographic -vnc :0

用 vncviewer 登录后按照屏幕提示完成 CentOS 安装。需要注意的是在分区阶段把 10GB 硬盘全部划分成一个 ext4 root 分区,不要创建多个分区也不要创建 swap 区:

$ vncviewer 172.16.39.111:5900

安装完后会自动重启,如果没有重启的话按照下面的命令启动刚刚安装好的虚拟机镜像 centos.img,如果出现 failed to find romfile “pxe-rtf8139.bin” 的错误提示可以通过安装 kvm-pxe 解决:

$ sudo kvm -m 512 -drive file=centos.img -boot c -net nic -net tap \
-nographic -vnc :0
kvm: pci_add_option_rom: failed to find romfile "pxe-rtl8139.bin"

$ sudo apt-get install kvm-pxe

再次用 vnc 登录虚拟机镜像,安装一些必要工具(因为这个镜像将会是模板,所以最好保持最简最小化):

$ vncviewer 172.16.39.111:5900

# yum update
# yum upgrade
# yum install openssh-server
# chkconfig sshd on

修改分区加载表(/etc/fstab),注释或删除以前的,加上 LABEL=cec-rootfs 一行:

# vi /etc/fstab
#UUID=47a90bea-2d88-4c82-a335-09c1533b1538 / ext4 defaults 1 1
LABEL=cec-rootfs                           / ext4 defaults 0 0

在网络接口配置里面注释或删除这行 #HWADDR= 一行,启用 DHCP:

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
#HWADDR="00:11:22:12:34:56"
#NM_CONTROLLED="yes"
BOOTPROTO=dhcp
ONBOOT="yes"

注射 ssh key 以便外界可以用 ssh -i mykey.priv root@host 的形式无密码登录到虚拟机实例,在 /etc/rc.local 文件中加入下面这些:

# vi /etc/rc.local
...
mkdir -p /root/.ssh
echo >> /root/.ssh/authorized_keys
curl -m 10 -s http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
| grep 'ssh-rsa' >> /root/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
echo "AUTHORIZED_KEYS:"
echo "--------------------"
cat /root/.ssh/authorized_keys
echo "--------------------"

别忘了还需要修改 sshd 的配置实现无密码登录:

# vi /etc/ssh/sshd_config
...
RSAAuthentication yes
PubkeyAuthentication yes
PermitRootLogin without-password
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no

需要关闭 SELINUX,否则即使上面 ssh 设定允许 root 无密码登录也无效:

# vi /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

70-persistent-net.rules 会自动添加其他的网络接口,需要删除这个文件避免自动添加除了 eth0 以外的接口,关闭虚拟机准备发布镜像:

# rm -rf /etc/udev/rules.d/70-persistent-net.rules

# shutdown -h now

发布 CentOS 镜像

CentOS 镜像已经做好了,现在可以发布到云里了:

$ cloud-publish-image amd64 centos.img mybucket
ami-00000007    mybucket/centos.img.manifest.xml

等待一段时间后出现 ami-00000008 mybucket/centos.img.manifest.xml 表示我们刚制作的 CentOS 镜像已经正式发布到云里,以后就可以以这个镜像为模板来快速生成虚拟机实例(instance)。可以通过 euca-describe-images 来查看:

$ euca-describe-images
IMAGE	ami-00000008	images/centos.img.manifest.xml		available	private		x86_64	machine	 	 	instance-store

第一个 CentOS 虚拟机实例

有了 CentOS 镜像(模板)以后我们就可以以这个 “镜像” 为模板来为云计算用户创建 n 个 CentOS 虚拟机(操作系统)实例,不过在运行实例之前需要 key:

$ euca-add-keypair mykey > mykey.priv
$ chmod 600 mykey.priv 

$ euca-describe-keypairs
KEYPAIR	mykey	76:7d:93:88:a0:e5:3e:5d:4b:62:cd:85:c5:23:7a:05

$ euca-run-instances -k mykey -t m1.small ami-00000008
RESERVATION	r-hzwwif81	vpseecloud	default
INSTANCE	i-0000002a	ami-00000008	pending	vpsee (vpseecloud, None)	0		m1.small	2012-02-01T14:26:51Z	unknown zone	aki-00000001	ami-00000000

上面使用 euca-run-instances 创建一个实例后可以用 nova-manage 命令看到:

$ euca-describe-instances 
RESERVATION	r-z973l7mm	vpseecloud	default
INSTANCE	i-0000002a	ami-00000008	172.16.39.200	172.16.39.200	running	vpsee (vpseecloud, cloud00)	0		m1.small	2012-02-01T13:56:02Z	nova	ami-00000000	ami-00000000

还记得在 Ubuntu 上安装和配置 OpenStack Nova 的创建网络部分吗?看看现在云里面 IP 的分配情况:

$ sudo nova-manage network list
id   	IPv4              	IPv6           	start address  	DNS1           	DNS2           	VlanID         	project        	uuid           
1    	172.16.38.0/23    	None           	172.16.38.2    	8.8.4.4        	None           	None           	None           	None

刚才用 euca-run-instances 启动的一个 ubuntu 虚拟机实例的 IP 就是从 172.16.38.2 开始的,目前分配的 IP 是 172.16.39.200(从 euca-describe-instances 可以看出来),所以 ssh 登录这个 IP 就登上了我们的 CentOS 云虚拟机:

$ ssh -i mykey.priv [email protected]
[root@server-25 ~]# 

想制作 Windows 虚拟机镜像的话可以看这篇:为 OpenStack Nova 制作 Windows 镜像

如何更换 OpenStack 默认的 Hypervisor

我们的云计算头节点这周到货了,采用的是 Dell PowerEdge R710,Intel Xeon CPU E5645 @2.40GHz (12 Cores), 4x300GB SAS (15K), 96GB 内存。这样的配置对于我们的头节点来说过于强大,我们可能考虑用 VMware ESXi 虚拟后用其中的一台虚拟机做 OpenStack/OpenNebula 头节点,用 VMware ESXi 有个问题,免费版本的 VMware ESXi 5.0 虚拟出来的单台虚拟机最多只能支持8核心,而这台服务器逻辑上有24核心,有点浪费。图片最上面的是头节点(Dell PowerEdge R710),中间的是计算节点(Dell PowerEdge M710HD),最下面的是存储。

dell poweredge r710

OpenStack 几乎支持现在所有主流的虚拟技术和 Hypervisor,如 KVM, Hyper-V, LXC, QEMU, UML, VMWare ESX/ESXi, Xen/XenServer 等,未来还会支持 OpenVZ 和 VirtualBox. 不过 OpenStack 首选的 Hypervisor 是 KVM,OpenStack 安装后默认使用的是 KVM (–libvirt_type=kvm),不需要特别配置。如果由于某种原因,比如服务器 CPU 不支持 Intel VT-x/AMD-V 不能使用 KVM 或者想简单尝试一下另外一种 Hypervisor 怎么办呢?方法很容易,1、更改 OpenStack Nova 的配置文件(–libvirt_type);2、给所有的 Compute 结点装上相应的 Hypervisor 就可以了。以下以 LXC 为例来说明如何更换 OpenStack Nova 的 Hypervisor,LXC 使用的是与 Xen 和 KVM 完全不同的虚拟技术,和 OpenVZ 的容器技术有点类似。

首先在所有 openstack nova compute 结点上替换现有的 nova-compute-kvm 到 nova-compute-lxc:

$ sudo apt-get install nova-compute-lxc

LXC 使用 cgroup 文件系统来限制资源和进程,libvirt 需要 cgroup 文件系统来运行 LXC,我们只要在 nova compute 上创建一个 ctroups 目录并且在 /etc/fstab 最后加上 none /cgroups cgroup cpuacct,memory,devices,cpu,freezer,blkio 0 0 这行就可以了,别忘了重启系统:

$ sudo mkdir /cgroups

$ vi /etc/fstab
none /cgroups cgroup cpuacct,memory,devices,cpu,freezer,blkio 0 0

$ sudo reboot

重启后可以看到 /cgroups 下面多了很多东西:

$ ls /cgroup/
blkio.io_merged                   cpu.shares
blkio.io_queued                   devices.allow
blkio.io_service_bytes            devices.deny
blkio.io_serviced                 devices.list
blkio.io_service_time             libvirt
blkio.io_wait_time                memory.failcnt
blkio.reset_stats                 memory.force_empty
blkio.sectors                     memory.limit_in_bytes
blkio.throttle.io_service_bytes   memory.max_usage_in_bytes
blkio.throttle.io_serviced        memory.memsw.failcnt
blkio.throttle.read_bps_device    memory.memsw.limit_in_bytes
blkio.throttle.read_iops_device   memory.memsw.max_usage_in_bytes
blkio.throttle.write_bps_device   memory.memsw.usage_in_bytes
blkio.throttle.write_iops_device  memory.move_charge_at_immigrate
blkio.time                        memory.numa_stat
blkio.weight                      memory.oom_control
blkio.weight_device               memory.soft_limit_in_bytes
cgroup.clone_children             memory.stat
cgroup.event_control              memory.swappiness
cgroup.procs                      memory.usage_in_bytes
cpuacct.stat                      memory.use_hierarchy
cpuacct.usage                     notify_on_release
cpuacct.usage_percpu              release_agent
cpu.rt_period_us                  tasks
cpu.rt_runtime_us

修改 OpenStack Nova 配置,将 nova-compute.conf 里面的 –libvirt_type=kvm 改成 lxc:

$ sudo vi /etc/nova/nova-compute.conf
--libvirt_type=lxc

$ sudo restart nova-compute

重启所有 nova compute 结点上的 nova-compute 服务,有必要的话重启所有 nova compute 结点。

那镜像怎么办呢?以前为 KVM 上传的镜像也可以用在 LXC 上吗?嗯,可以。下载 oneiric-server-cloudimg-amd64.tar.gz 解压并镜像到 OpenStack:

$ wget http://uec-images.ubuntu.com/oneiric/current/oneiric-server-cloudimg-amd64.tar.gz
$ tar zxvf oneiric-server-cloudimg-amd64.tar.gz

$ euca-bundle-image -i oneiric-server-cloudimg-amd64.img 
$ euca-upload-bundle -b oneiric -m /tmp/oneiric-server-cloudimg-amd64.img.manifest.xml 
$ euca-register oneiric/oneiric-server-cloudimg-amd64.img.manifest.xml

$ euca-describe-images 
IMAGE	ami-00000001	oneiric/oneiric-server-cloudimg-amd64.img.manifest.xml		available	private		x86_64	machine	 	 	instance-store

$ euca-run-instances -k vpsee -t m1.tiny ami-00000001

$ euca-describe-instances 
RESERVATION	r-4bbu7bd7	sanbi	default
INSTANCE	i-00000001	ami-00000001	172.16.39.6	172.16.39.6	running	vpsee (vpseecloud, node00)	0		m1.tiny	2012-01-20T08:04:05Z	nova	ami-00000000	ami-00000000

需要注意的是,OpenStack 目前不支持混合 Hypervisor,也就是说所有 nova compute 结点上必须使用同一种 Hypervisor,不过支持混合 Hypervisor 的 OpenStack 正在计划开发中。

Hello World, OpenNebula Cloud API 编程

先报告一下我们云计算项目的进度。去年休假前订购的服务器和部件已经陆续到货了,计算节点采用的是 Dell PowerEdge M710HD 刀片服务器,特别为数据中心级虚拟应用设计,海量内存、密集 IO 吞吐等优势,特别适合云计算、虚拟机等应用。现在正在等 Dell 的售后技术人员过来安装服务器和存储阵列,有些电源和机柜问题需要解决,顺利的话下周服务器可以上线。

dell poweredge m710hd

OpenNebula 提供了 XML-RPC 的方式访问 OpenNebula Cloud Api (OCA),这样就允许不同操作系统、不同语言编写的客户端程序可以通过 XML-RPC 远程调用的方式来访问 OpenNebula 服务。下面通过两个不同语言编写的最简单例子抛砖引玉一下,来看看如何是如何与 OCA 打交道的。

OpenNebula 绝大部分是由 Ruby 编写的,其提供的 Ruby OCA API 实现当然是最丰富和完整的。先安装 Ruby OCA Bindings:

$ sudo gem install oca

用 Ruby 编写一小段代码试验一下,以下代码用来打印当前云里每个计算结点的 hostname:

#!/usr/bin/ruby

require 'rubygems'
require 'oca'

include OpenNebula

# OpenNebula credentials
CREDENTIALS = "oneadmin:vpsee"

# XML_RPC endpoint where OpenNebula is listening
ENDPOINT    = "http://localhost:2633/RPC2"

client = Client.new(CREDENTIALS, ENDPOINT)
host_pool = HostPool.new(client)
rc = host_pool.info

# Print all the hostname from the host pool
host_pool.each do |host|
     puts host.name
end

再来看看用 Python 如何编写上面类似功能的代码。安装 Python OCA Bindings:

$ sudo easy_install oca

用 Python 编写一小段代码看一下:

#!/usr/bin/python

import oca

# OpenNebula credentials
CREDENTIALS = "oneadmin:vpsee"

# XML_RPC endpoint where OpenNebula is listening
ENDPOINT    = "http://localhost:2633/RPC2"

client = oca.Client(CREDENTIALS, ENDPOINT)
host_pool = oca.HostPool(client)
host_pool.info()

# Print all the hostname from the host pool
for host in host_pool:
    print host.name

应该没人会想在这种情况下用 Java 或 C++ 吧,Programming Examples 里面提供的 Java OCA 和 C++ 例子比 Ruby, Python 复杂得多。

Merry Christmas & a very happy 2012

去年的这个时候我们在博客上写了点总结,今年我们来点展望和预告。

明年我们的博客将更多的分享云计算和虚拟技术方面的经验。明年一月 VPSee 将会加入国家生物信息实验室从事高性能计算和云计算方面的工作,负责为这个实验室从零开始打造云计算基础设施,并且逐步把现有的系统并入到云计算。我们计划在新购的16台 288GB 内存的 x86 刀片服务器上配置和测试一套云计算系统,然后逐步把实验室原有的几台 IBM 超级计算机(IBM Power Supercomputer)、Cray 超级计算机和无数旧 x86 服务器并入到这个云计算系统中。VPSee 将会优先考虑 OpenStack, OpenNebula 等开源云计算平台,VMware vSphere 商业云计算方案留作备选(据说这个实验室不差钱,VMware 授权费应该不是问题)。总之,这将是一次难得的学习机会,VPSee 将会在 vpsee.com 上分享这次实战经历,相信对云计算感兴趣的朋友和 VPSee 一样都很期待⋯⋯

明年我们的 VPS 产品线付费 Service 业务将保持不变。由于客户需求、成本和定价、开源云计算技术的成熟度、数据中心之间的交互、地理条件的限制、运营计费等条件都不成熟,所以我们明年没有计划升级我们现有的 VPS 平台到云计算,我们将继续为大家提供简单、稳定、价廉、无管理的 VPS 服务

谢谢大家一直以来的持续关注,祝大家有个愉快的圣诞假期+新年,期待2012⋯⋯2012再见!

Merry Christmas and a very happy 2012

为 OpenNebula VM 添加 swap 分区

给 OpenNebula 制作 Ubuntu 模板的时候推荐只分一个单独区,不要交换区(swap),交换区可以以后在虚拟机外部由 OpenNebula 加上,这样把 root 区和 swap 区分开更灵活一些,方便以后创建不同大小 swap 的虚拟机。以下是在 OpenNebula 上为 Ubuntu 虚拟机增加 swap 的步骤:

修改 Ubuntu 模板文件,注意 DISK 一栏的 target 是 sda 不是 sda1,否则会出现 Boot Failed: 的错误。

$ vi ubuntu.one
NAME   = ubuntu
CPU    = 1
MEMORY = 512

OS = [ ARCH = x86_64,
        BOOT = hd,
        ROOT = sda1
]

DISK = [ source   = /var/lib/one/images/ubuntu.img,
         clone    = no,
         target   = sda,
         readonly = no ]

DISK = [ type     = swap,
         size     = 512,
         target   = sdb ]

GRAPHICS = [ type ="vnc",
             listen ="0.0.0.0",
             port = "5900" ]

启动 Ubuntu 虚拟机后,OpenNebula 就为这个虚拟机准备了一个大小为 512MB 的分区 /dev/sdb,现在登录虚拟机激活这个 swap,这样 Linux 就能识别 /dev/sdb 是个交换分区了(这个过程其实和在自己电脑上增加交换分区或用文件充当交换分区的过程差不多):

$ vncviewer 172.16.39.111:5900

$ sudo swapon /dev/sdb

$ free
             total       used       free     shared    buffers     cached
Mem:        504112      90896     413216          0      11440      33160
-/+ buffers/cache:      46296     457816
Swap:       524284          0     524284

最后可以在 /etc/fstab 里增加一条记录以便重启虚拟机以后系统能自动加上 swap:

$ sudo vi /etc/fstab
/dev/sdb    none    swap    sw    0    0

重置 OpenStack Nova 数据库

如果使用 OpenStack 的时候遇到莫名其妙的问题,或者直接操作 OpenStack 数据表的时候把里面的关系或记录搞砸了,或者使用一些从网上抄来连自己都不理解的命令把数据库记录弄乱了,或者自己想推倒重来等等,碰到这些问题的时候大家想到的第一个办法就是“重装系统,重装 OpenStack”,其实大部分时候都不必要重装,只需要重置一下数据库就可以了,避免重复劳动把操作命令整理到下面的简单脚本里:

#!/bin/bash
# Reset nova database and restart nova services
# written by vpsee.com

# Delete the database and create a new one
mysql -u root -ppassword -e "drop database nova;"
mysql -u root -ppassword -e "create database nova;"
mysql -u root -ppassword -e "set password for 'root'@'%'=password('password');"
mysql -u root -ppassword -e "grant all privileges on *.* to 'root'@'%';"

# Sync up the database scheme
nova-manage db sync

# Create a network
nova-manage network create private 10.0.1.0/24 1 256
nova-manage floating create 192.168.2.240/28

# Create a admin user and a project and assign the admin user to it
nova-manage user admin vpsee
nova-manage project create vpseecloud vpsee

# Restart all the services
restart libvirt-bin
restart nova-api
restart nova-scheduler
restart nova-network
restart nova-volume
restart nova-compute

# Create novarc
nova-manage project zipfile vpseecloud vpsee
unzip nova.zip
. novarc

# Allowing icmp and ssh access to instances
euca-authorize -P icmp -t -1:-1 default
euca-authorize -P tcp -p 22 default

# Create a keypair
euca-add-keypair vpsee > vpsee.priv
chmod 600 vpsee.priv

明年你准备采用 OpenStack 吗?

Zenoss 在最近的一次 OpenStack 会议和 Zenoss 开源社区做了一个调查,772份问卷调查结果显示约有75%的人正在考虑部署 OpenStack,其中40%的人明年就动手。大家选择 OpenStack 的理由主要是因为和 VMware vSphere 等商业云计算平台相比 OpenStack 能有效节约成本和避免被锁定在某个厂商。

openstack adoption survey

解决 Warning: failed to parse error message from AWS: :1:0: syntax error 问题

Warning: failed to parse error message from AWS: :1:0: syntax error 是个常见问题,很多朋友都在 Ubuntu 上安装和配置 OpenStack Nova 的时候遇到,100楼,120和120楼都遇到这个问题。引起这个问题的原因很多。如果遇到 nova-manage service list 服务都正常而 euca-describe-availability-zones verbose 报错的情况通常都是因为 novarc 这个文件捣鬼,nova 不能正确读取 novarc 里面的权限设置使得认证失败,认证失败当然也就不能正确执行命令了。

# nova-manage service list
Binary           Host      Zone        Status     State Updated_At
nova-scheduler   vpsee     nova        enabled    :-)   2011-12-05 13:26:51
nova-volume      vpsee     nova        enabled    :-)   2011-12-05 13:26:49
nova-network     vpsee     nova        enabled    :-)   2011-12-05 13:26:51
nova-compute     vpsee     nova        enabled    :-)   2011-12-05 13:26:52

# euca-describe-availability-zones verbose
Warning: failed to parse error message from AWS: :1:0: syntax error
None: None

修改 nova.conf 文件,在末尾明确加上 –use_deprecated_auth=true 这行(这个设置本来是默认的,以前版本的 OpenStack Nova 是不需要的),然后重启 nova 服务并重新生成 novacreds.zip,记得一定要 source novarc 哟:

# vi /etc/nova/nova.conf
...
--use_deprecated_auth=true

# restart libvirt-bin; restart nova-network; restart nova-compute; 
restart nova-api; restart nova-objectstore; restart nova-scheduler; 
restart nova-volume; restart glance-api; restart glance-registry

# nova-manage project zipfile mycloud vpsee /home/vpsee/creds/novacreds.zip
# cd /home/vpsee/creds
# unzip novacreds.zip
# chown -R vpsee:vpsee /home/vpsee/creds/

# source /home/vpsee/creds/novarc

# euca-describe-availability-zones verbose
AVAILABILITYZONE	nova	available
AVAILABILITYZONE	|- vpsee	
AVAILABILITYZONE	| |- nova-scheduler	enabled :-) 2011-12-05 13:32:44
AVAILABILITYZONE	| |- nova-volume	enabled :-) 2011-12-05 13:32:43
AVAILABILITYZONE	| |- nova-network	enabled :-) 2011-12-05 13:32:44
AVAILABILITYZONE	| |- nova-compute	enabled :-) 2011-12-05 13:32:47

再附带一句,OpenStack 正在飞速发展中,这样或那样的问题也许在新版本里就不存在了,以前没有的问题也可能第一次出现在新版本中。