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

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

为 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

为 OpenNebula 制作 Ubuntu 镜像

上次我们介绍了给 OpenNebula 制作 Windows 镜像,当然了少不了 Ubuntu 了,为 OpenNebula 制作 Ubuntu 镜像的步骤和制作 Windows 镜像差不多,以下是具体步骤:

首先下载需要安装的 ubuntu 版本:

$ wget http://releases.ubuntu.com/11.10/ubuntu-11.10-server-amd64.iso

创建一个 10GB 大小的 “硬盘”(raw 格式):

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

然后使用刚才下载的 ubuntu “安装盘” 和刚创建的 “硬盘” 引导启动系统,使用 -vnc 参数打开 vnc 访问,以便可以用其他机器远程登录进行安装操作:

$ sudo kvm -m 512 -cdrom ubuntu-11.10-server-amd64.iso \
-drive file=ubuntu.img -boot d -nographic -vnc :0

在其他机器上用 vnc 客户端登录后就可以看到 Ubuntu 安装界面,按照屏幕的提示完成 ubuntu 的安装工作,需要注意的是分区的时候只分一个区给 /,不要分 swap 区,以后 VPSee 将会提到如何给虚拟机加上交换分区:

$ vncviewer 172.16.39.111:5900

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

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

$ sudo apt-get install kvm-pxe

再次用 vnc 登录虚拟机镜像,升级和更新系统,可以安装一些必要工具,比如 OpenSSH 之类的:

$ vncviewer 172.16.39.111:5900

$ sudo update
$ sudo upgrade
$ sudo apt-get install openssh-server

创建和编辑虚拟网络配置文件,然后创建一个 OpenNebula 虚拟网络(参考:在 CentOS 上安装和配置 OpenNebula):

$ vi small_network.net
NAME = "Small network"
TYPE = FIXED

BRIDGE = br0
LEASES = [ IP="172.16.39.111"]
LEASES = [ IP="172.16.39.112"]
LEASES = [ IP="172.16.39.113"]

$ onevnet create small_network.net 

$ onevnet list
  ID USER     NAME              TYPE BRIDGE P #LEASES
   0 oneadmin Small network    Fixed    br0 N       0

创建和编辑 Ubuntu 虚拟机的启动配置文件。注意别忘了加上 ARCH = x86_64(否则无法正常启动 Ubuntu),我们刚才安装的是 Ubuntu 64位 Server 版(ubuntu-11.10-server-amd64.iso):

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 ]

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

NIC    = [ NETWORK = "Small network" ]

依照上面的配置在 OpenNebula 上创建一个 Ubuntu 虚拟机,等待一下 OpenNebula 会自动根据当前资源情况调度,期间不断用 onevm list 命令查看当前虚拟机的创建情况,状态会从 pend -> prol -> boot -> runn,runn 状态就表示虚拟机已经成功创建并正常运行。最后检查一下 OpenNebula 是否成功创建一个名叫 ubuntu 的虚拟机:

$ onevm create ubuntu.one

$ onevm list
   ID     USER     NAME STAT CPU     MEM        HOSTNAME        TIME
   42 oneadmin   ubuntu runn   1    512M          node00 00 01:16:39

如果发现启动 Ubuntu 镜像后不能 virsh console 到 ubuntu 虚拟机的话,需要设置在 KVM 上访问 Linux 虚拟机终端,并且可以在上面的模板文件里加入:

RAW = [ type = "kvm", data = "<devices><serial type=\"pty\"><source path=\"/dev/pts/5\"/>
<target port=\"0\"/></serial><console type=\"pty\" tty=\"/dev/pts/5\"><source path=\"/dev
/pts/5\"/><target port=\"0\"/></console></devices>" ]

安装 OpenStack 基于 Web 的管理控制台

OpenStack 基于 Web 的管理控制台 OpenStack Dashboard 是用 Python 和 Django 框架写的,部署到生产环境比较麻烦,没有基于 PHP 的 web 程序那么直观,不过 OpenStack Dashboard 项目正在快速开发中,还不稳定,一般不会用到生产环境,所以想试玩的话用 Django 自带的 web server 就可以了。如果想部署到生产环境建议用 apache + mod_wsgi 的方式,这也是 django 官方建议部署 django app 的方式。

安装版本控制工具和 python 虚拟环境:

$ sudo apt-get install -y git bzr
$ sudo easy_install virtualenv

下载 openstack dashboard 源代码并运行 run_tests.sh:

$ git clone https://github.com/4P/openstack-dashboard.git
$ cd openstack-dashboard
$ sudo sh run_tests.sh

如果上面的最新 git 代码不好用,需要找旧版本的 openstack dashboard,需要使用 bzr 从 launchpad 下载(今年6月份 openstack dashboard 项目从 launchpad 移到 github)。最新的 64 版本使用了最新的 django 1.3,安装没问题但是访问的时候显示 ViewDoesNotExist 错误,所以 VPSee 建议使用旧的 46 版本(django 1.2.4):

$ bzr init-repo .
$ bzr branch lp:openstack-dashboard
$ cd openstack-dashboard
$ bzr revert -r 46
$ sudo sh run_tests.sh

