给 Xen 安装 Xen Shell 控制面板

安装完 Xen 后可能需要安装一个控制面板方便用户自己操作虚拟机(VPS)。可以在网上找到一些 Xen 的开源控制面板,有的是基于 Web 的,不过大多数 Xen 控制面板都不完善也不好用,有的还有漏洞,比如2010年的时候 HyperVM 就曝重大安全漏洞,导致多家 VPS 服务商的服务器被黑,客户数据全部丢失,有的服务商甚至因为这个关门了。今天介绍的这个 Xen Shell 控制面板是由 Perl 写的命令行式 Xen 管理工具,包含开启、关闭、重启、查看控制台等功能。

首先到 http://xen-tools.org/software/xen-shell/releases.html 下载最新的 xen-shell 源代码包,解压后安装:

# wget http://xen-tools.org/software/xen-shell/xen-shell-1.9.tar.gz
# tar zxvf xen-shell-1.9.tar.gz
# cd xen-shell-1.9
# make
# make install

修改 xen-shell 的配置文件,加上 banner 然后禁止一些不需要的命令:

# vi /etc/xen-shell/xen-shell.conf

banner = VPSee's VPS Shell
blacklist = version, uptime, shutdown, pause, serial, sysreq, unpause, top, whoami, author, quit

增加一个用户登陆 xen-login-shell 使用 xen-shell 控制面板:

# useradd vpsee
# passwd vpsee

# vi /etc/shells
/usr/bin/xen-login-shell

# chsh -s /usr/bin/xen-login-shell vpsee

在 Xen 虚拟机配置文件里修改 name, xen_shell, vif,如下:

# vi /etc/xen/vpsee

name = "vpsee"
xen_shell = 'vpsee'
bootloader = "/usr/bin/pygrub"
vcpus = 1
maxmem = "512"
memory = "512"
disk = [ "phy:sdb1,xvdb1,w", "phy:sdb2,xvdb2,w" ]
root = "/dev/sdb1 ro"
vif = [ "vifname=vpsee,bridge=xenbr0" ]
on_shutdown = "destroy"
on_poweroff = "destroy"
on_reboot = "restart"
on_crash = "restart"

用新建的用户登陆后运行 xen-shell 后会出现以下错误:

$ /usr/bin/xen-shell 

  There were no Xen configuration files found which matched the pattern:

   /etc/xen/*

  Please update /etc/xen-shell/xen-shell.conf

这是因为刚创建的用户没有权限读取 /etc/xen 目录及 /etc/xen/vpsee 配置文件,所以需要修改 /etc/xen 和 /etc/xen/vpsee 的权限:

# chmod 755 xen

刚创建的用户进入 xen-shell 后需要执行 xm 等相关操作,需要 root 权限,所以要把用户加到 sudoers 里面去:

# chmod 0640 /etc/sudoers
# vi /etc/sudoers
User_Alias   XENUSERS = vpsee
Cmnd_Alias   XEN      = /usr/sbin/xm
Cmnd_Alias   XENIMG   = /usr/bin/xen-create-image
XENUSERS     ALL      = NOPASSWD: XEN,XENIMG

# chmod 0440 /etc/sudoers

用户登陆后仍然不能执行 xm console 等操作,因为找不到路径,所以需要在用户主目录下把 xm 命令的路径包括进去:

# vi /home/vpsee/.bashrc
# User specific aliases and functions
export PATH=$PATH:/usr/sbin/

最后再执行 xen-shell 就可以顺利看到界面了。
vpsee vps shell

在 CentOS 6.2 上安装和配置 KVM

RHEL6 已经推出很久了,没想到在 RedHat 自家的 RHEL6 上安装 KVM 还有这么多问题,难道不应该是像 Apache/MySQL 那样安装完就可以用的么?(注:除去商标,CentOS 就是 RHEL,CentOS6 和 RHEL6 是一回事)。以下操作在 CentOS 6.2 最小化安装版本 CentOS-6.2-x86_64-minimal.iso 上完成,其他版本可能不会遇到本文提到的部分问题。

检查 CPU

和 Xen 不同,KVM 需要有 CPU 的支持(Intel VT 或 AMD SVM),在安装 KVM 之前检查一下 CPU 是否提供了虚拟技术的支持:

# egrep 'vmx|svm' /proc/cpuinfo
...
flags		: fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt aes lahf_lm ida arat dts tpr_shadow vnmi flexpriority ept vpid

安装 KVM

安装 KVM 很容易,要正常运行的话还需要折腾一下:

# yum -y install qemu-kvm libvirt python-virtinst bridge-utils

安装完后关闭 selinux 并重启系统,然后确认一下是否 kvm 安装成功:

# vi /etc/sysconfig/selinux
SELINUX=disabled

# reboot

# lsmod | grep kvm
kvm_intel              50412  3 
kvm                   305988  1 kvm_intel

# stat /dev/kvm
  File: `/dev/kvm'
  Size: 0         	Blocks: 0          IO Block: 4096   character special file
Device: 5h/5d	Inode: 10584       Links: 1     Device type: a,e8
Access: (0666/crw-rw-rw-)  Uid: (    0/    root)   Gid: (   36/     kvm)
Access: 2012-04-18 16:00:46.276341129 +0200
Modify: 2012-04-18 16:00:46.276341129 +0200
Change: 2012-04-18 16:00:46.276341129 +0200

再来确认一下 libvirt 是否能正常启动和关闭。重启 libvirtd 服务的话会报错,查看日志发现 internal error Failed to create mDNS client 错误,这个问题容易改正,安装 avahi 即可,也可以去 /etc/libvirt/libvirtd.conf 设置 mdns_adv = 0,VPSee 这里采用安装 avahi 的方法:

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon:                                  [FAILED]
Starting libvirtd daemon:                                  [  OK  ]

# tail /var/log/libvirt/libvirtd.log 
2012-04-18 13:51:03.032+0000: 18149: info : libvirt version: 0.9.4, package: 23.el6_2.7 (CentOS BuildSystem , 2012-04-16-14:12:59, c6b5.bsys.dev.centos.org)
2012-04-18 13:51:03.032+0000: 18149: error : virNetServerMDNSStart:460 : internal error Failed to create mDNS client: Daemon not running

# yum -y install avahi
# /etc/init.d/messagebus restart
# /etc/init.d/avahi-daemon restart

重启 libvirtd 服务继续报错,发现缺少 dmidecode 包,安装 dmidecode 后终于重启 libvirtd 成功 :

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon:                                  [FAILED]
Starting libvirtd daemon:                                  [  OK  ]

# tail /var/log/libvirt/libvirtd.log 
2012-04-18 13:54:54.654+0000: 18320: info : libvirt version: 0.9.4, package: 23.el6_2.7 (CentOS BuildSystem , 2012-04-16-14:12:59, c6b5.bsys.dev.centos.org)
2012-04-18 13:54:54.654+0000: 18320: error : virSysinfoRead:465 : internal error Failed to find path for dmidecode binary

# yum -y install dmidecode

# /etc/init.d/libvirtd restart
Stopping libvirtd daemon:                                  [  OK  ]
Starting libvirtd daemon:                                  [  OK  ]

现在 kvm 和 libvirt 都安装成功和运行了,但并不表示可用了,问题接着来。

安装虚拟机

从 6 系列开始 RedHat 推荐使用 virt-install/virsh 系列工具操作 kvm,而不是直接使用 qemu-kvm,所以 qemu-kvm 被移到一个不起眼的地方 /usr/libexec/,做个链接:

# qemu-kvm
-bash: qemu-kvm: command not found

# ls /usr/libexec/qemu-kvm 
/usr/libexec/qemu-kvm

# ln -sf /usr/libexec/qemu-kvm /usr/bin/kvm

VPSee 采用 RedHat 推荐的方式(virt-install)安装虚拟机,这里以安装 ubuntu-11.10-server-amd64.iso 为例:

# virt-install \
--name ubuntu \
--ram 512 \
--vcpus=1 \
--disk path=/root/ubuntu.img,size=10 \
--accelerate \
--cdrom /root/ubuntu-11.10-server-amd64.iso \
--graphics vnc

开始安装,创建硬盘 ubuntu.img 后就报错,用的是 root 帐号居然还 Permission denied?!

Starting install...
Creating storage file ubuntu.img                                 | 10.0 GB     00:00     
ERROR    internal error Process exited while reading console log output: char device redirected to /dev/pts/1
qemu-kvm: -drive file=/root/ubuntu.img,if=none,id=drive-ide0-0-0,format=raw,cache=none: could not open disk image /root/ubuntu.img: Permission denied

Domain installation does not appear to have been successful.
If it was, you can restart your domain by running:
  virsh --connect qemu:///system start ubuntu
otherwise, please restart your installation.

修改 qemu.conf 配置,把下面几个地方的注释去掉,然后把 dynamic_ownership 的值改成0,禁止 libvirtd 动态修改文件的归属:

# vi /etc/libvirt/qemu.conf
...
user = "root"
group = "root"
dynamic_ownership = 0
...

重启 libvirtd 服务再用上面的 virt-install 命令安装就应该可以了。这个时候 vnc 默认绑定的是本机 127.0.0.1,如果其他机器想用 vnc 客户端访问这台 kvm 服务器正在安装的 ubuntu 的话需要把 vnc 绑定到服务器的 IP 地址或者绑定到全局 0.0.0.0. 修改 qemu.conf 文件取消 vnc_listen 一行前面的注释,记得重启 libvirtd:

# vi /etc/libvirt/qemu.conf
...
vnc_listen = "0.0.0.0"
...

在 CentOS 5.x 安装 KVM 可以看:在 CentOS 上安装和配置 KVM.

对 Xen 和 OpenVZ 感兴趣的同学可以参考以下一些文章:

Ubuntu 版本可以参看:在 Ubuntu 上安装和配置 Xen
Debian 版本参看:在 Debian 上安装和配置 Xen
OpenSolaris 版本参看:在 OpenSolaris 上安装和配置 Xen
NetBSD 版本参看:在 NetBSD 上安装和配置 Xen

安装 OpenVZ 参看:在 CentOS 上安装和配置 OpenVZ.

如何让 OpenNebula 虚拟机自动获得 IP 等网络配置信息?

制作完 OpenNebula 的 Ubuntu 虚拟机镜像后需要对镜像配置一下以适应所在的网络运行环境,因为我们的 OpenNebula 虚拟机使用的是网桥的方式,所以虚拟机启动后会使用现有网络,并企图从 DHCP 服务器那里获得 IP 地址,如果 DHCP 服务器不做绑定的话这样随便获得的 IP 地址并不符合我们在 small_network.net (onevnet create small_network.net) 定义的要求,我们希望虚拟机启动后能从 small_network.net 这个网络配置文件中获得相应的 IP 地址。OpenNebula 里面的 Contextualizing 部分就是用来对付这种情况的,不过 VPSee 在这里介绍一个更简单的偷懒办法:直接用一个启动脚本来搞定。OpenNebula 已经为我们准备了类似的脚本,只需要根据自己的要求调整一下就可以了,这里介绍 for ubuntu 和 for centos 两个版本的脚本,还有 for debian 和 opensuse 的。

Ubuntu 虚拟机

下载 for ubuntu 的 context 文件后放在合适的地方,这个脚本有点问题需要在下载的 vmcontext.sh 文件最后加上重启网络(/etc/init.d/networking restart)这行:

$ wget http://dev.opennebula.org/attachments/download/378/vmcontext.sh 

$ sudo -i

# mv vmcontext.sh /etc/init.d/vmcontext
# chmod +x /etc/init.d/vmcontext
# ln -sf /etc/init.d/vmcontext /etc/rc2.d/S01vmcontext

# echo "/etc/init.d/networking restart" >> /etc/init.d/vmcontext

CentOS 虚拟机

下载 for centos 的 context 文件后放在合适的地方:

# wget http://dev.opennebula.org/projects/opennebula/repository/revisions/master/raw/share/scripts/centos-5/net-vmcontext/vmcontext

# mv vmcontext.sh /etc/init.d/vmcontext
# chmod +x /etc/init.d/vmcontext
# chkconfig --add vmcontext

# reboot

还记得上次说的给 OpenNebula 虚拟机增加 swap 分区的问题吗,直接把激活 swap 的部分放在 vmcontext 里就不必每次创建虚拟机后再增加 swap 的繁琐工作了。

# echo "swapon /dev/sdb" >> /etc/init.d/vmcontext

在 Ubuntu 11.10 上安装 Sun Grid Engine

Sun Grid Engine(现在叫做 Oracle Gird Engine)是一套开源的分布式资源管理软件,用来统一管理和利用所有(愿意被管理的)电脑上的资源,使得这些电脑(集群)使用起来就像一台电脑一样,好处是可以随意扩展总的计算资源(买更多的电脑加入集群),并且管理上就像使用一台电脑一样方便。使用者只需要把需要计算的工作准备好,提交到 Sun Grid Engine (SGE),SGE 就会根据已经订好的管理策略以及使用者的需求在集群里找到合适的电脑来完成计算工作。SGE 主要用在高性能计算、网格计算等领域。

我们云计算项目里面有个想法就是能在我们的云计算平台上快速创建多个高配置虚拟机并自动接入到 SGE 集群,能迅速满足整个实验室高峰时期的计算需求。目前我们的 SGE 集群包含 2 台 IBM 超级计算机,n 台 PC 服务器和多个刀片服务器,以后为了临时满足高峰时期的计算要求会从云里申请多个虚拟机并自动配置到 SGE 集群里。

安装 Sun Grid Engine 需要 Java 的支持(最好是 SUN 的 Java 版本),所以所有结点都需要安装 Java 包。Ubuntu 从 11.10 版本不在提供 SUN 的官方 Java 版本,需要另外的源:

$ sudo apt-get install python-software-properties
$ sudo add-apt-repository ppa:ferramroberto/java
$ sudo apt-get update
$ sudo apt-get install sun-java6-jre

首先在所有结点上修改 /etc/hosts,grid00 是主控结点,grid01 和 grid02 是执行结点(我们一般把主控结点叫做 master 或者 head,执行结点叫做 client):

$sudo vi /etc/hosts
127.0.0.1	localhost.localdomain	localhost
192.168.2.10	grid00.vpsee.com	grid00
192.168.2.11	grid01.vpsee.com	grid01
192.168.2.12	grid02.vpsee.com	grid02

在主控结点(grid00)上安装 gridengine-master 以及一些管理工具 qhost/qconf/qstat 等(包含在 gridengine-client 中):

$ sudo apt-get install gridengine-client gridengine-common gridengine-master

如果不习惯命令行界面,可以在主控结点上装个 qmon 图形管理工具,界面如下:

$ sudo apt-get install xserver-xorg gridengine-qmon

sun grid engine qmon guy

在所有执行结点(grid01 和 grid02)上安装 gridengine-exec:

$ sudo apt-get install gridengine-exec

在主控结点上执行以下操作把所有的执行结点加到集群里:

$ sudo -i

# qconf -ah grid01
# qconf -ah grid02

在所有执行结点执行以下操作,通过 act_qmaster 这个文件识别主控结点,然后启动服务:

$ sudo echo "grid00.vpsee.com" > /var/lib/gridengine/default/common/act_qmaster

$ sudo /etc/init.d/gridengine-exec start

最后在主控结点上查看一下是否成功:

# qhost
HOSTNAME                ARCH         NCPU  LOAD  MEMTOT  MEMUSE  SWAPTO  SWAPUS
-------------------------------------------------------------------------------
global                  -               -     -       -       -       -       -
grid00.vpsee.com        -               -     -       -       -       -       -
grid01.vpsee.com        lx26-amd64     24 24.00   63.0G    1.7G    3.7G     0.0
grid02.vpsee.com        lx26-amd64      8  0.01   55.2G  642.2M    1.0G     0.0

测试

如何知道这个集群是否能正常工作呢?提交一个任务(job)测试一下。在主控结点上写一个简单脚本打印当前 Linux 内核版本:

# vi uname.sge 
#!/bin/bash
uname -a

然后用 qsub 提交这个脚本到 SGE 集群:

# vi uname.sge 
#!/bin/bash
uname -a

# qsub uname.sge
qsub uname.sge 
Your job 3557 ("uname.sge") has been submitted

如果运行成功就会在某个执行结点的自己目录下面(我这里用的是 root 帐号,所以是 /root 目录)得到2个文件,执行结果就在 uname.sge.o3557 这个文件里:

# ls
uname.sge.e3557  uname.sge.o3557

# cat uname.sge.o3557 
Linux grid02 3.0.0-16-server #29-Ubuntu SMP Tue Feb 14 13:08:12 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

VMware ESXi 上使用内存预留减少 vswap 文件大小

VMware ESXi 上创建的虚拟机会自动根据虚拟机的内存大小创建一个同等大小的 swap 文件,这个文件通常和虚拟机镜像文件在同一个目录,文件名以 .vswp 结尾。比如创建一个内存为 8GB 的虚拟机,那么 .vswap 就会自动创建,并且大小也是 8GB,保存在同一个 datastore 里。现在问题来了,如果我要创建一个内存为 512GB 的虚拟机,那么 VMware ESXi 就会自动创建一个 512GB 的 .vswap 文件,本地硬盘(datastore)只有 500GB 容不下 .vswap 文件怎么办?前段时间 VPSee 就碰到这个 insufficient disk space on datastore 问题,原因是 VMware ESXi 企图创建一个大小为 512GB 的交换文件,结果 datastore 只有 500GB,所以硬盘空间不够,创建失败:

vmware esxi insufficient disk space

有两个解决办法:

  • 把 .vswap 文件从本机移到其他的 datastore 或者 NFS/SAN 存储上;
  • 修改内存预留值为最大值,点击左边列表的 host,选择右边 Resource Allocation 页面,右键点击 vpsee.com 这个虚拟机后选择 Edit Resource Settings… 出现如下对话框,然后调整 Memory Resources 栏的 Reservation 至最大值 501760MB.

vmware esxi memory reservation

修改后可以在上面这张图的 Resource Allocation 页面的 Memory 部分看到 Reserved Capacity 由 0 变成了 505531 MB,再次启动虚拟机就应该会得到一个内存大小为 500GB 的虚拟机了(host 需要一点内存,所以 512GB 的 host 不能创建 512GB 的虚拟机哦)。

VMware vSphere 标准版1个授权可以用在1个物理 CPU 和 32GB VRAM 上,每台虚拟机最多支持8个 VCPU。这台 512GB 服务器虽然只有4个物理 CPU 却需要 512/32=16 个授权(VMware 新的授权政策是按照 VRAM 算而不是 RAM)。每个标准版授权995美元,16个授权需要约1.6万美元,可能比这台服务器还贵。

在 VMware ESXi 5.0 上安装网卡驱动

昨天刚发现新购的 Dell PowerEdge R710 服务器上配的 Intel Ethernet Server Adapter X520-T2 万兆网卡居然在 VMware ESXi 里找不到,查了一下有 VMware 的官方驱动,不过需要另外安装。

到 VMWare 官方网站下载网卡驱动,然后上传到 VMware ESXi 服务器的一个临时目录 /tmp(用 scp 上传的话当然首先要开启 VMware ESXi 的 SSH 服务):

$ scp ixgbe-3.4.23-458775.zip root@192.168.2.8:/tmp

ssh 登陆到 VMware ESXi 服务器后解压驱动包,解压后会得到后缀为 .vib 的驱动文件:

$ ssh root@192.168.2.8
Password: 
The time and date of this login have been sent to the system logs.

VMware offers supported, powerful system administration tools.  Please
see www.vmware.com/go/sysadmintools for details.

The ESXi Shell can be disabled by an administrative user. See the
vSphere Security documentation for more information.
~ # cd /tmp/
/tmp # unzip ixgbe-3.4.23-458775.zip 
Archive:  ixgbe-3.4.23-458775.zip
  inflating: ixgbe-3.4.23-offline_bundle-458775.zip
  inflating: net-ixgbe-3.4.23-1OEM.500.0.0.406165.x86_64.vib
  inflating: doc/README.txt
  inflating: source/driver_source_net-ixgbe_3.4.23-1OEM.500.0.0.406165.tgz
  inflating: doc/open_source_licenses_net-ixgbe_3.4.23-1OEM.500.0.0.406165.txt
  inflating: doc/release_note_net-ixgbe_3.4.23-1OEM.500.0.0.406165.txt

使用 esxcli 命令行安装 vib 驱动并检查是否安装成功:

/tmp # esxcli software vib install -v /tmp/net-ixgbe-3.4.23-1OEM.500.0.0.406165.x86_64.vib 
Installation Result
   Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
   Reboot Required: true
   VIBs Installed: Intel_bootbank_net-ixgbe_3.4.23-1OEM.500.0.0.406165
   VIBs Removed: 
   VIBs Skipped: 

/tmp # esxcli software vib list
Name                  Version                             Vendor  Acceptance Level  Install Date
--------------------  ----------------------------------  ------  ----------------  ------------
net-ixgbe             3.4.23-1OEM.500.0.0.406165          Intel   VMwareCertified   2012-02-24
...

安装成功后重启 VMware ESXi,然后查看一下 Intel Corporation 10-Gigabit 网卡驱动是否能被正确识别出来:

/tmp # lspci | grep 'Network controller'
000:001:00.0 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic0]
000:001:00.1 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic1]
000:002:00.0 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic2]
000:002:00.1 Network controller: Broadcom Corporation Broadcom NetXtreme II BCM5709 1000Base-T [vmnic3]
000:007:00.0 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic4]
000:007:00.1 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic5]
000:008:00.0 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic6]
000:008:00.1 Network controller: Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection [vmnic7]

使用 vSphere Client 客户端登入 VMware ESXi 以后,进入 Configuration 页面的 Network Adapters 应该会看到新安装的 vmnic4, vmnic5, vmnic6, vmnic7 4个网卡接口了,或者直接在 ESXi 上用命令行界面:

~ # esxcfg-nics -l
Name    PCI           Driver      Link Speed     Duplex MAC Address       MTU    Description                   
...
vmnic4  0000:07:00.00 ixgbe       Up   10000Mbps Full   90:e2:ba:05:2d:fc 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection
vmnic5  0000:07:00.01 ixgbe       Down 0Mbps     Half   90:e2:ba:05:2d:fd 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection
vmnic6  0000:08:00.00 ixgbe       Down 0Mbps     Half   90:e2:ba:05:29:98 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection
vmnic7  0000:08:00.01 ixgbe       Up   10000Mbps Full   90:e2:ba:05:29:99 1500   Intel Corporation 82599EB 10-Gigabit SFI/SFP+ Network Connection

Protected: OpenStack 杂志稿(已在杂志上发表,editors only)

This content is password protected. To view it please enter your password below:

使用 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 root@172.16.39.200
[root@server-25 ~]# 

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