安装脚本里用到了 git,如果你的网络环境需要代理才能上网的话需要配置一下 git 使用 http 代理服务器

对照 在 Ubuntu 上安装和配置 OpenStack Nova 一文并在 /home/vpsee/creds/novarc 文件里找到 NOVA_ACCESS_KEY, NOVA_SECRET_KEY 等相关信息填写以下参数:

$ vi openstack-dashboard/local/local_settings.py
...
NOVA_DEFAULT_ENDPOINT = 'http://172.16.39.111:8773/services/Cloud'
NOVA_DEFAULT_REGION = 'nova'
NOVA_ACCESS_KEY = '22781cf0-b8b6-44e8-86c8-baf8d3827662:mycloud'
NOVA_SECRET_KEY = '2dc4007f-3425-417b-a598-33a190d2f995'
NOVA_ADMIN_USER = 'vpsee'
NOVA_PROJECT = 'mycloud'
...

同步数据库的时候需要创建一个 superuser 访问 django web:

$ source .dashboard-venv/bin/activate

$ sudo tools/with_venv.sh dashboard/manage.py syncdb
Creating table auth_permission
...
Creating table registration_registrationprofile

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no):

$ sudo tools/with_venv.sh dashboard/manage.py runserver 172.16.39.111:8000
Validating models...
0 errors found

Django version 1.2.4, using settings 'dashboard.settings'
Development server is running at http://172.16.39.111:8000/
Quit the server with CONTROL-C.

现在打开浏览器输入 http://172.16.39.111:8000/ 就应该可以看到登录界面,输入刚才创建的 superuser 的用户名和密码后就可以进入控制台了。控制台的功能有限,没有命令行那么丰富,不过基本的创建、查看、关闭 instance 功能还是有的:

openstack dashboard

为 OpenStack Nova 制作 Windows 镜像

上次 VPSee 给 OpenStack Nova 制作 Ubuntu 镜像的时候忘了介绍制作 Windows 镜像和在 Nova 上运行 Windows 虚拟机的情况,前几天刚好有人在微薄上问到这个问题。在 Nova 上运行 Windows 的虚拟机其实很容易,和运行 Linux 虚拟机差不多:先制作一个 Windows 虚拟机镜像(模板),然后再以这个镜像为模板来创建 Windows 虚拟机(实例)。

安装 Windows 镜像

创建一个 10GB 大小的 “硬盘”(raw 格式):

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

openstack 启动虚拟机实例的时候使用的是 virtio 接口,但是 windows 默认没有这个接口的驱动,所以需要额外的驱动。然后使用 ISO 文件的 windowsxp.iso 安装盘来安装 Windows:

$ wget http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/bin/
virtio-win-1.1.16.vfd

$ sudo kvm -m 1024 -cdrom windowsxp.iso -drive file=windowsxp.img,if=virtio,boot=on \
-fda virtio-win-1.1.16.vfd -boot d -nographic -vnc :0

在另外一台机器上使用 vnc 客户端就可以看到 windows 安装过程和进行操作:

$ vncview 172.16.39.111:5900

安装完 windows 后可以进行一些必要的定制,比如打开 RDP 访问、设置防火墙不要屏蔽 RDP 等,这时候也可以安装一些必要软件,要注意的是这个是以后的模板,要尽量保持系统原样,最好不要做定制也不要装任何软件,可以留给客户自己做,定制这东西每个人口味都不同。

发布 Windows 镜像

windows 虚拟机镜像做好以后就可以发布到云里了,注册镜像后会得到一个标志符 ami-00000004,以后就用这个 ami-00000004 来识别云里面的镜像(还记得我们上次做的 ubuntu 镜像的标志符是 ami-00000003 吗?):

$ euca-bundle-image -i windowsxp.img 
Checking image
Encrypting image
Splitting image...
Part: windowsxp.img.part.00
Part: windowsxp.img.part.01
...
Part: windowsxp.img.part.65
Generating manifest /tmp/windowsxp.img.manifest.xml

$ euca-upload-bundle -b mybucket -m /tmp/windowsxp.img.manifest.xml 
Checking bucket: mybucket
Uploading manifest file
Uploading part: windowsxp.img.part.00
...
Uploading part: windowsxp.img.part.65
Uploaded image as mybucket/windowsxp.img.manifest.xml

$ euca-register mybucket/windowsxp.img.manifest.xml
IMAGE	ami-00000004

检验一下 windows 镜像是否上传成功,ami-00000004 就是我们刚做的 windows 镜像:

$ euca-describe-images
IMAGE	aki-00000001	mybucket/vmlinuz-2.6.32-28-server.manifest.xml		available	public		x86_64	kernel	 	 
IMAGE	ari-00000002	mybucket/initrd.img-2.6.32-28-server.manifest.xml		available	public		x86_64	ramdisk	 	 
IMAGE	ami-00000003	mybucket/ubuntutemplate.img.manifest.xml		available	public		x86_64	machine	aki-00000001	ari-00000002
IMAGE	ami-00000004	mybucket/windowsxp.img.manifest.xml		untarring	public		x86_64	machine

第一个 Windows 虚拟机实例

有了这个 windows 模板(镜像)以后我们就可以以这个 “镜像” 为模板来为云计算用户创建 n 个 windows 虚拟机,运行之前需要 key:

$ 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-00000004
RESERVATION	r-er0zkjm7	mycloud	default
INSTANCE	i-00000003	ami-00000004			scheduling	mykey (mycloud, None)	0	m1.small	2011-06-20T14:08:45Z	unknown zone

然后用 nova-manage 命令检查是否成功运行 windows 虚拟机,状态栏 state 应该是 running 状态:

$ sudo nova-manage vm list
instance   node            type       state      launched            image        kernel       ramdisk       project    user       zone       index
i-00000003 node01           running    2011-06-20 14:12:49 7                                       mycloud    vpsee       None       0

大功告成,用一个 RDP 客户端连接 windows 就可以了(这个 windows 云虚拟机使用的是内部 IP):

# rdesktop 192.168.3.4

为 OpenStack Nova 制作 Ubuntu 镜像

最近超级忙,被 Mesh Potato 的项目折腾的不行,发现只要什么东西沾上 “分布式、集群” 这些东西事情就变得格外复杂,一台 Asterisk 服务器做 VoIP 容易,n 台 Asterisk 服务器做集群就不容易;一台 Xen/KVM 服务器做虚拟机容易,n 台 Xen/KVM 服务器做云计算就不是那么容易。上星期我们介绍了在 Ubuntu 上安装和配置 OpenStack Nova,今天来进一步介绍如何在 OpenStack Nova 环境里制作虚拟机模板(镜像)以及创建虚拟机运行实例(以 Ubuntu 为例子)。为了和我们平时说的 “VMware/Xen/KVM/VirtualBox 虚拟机” 区分开,VPSee 在这里把在 OpenStack Nova、OpenNebula 这样的云计算平台上运行的虚拟机称为 “云虚拟机”。简单说在 OpenStack Nova 平台上运行一个 ubuntu 虚拟机的流程是:先制作一个 ubuntu 虚拟机镜像(模板),然后再以这个镜像为模板来创建 ubuntu 虚拟机(实例)。

安装 Ubuntu 镜像

首先下载要安装的 ubuntu 版本:

$ wget http://releases.ubuntu.com/lucid/ubuntu-10.04.2-server-amd64.iso

创建一个 10GB 大小的 “硬盘”(raw 格式):

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

使用刚才下载的 ubuntu “安装盘” 和刚创建的 “硬盘” 引导启动系统,为了简单起见,VPSee 在这里使用 kvm 虚拟技术,避开 xen 繁琐的配置。-vnc 参数代表打开 vnc 访问,以便可以用其他机器远程登录到这个引导界面进行安装操作:

$ sudo kvm -m 512 -cdrom ubuntu-10.04.2-server-amd64.iso \
-drive file=ubuntu.img -boot d -nographic -vnc :0

用 vncviewer 登录引导界面后按照屏幕的提示完成 ubuntu 的安装工作(和在自己电脑上安装 ubuntu 过程一样)。需要注意的是在分区阶段把 10GB 硬盘全部划分成一个 ext4 root 分区,不要创建多个分区也不要创建 swap 区:

$ vncviewer 172.16.39.111:5900

安装完后退出(必要时 kill 掉 kvm 进程),按照下面命令启动刚刚安装好的虚拟机镜像 ubuntu.img,如果出现 failed to find romfile “pxe-rtf8139.bin” 的错误提示可以通过安装 kvm-pxe 解决:

$ sudo kvm -m 512 -drive file=ubuntu.img -boot c -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

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install openssh-server cloud-init

70-persistent-net.rules 会自动添加其他的网络接口,需要删除这个文件避免自动添加除了 eth0 以外的接口。删除后系统基本就准备好了,关闭虚拟机:

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

$ sudo shutdown -h now

调整 Ubuntu 镜像

因为 OpenStack 只接受 ext4 文件系统格式的镜像,所以需要把上面创建的 raw 镜像(kvm-img create -f raw)转换成 ext4 镜像。下面的步骤用来找出镜像文件里面的分区起点是从哪里开始的:

$ sudo losetup -f ubuntu.img 
$ sudo losetup -a
/dev/loop0: [fb00]:24117291 (/home/vpsee/ubuntu.img)

$ sudo fdisk -cul /dev/loop0

Disk /dev/loop0: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000502e6

      Device Boot      Start         End      Blocks   Id  System
/dev/loop0p1   *        2048    20969471    10483712   83  Linux

上面最后一行显示分区是从扇区(sector)2048开始的,每个扇区是512个字节,所以是从 2048 x 512 = 1048576个字节开始的。记住这个1048576,下面会用到。

卸载 loop 后重新从1048576字节开始挂载:

$ sudo losetup -d /dev/loop0

$ sudo losetup -f -o 1048576 ubuntu.img 
$ sudo losetup -a
/dev/loop0: [fb00]:24117291 (/home/vpsee/ubuntu.img), offset 1048576

把这整个分区拷贝到一个新文件就是一个我们要的 ext4 文件系统镜像:

$ sudo dd if=/dev/loop0 of=ubuntutemplate.img
20969472+0 records in
20969472+0 records out
10736369664 bytes (11 GB) copied, 107.455 s, 99.9 MB/s

用完 loop 后记得卸载:

$ sudo losetup -d /dev/loop0

挂载(mount)刚创建的 ext4 文件系统镜像,并修改分区加载表(/etc/fstab),注释或删除以前的,加上 UUID=uec-rootfs 一行:

$ sudo mount -o loop ubuntutemplate.img /mnt

$ sudo vi /mnt/etc/fstab
#UUID=1dc3a59e-faab-41ee-b232-3300163676bf / ext4 errors=remount-ro 0 1
UUID=uec-rootfs                           / ext4 defaults          0 0

把内核(vmlinuz)和内存盘(initrd)文件拷贝出来以便后面和虚拟机镜像一起发布到OpenStack 云里。使用完虚拟机镜像后记得卸载(unmount):

$ sudo cp /mnt/boot/vmlinuz-2.6.32-28-server /home/vpsee/
$ sudo cp /mnt/boot/initrd.img-2.6.32-28-server /home/vpsee/

$ sudo umount /mnt

把刚才的虚拟机镜像 ubuntutemplate.img 的文件系统标志改成 ‘uec-rootfs’:

$ sudo tune2fs -L uec-rootfs ubuntutemplate.img 
tune2fs 1.41.14 (22-Dec-2010)

发布 Ubuntu 镜像

好了,ubuntu 镜像已经做好了,现在可以发布到云里了,需要3个东西,虚拟机的内核文件、虚拟机的内存盘文件和虚拟机镜像文件:

$ uec-publish-image -t image --kernel-file vmlinuz-2.6.32-28-server \
--ramdisk-file initrd.img-2.6.32-28-server amd64 ubuntutemplate.img mybucket
ami-00000006	mybucket/ubuntutemplate.img.manifest.xml

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

$ euca-describe-images

IMAGE	aki-00000001	mybucket/vmlinuz-2.6.32-28-server.manifest.xml		availablpublic		x86_64	kernel	 	 
IMAGE	ari-00000002 	mybucket/initrd.img-2.6.32-28-server.manifest.xml		available	public		x86_64	ramdisk	 	 
IMAGE	ami-00000003	mybucket/ubuntutemplate.img.manifest.xml		untarring	public		x86_64	machine	aki-00000001	ari-00000002

第一个 Ubuntu 虚拟机实例

有了 ubuntu 镜像(模板)以后我们就可以以这个 “镜像” 为模板来为云计算用户创建 n 个 ubuntu 虚拟机(操作系统)实例,不过在运行实例之前需要 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.tiny ami-00000003
RESERVATION	r-n0lpdme5	vpseecloud	default
INSTANCE	i-00000001	ami-00000003			scheduling	mykey (vpseecloud, None)	0		m1.tin2011-05-20T14:00:34Z	unknown zone

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

$ sudo nova-manage vm list
instance   node            type       state      launched            image        kernel       ramdisk       project    user       zone       index
i-00000001 node01           launching  None                3            1            2             vpseecloud    vpsee       None       0

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

$ sudo nova-manage network list
network           	netmask        	start address  	DNS            
192.168.3.0/25    	255.255.255.128	192.168.3.3    	None           

刚才用 euca-run-instances 启动的一个 ubuntu 虚拟机实例的 IP 就是从 192.168.3.3 开始的,所以 ssh 登录这个 IP 就登上了我们的第一个云虚拟机:)

$ ssh 192.168.3.3
vpsee@i-00000001:~$ 

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

在 Ubuntu 上安装和配置 OpenStack Nova

openstack

OpenStack 是由 Rackspace 和 NASA 共同开发的云计算平台,帮助服务商和企业内部实现类似于 Amazon EC2 和 S3 的云基础架构服务(Infrastructure as a Service, IaaS)。OpenStack 包含两个主要模块:Nova 和 Swift,前者是 NASA 开发的虚拟服务器部署和业务计算模块;后者是 Rackspack 开发的分布式云存储模块,两者可以一起用,也可以分开单独用。OpenStack 是开源项目,除了有 Rackspace 和 NASA 的大力支持外,后面还有包括 Dell, Citrix, Cisco, Canonical 这些重量级公司的贡献和支持,发展速度非常快,有取代另一个业界领先开源云平台 Eucalyptus 的态势。

OpenStack 是 Python 2.6 写的,CentOS 5.6 上默认的是 Python 2.4 的环境并且还有很多依赖关系不容易升级到 2.6,所以在 Ubuntu 上安装会简单一些,而且 Ubuntu 是 OpenStack 的官方首选系统,文档都是按 Ubuntu 写的,所以这里 VPSee 采用最新的 Ubuntu 11.04 Server 64bit 版本来安装和配置 OpenStack Nova. 使用 CentOS 的朋友可以看看:在 CentOS 上安装和配置 OpenStack Nova;如果对其他类似的开源云计算平台感兴趣的话可以看看:在 CentOS 上安装和配置 OpenNebula.

配置网络

在安装完基本的 Ubuntu 11.04 Server 系统后升级和更新整个系统,安装完 bridge-utils 包后重启系统:

$ sudo apt-get update
$ sudo apt-get upgrade

$ sudo apt-get install bridge-utils

$ sudo reboot

配置网桥:

$ sudo vi /etc/network/interfaces

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 172.16.39.111
netmask 255.255.254.0
gateway 172.16.38.1

auto br100
iface br100 inet static
bridge_ports eth1
bridge_stp off
bridge_maxwait 0
bridge_fd 0
address 192.168.0.1
netmask 255.255.0.0
broadcast 192.168.255.255

关于 FlatManager 网络配置可参考:OpenStack Nova 安装后的 FlatManager 网络配置

安装 NTP 服务

OpenStack Nova 需要 NTP 服务器来保持所有节点服务器(Cloud Compute)的时间同步,所以需要在前端控制服务器(Cloud Controller)上安装 NTP 服务器,然后在节点服务器上安装 NTP 客户端保持与前端的同步:

$ sudo apt-get install ntp

$ sudo vi /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 10

$ sudo /etc/init.d/ntp restart

安装和配置 MySQL 数据库

OpenStack Nova 需要数据库的支持,这里选用 MySQL(当然也可以用其他的数据库,比如 PostgreSQL 等):

$ sudo apt-get install mysql-server

修改 MySQL 绑定地址,以便其他的节点服务器也能访问这个数据库:

$ sudo vi /etc/mysql/my.cnf
...
#bind-address           = 127.0.0.1
bind-address            = 0.0.0.0
...

$ sudo /etc/init.d/mysql restart

创建一个名为 nova 的数据库,并设置 root 从任何 IP 访问的权限和密码:

$ sudo mysql -uroot -ppassword -e 'CREATE DATABASE nova;'
$ sudo mysql -uroot -ppassword -e "GRANT ALL PRIVILEGES ON *.* TO \
'root'@'%' WITH GRANT OPTION;"
$ sudo mysql -uroot -ppassword -e "SET PASSWORD FOR \
'root'@'%' = PASSWORD('password');"

安装 Glance 镜像服务

Glance 是个镜像服务器,用来给 OpenStack Nova 提供操作系统镜像(image)服务,提供可选择的操作系统模版(镜像)。

$ sudo apt-get install glance

安装 OpenStack Nova

OpenStack Nova 已经进入 Ubuntu 11.04 源,所以直接安装就可以了,不必源码安装:

$ sudo apt-get install rabbitmq-server nova-common nova-doc python-nova 
nova-api nova-network nova-volume nova-objectstore nova-scheduler nova-compute

$ sudo apt-get install -y euca2ools

$ sudo apt-get install -y unzip

配置 Nova:

$ sudo vi /etc/nova/nova.conf
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--logdir=/var/log/nova
--state_path=/var/lib/nova
--lock_path=/var/lock/nova
--verbose
--s3_host=172.16.39.111
--rabbit_host=192.168.0.1
--cc_host=192.168.0.1
--ec2_url=http://172.16.39.111:8773/services/Cloud
--fixed_range=192.168.0.0/16
--network_size=8
--FAKE_subdomain=ec2
--routing_source_ip=192.168.0.1
--sql_connection=mysql://root:password@172.16.39.111/nova
--glance_host=192.168.0.1
--image_service=nova.image.glance.GlanceImageService

重启 nova 相关服务以便设置生效:

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

使用 Nova

开始使用 Nova 前需要创建 nova 数据库表、创建网络、创建管理员帐号、创建云并联到刚才创建的管理员上:

$ sudo nova-manage db sync
$ sudo nova-manage network create 192.168.0.0/24 1 255
$ sudo nova-manage floating create 10.10.10.2 10.10.10.224/27
$ sudo nova-manage user admin vpsee
$ sudo nova-manage project create mycloud vpsee

因为多个管理员可以创建多个不同的云,所以某个云的管理员需要特定的权限才能访问和管理自己的 Nova 云,创建权限信息,并解压到自己的目录里,需要注意的是每次使用 nova 管理云的时候都需要读取 novarc 里面的配置信息:

$ mkdir /home/vpsee/creds
$ sudo nova-manage project zipfile mycloud vpsee /home/vpsee/creds/novacreds.zip

$ cd /home/vpsee/creds
$ unzip novacreds.zip
$ sudo chown -R vpsee:vpsee /home/vpsee/creds/

$ source /home/vpsee/creds/novarc

每次用 nova 的时候都要用到 novarc 里面的环境变量,每次 source novarc 很麻烦,所以最好加到 .bashrc 里面:

$ cat  /home/vpsee/creds/novarc >> /home/vpsee/.bashrc
$ source /home/vpsee/.bashrc

再次重启 nova 相关的所有服务:

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

如果一切正常的话,应该可以打印出如下的类似信息:

$ euca-describe-availability-zones verbose
AVAILABILITYZONE	nova	available
AVAILABILITYZONE	|- node00
AVAILABILITYZONE	| |- nova-scheduler	enabled :-) 2011-05-22 10:32:31
AVAILABILITYZONE	| |- nova-network	enabled :-) 2011-05-22 10:32:32
AVAILABILITYZONE	| |- nova-compute	enabled :-) 2011-05-22 10:32:24

如果出现这个问题,检查 novarc 这个文件看看 EC2_URL, S3_URL, NOVA_URL 这三行是不是有两个连续的 http://?

$ euca-describe-availability-zones verbose
invalid literal for int() with base 10: ''

$ vi /home/vpsee/creds/novarc
...
export EC2_URL="http://http://172.16.39.100:8773/services/Cloud"
export S3_URL="http://http://172.16.39.100:3333"
...
export NOVA_URL="http://http://172.16.39.100:8774/v1.1/"
...

删除一个 http:// 就可以了:

$ vi /home/vpsee/creds/novarc
...
export EC2_URL="http://172.16.39.100:8773/services/Cloud"
export S3_URL="http://172.16.39.100:3333"
...
export NOVA_URL="http://172.16.39.100:8774/v1.1/"
...

启动第一个实例

启动实例之前需要先上传一个系统模版,我们称之为镜像(image),自己制作操作系统镜像有点麻烦(请看:为 OpenStack Nova 制作 Ubuntu 镜像为 OpenStack Nova 制作 CentOS 镜像为 OpenStack Nova 制作 Windows 镜像。),这里直接使用一个已经做好的 Ubuntu 10.10 版本镜像,下载已经做好的镜像文件并上传到镜像服务器(这里镜像服务器和前端服务器在同一台物理服务器上):

$ wget http://c0179148.cdn1.cloudfiles.rackspacecloud.com/ubuntu1010-UEC-localuser-image.tar.gz

$ uec-publish-tarball ubuntu1010-UEC-localuser-image.tar.gz ubuntu1010-bucket x86_64

列出云里现有的可以加载的镜像,并以某个镜像(比如编号为 ami-00000003)为模版启动一个实例(操作系统):

$ euca-describe-images
IMAGE	aki-00000001	ubuntu1010-bucket/vmlinuz-2.6.32-28-server.manifest.xml		available	public		x86_64	kernel	 	 
IMAGE	ari-00000002	ubuntu1010-bucket/initrd.img-2.6.32-28-server.manifest.xmavailable	public		x86_64	ramdisk	 	 
IMAGE	ami-00000003	ubuntu1010-bucket/maverick-server-uec-amd64.img.manifest.xml		available	public		x86_64	machine	aki-00000001	ari-00000002

$ euca-add-keypair mykey > mykey.priv

$ euca-run-instances -k mykey -t m1.tiny ami-00000003

检查一下实例是否成功启动和运行:

$ virsh list
 Id Name                 State
----------------------------------
  1 instance-00000001    running

访问实例

启动实例后怎么访问呢?和访问 VPS 一样,需要 IP 地址然后 ssh 访问,还记得上面的网络配置么,新创建的系统将按照 192.168.0.x 的形式分配 IP,所以 192.168.0.3 就是刚刚 euca-run-instances 创建的实例的 IP 地址:

$ ssh ubuntu@192.168.0.3

Troubleshooting

解决 DataSourceEc2.py[WARNING]: ‘http://169.254.169.254′ failed: url error 问题
删除 OpenStack Nova Volume 时遇到的 error_deleting 问题
解决 Warning: failed to parse error message from AWS: :1:0: syntax error 问题
重置 OpenStack Nova 数据库

Ubuntu 10.04 上编译安装 Xen 4.0.1 后的 xend 启动问题

因为 Ubuntu 10.04 不再官方维护 Xen 软件包了(RedHat 6 也不再支持 Xen 了),所以以后要想在这两大平台上用到 Xen 的话就需要自己亲自下载 Xen 源代码编译安装(当然也可以用第三方源)。今天 VPSee 在一台 Ubuntu 10.04 服务器上升级 Xen 到 4.0.1 的时候遇到一个问题,按照 Ubuntu 9.10 上源码安装 Xen 上的步骤编译和安装都正常,启动 Xen 内核也没问题,最后启动 xend 的时候报错如下:

$ sudo /etc/init.d/xend start
Traceback (most recent call last):
  File "/usr/sbin/xend", line 36, in 
    from xen.xend.server import SrvDaemon
ImportError: No module named xen.xend.server
Traceback (most recent call last):
  File "/usr/sbin/xend", line 36, in 
    from xen.xend.server import SrvDaemon
ImportError: No module named xen.xend.server
.Traceback (most recent call last):
  File "/usr/sbin/xend", line 36, in 
    from xen.xend.server import SrvDaemon
ImportError: No module named xen.xend.server
.Traceback (most recent call last):
  File "/usr/sbin/xend", line 36, in 
    from xen.xend.server import SrvDaemon

刚开始怀疑是 Python 版本问题,后来查了一下 /usr/sbin/xend 文件发现第36行:from xen.xend.server import SrvDaemon 在导入 SrvDaemon 就报错,xend 可能没有找到 xen tools,怀疑和安装路径有关。Ubuntu 上 Python 的默认安装在 /usr/lib/python2.6/ 下面,如果不设定 PYTHON_PREFIX_ARG 参数手动编译安装 xen tools 后也会默认安装到 /usr/lib/python2.6/,这样就出问题了,因为 xend 会默认从 /usr/local/lib/python2.6/dist-packages/ 找 script 和导入库,但是这时候 /usr/local/lib/python2.6/dist-packages/ 下面什么东西都没有。所以要改变 install-tools 的默认安装路径到 /usr/local/lib/python2.6/dist-packages/ 下,PYTHON_PREFIX_ARG 不带任何参数就可以了:

$ sudo make install-tools PYTHON_PREFIX_ARG=

最后检查一下是否能正常启动 xend:

$ sudo /etc/init.d/xend start
$ sudo xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3713     4     r-----      6.4

免费试用1小时 Amazon EC2 云计算服务

Amazon 是目前最大的的云计算基础服务供应商,拥有最稳定和真正产业化的云计算业务和产品 Amazon EC2. 前天10月10日, Canonical 如期发布了 Ubuntu 10.10 版本,口号是 “10 out of 10″,并联合 Amazon 免费为尝鲜者提供1小时的 Ubuntu 10.10 Server 版本的试用,有点像当初 Ubuntu 桌面版免费寄光盘的味道,现在光盘驱动器安装操作系统的方式已经过时了,云时代流行 iso 和模板安装。以后每个人都可能在云里有个空间(系统),电脑、手机、iPad 一打开就直接到云里操作,而不是操作本地设备了。这种把应用程序和数据搬到云端的计算方式可以随时随地的进行,也不用担心数据在不同设备里的同步和丢失,真是很方便。几年前记得我的 Email 都是用邮件客户端来收发的,比如 Mutt, Thunderbird 等,电脑一坏或者换台机器就担心丢 Email 、联系人或者同步问题,现在直接在 Gmail 里操作,数据总是在 Google 云里(如果相信 Google 的话),无非是选择什么样的设备(Mac/iPhone/iPad/Windows/Linux/Android)去连接和操作而已。

对 Amazon EC2 和 Ubuntu 10.10 感兴趣的朋友可以通过 Try Ubuntu 10.10 Server in Amazon EC2 这个链接来申请免费试用1个小时的云计算服务。不要被 “云” 概念忽悠,云计算实际上是建立在虚拟技术上(多半是 Xen)、为消费者提供的一种按需使用的基础计算资源和服务模式,说白了就是1个 Xen VPS 而已,只不过这个 VPS 能实现自动化管理、分布式存储、备份冗余、按需增减资源、计算账单等。虽然大多数云基础服务商都依靠虚拟技术来架构云,但虚拟技术不是必须的,比如 Google 云就是建立在物理机上。免费试用的 Amazon EC2 申请过程很简单,成功注册后就会立刻得到 IP 和密码,按照提示直接 ssh ubuntu@174.129.161.70 就可以登录了:

ubuntu in the amazon ec2

下面是 Amazon EC2 这个虚拟机的配置,1颗 Xen CPU E5430@2.66GHz,1.6GB 的内存:

ubuntu@ip-10-112-233-200:~$ cat /proc/cpuinfo 
processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 23
model name	: Intel(R) Xeon(R) CPU           E5430  @ 2.66GHz
stepping	: 10
cpu MHz		: 2659.998
cache size	: 6144 KB
fdiv_bug	: no
hlt_bug		: no
f00f_bug	: no
coma_bug	: no
fpu		: yes
fpu_exception	: yes
cpuid level	: 13
wp		: yes
flags		: fpu tsc msr pae cx8 cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht pbe nx lm constant_tsc up arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 lahf_lm tpr_shadow vnmi flexpriority
bogomips	: 5319.99
clflush size	: 64
cache_alignment	: 64
address sizes	: 38 bits physical, 48 bits virtual
power management:

ubuntu@ip-10-112-233-200:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          1665         73       1592          0          7         42
-/+ buffers/cache:         24       1641
Swap:          895          0        895

在 Ubuntu 上源码安装 Xen

这篇文章是在写 在 Debian 上源码安装 Xen 的时候一起写的,原本以为 Ubuntu 和 Debian 很相似、差别不大,配置过程可以直接套用而不用大修改,试了才知道其实不是那么简单。Ubuntu 9.10 使用的是 grub 2.0,被证实一些 bug 会导致 Xen 不能在 grub 2.0 的引导下正常启动,所以一种 workaround 的办法就是删除掉 grub 2.0,使用老版本的 grub. VPSee 不喜欢在服务器上使用 Ubuntu 的最新版本就是因为 Ubuntu 更新速度太快,版本发行太频繁,导致很多旧版本的问题还没解决就要开始赶鸭子上架推新版本,对了,今天好像是 Ubuntu 10.04 LTS 的发行日。以下的操作记录使用最新的 Xen 4.0.0 源代码版本和 Ubuntu 9.10,这里还有在 CentOS 下源码安装 Xen 的过程。如果你在 Ubuntu 10.04 上编译安装 Xen 4.0.1 可能会遇到 xend 启动问题

安装需要的软件包

首先最小化安装 Ubuntu,然后安装编译 Xen 和 Linux xen kernel 所需要的软件包:

$ sudo apt-get install gcc g++ make patch libssl-dev bzip2 gettext \
zlib1g-dev python libncurses5-dev libjpeg62-dev libx11-dev \
libgcrypt11-dev pkg-config bridge-utils bcc bin86 libpci-dev \
libsdl-dev python-dev texinfo libc6-dev uuid-dev bison flex fakeroot \
build-essential crash kexec-tools makedumpfile  libncurses5 \
libncurses5-dev iasl gawk

$ sudo apt-get build-dep linux 

安装 Xen hypervisor 和 tools

到 http://www.xen.org/products/xen_source.html 下载最新的 Xen 源代码,然后解开、编译、安装,标准的 Linux 软件源码安装动作:

$ tar zxvf xen-4.0.0.tar.gz
$ cd xen-4.0.0/
$ make xen tools stubdom
$ sudo make install-xen install-tools install-stubdom

上面 make stubdom 的时候会从网上自动下载一些东西,所以如果是用代理上网的话需要在自己根目录下的 .wgetrc 里加上代理服务器,以便 wget 能通过代理正常下载:

$ vi .wgetrc
http_proxy = http://proxy.vpsee.com:3128/
use_proxy = on

加入到自动启动脚本中:

$ sudo update-rc.d xend defaults 20 21
$ sudo update-rc.d xendomains defaults 21 20

安装 Xen 内核

下载 xen 内核,给内核打补丁:

$ cd
$ wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.31.8.tar.bz2
$ tar -xjf linux-2.6.31.8.tar.bz2

$ wget http://gentoo-xen-kernel.googlecode.com/files/xen-patches-2.6.31-10.tar.bz2
$ mkdir xenpatch-2.6.31.8
$ cd xenpatch-2.6.31.8
$ tar -xjf ../xen-patches-2.6.31-10.tar.bz2
$ cd ..

$ cd linux-2.6.31.8
$ for i in `ls ../xenpatch-2.6.31.8/`; do patch -p1 < ../xenpatch-2.6.31.8/"$i"; done

配置内核,直接把系统已经存在的配置文件拷过来然后在此基础上修改:

$ cp /boot/config-2.6.31-14-server .config
$ make menuconfig

Processor type and features --->
  [*] Enable Xen compatible kernel
Networking support --->
  Networking options --->
    <*> 802.1d Ethernet Bridging
Device Drivers --->
  XEN --->
    [*] Privileged Guest (domain 0)
     Backend driver support
       Block-device backend driver
       Block-device tap backend driver
       Block-device tap backend driver 2
       Network-device backend driver
       PCI-device backend driver
       SCSI backend driver
       USB backend driver
    <*> Block-device frontend driver
    <*> Network-device frontend driver
     SCSI frontend driver
     USB frontend driver
    <*> Framebuffer-device frontend driver
    <*>   Keyboard-device frontend driver
    [*] Disable serial port drivers
    <*> Export Xen attributes in sysfs
        Xen version compatibility (3.3.0 and later) --->
           3.3.0 and later

配置好内核参数以后,保存配置文件、退出配置界面就可以开始编译 Linux 内核了:

$ make
$ sudo make install
$ sudo make modules_install
$ sudo update-initramfs -c -k 2.6.31.8
$ sudo depmod 2.6.31.8

如果 Xen 加了内核模块的话加入 /etc/modules 文件以便启动时候自动加载:

$ sudo vi /etc/modules
...
netbk
blkbk

Ubuntu 9.10 默认用的是 grub 2.0,被证实一些 bug 会导致 Xen 不能正常启动,删除 grub 2.0 换成老版本的 grub:

$ sudo apt-get purge grub-pc
$ sudo rm /boot/grub/*
$ sudo apt-get install grub
$ sudo grub-install --recheck /dev/sda
$ sudo update-grub
$ sudo vi /boot/grub/menu.lst

重新启动系统,就应该可以进入 dom0 了:

$ sudo reboot

Troubleshooting

如果重新启动系统能正常进入 dom0 但是执行 xm 命令时报错:

$ sudo xm list
Error: Unable to connect to xend: No such file or directory. Is xend running?

检查 Xen 日志,发现 'Permission denied' 问题,这也是常见问题,是因为 xen tools 和内核不搭配:

$ vi /var/log/xen/xend.log
...
[2010-04-16 11:55:57 2320] INFO (SrvDaemon:219) Xend exited with status 1.
[2010-04-16 13:56:04 13207] INFO (SrvDaemon:331) Xend Daemon started
[2010-04-16 13:56:04 13207] INFO (SrvDaemon:335) Xend changeset: unavailable.
[2010-04-16 13:56:04 13207] ERROR (SrvDaemon:347) Exception starting xend ((13, 'Permission denied'))
...

$ vi /var/log/xen/xend-debug.log
...
Xend started at Fri Apr 16 13:56:04 2010.
domctl operation failed -- need to rebuild the user-space tool set?
sysctl operation failed -- need to rebuild the user-space tool set?
Exception starting xend: (13, 'Permission denied')
...

所以解决办法就是下载对应的 xen 内核版本和 xen 工具。