在 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.

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

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

如何在 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 镜像

如何更换 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 正在计划开发中。

为 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>" ]

为 OpenNebula 制作 Windows 镜像

说是给 OpenNebula 做 Windows 镜像其实就是做个 KVM 上的 Windows 虚拟机而已,操作步骤无非就是:创建一个硬盘、在硬盘上安装 Windows 系统、把安装好的 Windows 镜像当作模板来复制和创建 Windows 虚拟机。

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

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

然后使用 ISO 文件的 windowsxp.iso 安装盘来安装 Windows,注意运行 kvm 需要 root 权限,否则会出现 open /dev/kvm: Permission denied 错误:

$ sudo kvm -m 1024 -cdrom windowsxp.iso -drive file=windowsxp.img -boot d -nographic -vnc :0

在另外一台机器上启动 vnc 客户端登录完成 windows 安装:

$ vncview 172.16.39.111:5900
或者
$ vncview 172.16.39.111:0

安装完 windows 后可以进行一些必要的定制,比如打开 RDP 访问、设置防火墙不要屏蔽 RDP 和 ICMP 等。

创建和编辑虚拟网络配置文件,然后创建一个 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

创建和编辑 Windows XP 虚拟机的启动配置文件:

$ vi windowsxp.one

NAME  = winxp
CPU   = 1
MEMORY = 1024

OS = [ boot = hd ]

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

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

FEATURES = [ acpi="yes" ]

NIC    = [ NETWORK = "Small network" ]

依照上面的配置在 OpenNebula 上创建一个 Windows 虚拟机,等待片刻后不断用 onevm list 命令查看当前虚拟机的创建情况,状态一般会从 pend -> prol -> boot -> runn,runn 状态就表示虚拟机已经成功创建并正常运行。最后检查一下 OpenNebula 是否成功创建一个名叫 winxp 的 Windows 虚拟机:

$ onevm create windowsxp.one

$ onevm list
   ID     USER     NAME STAT CPU     MEM        HOSTNAME        TIME
   32 oneadmin     winxp runn   6   1024M          node00 00 00:20:26

上面的 Windows 虚拟机无法正确得到 OpenNebula 预分配的 IP 地址,需要在 Windows 里配置网络连接手动绑定静态 IP,有办法可以从 OpenNebula 那里自动获得 IP,这个问题留到以后再说。

Joyent 发布 SmartOS 开源操作系统

以 OpenSolaris 为基础架构的云计算公司 Joyent 上周发布了他们自己的操作系统 SmartOS,并在 github 上公开了其所有的源代码,很高兴看到又一个云计算厂商加入到开源的队伍。和其他依赖 Linux 的云计算系统不同,Joyent 提供的 SmartOS 基于 illumos(SUN 被 Oracle 收购后,OpenSolaris 分裂出来的版本)。SmartOS 很好的综合了 Solaris 上面几个最优秀的技术 Zones, ZFS 和 DTrace,并硬是把 Linux 上的 KVM 虚拟技术集成到了 SmartOS(为什么不集成 Xen 呢?OpenSolaris 已经有了 Xen,集成 Xen 会更容易一些),想不到集成在 Linux 内核里面的 KVM 还能被生剥下来放到 illumos 内核里,工作量可是相当大,据说两三个人只花了一年的时间,现在的牛人真是牛的无法无天:)

SmartOS 最大的特色可能就是 KVM on illumos/Solaris. SmartOS 同时包含了全虚拟化技术 KVM 和操作系统级别的虚拟化技术 Zone,加上对 ZFS 文件系统的支持和 DTrace 动态跟踪工具的配合,可以说是一个相当完美的系统。SmartOS 有啥用呢?谁可能会有兴趣呢?

Developers, Cloud Providers, Carriers, ISV Appliance Makers, Mobile Device Manufacturers, Service Providers, Enterprises, Next generation HPC.

晚上 VPSee 没事玩了一下 SmartOS,启动 SmartOS 后就可以直接用 kvm 创建虚拟机了:

# qemu-img create -f qcow2 ubuntu.img 10G 
# qemu-system-x86_64 -hda ubuntu.img -cdrom \
/home/vpsee/ubuntu-10.04.3-server-amd64.iso -boot d -m 512

SmartOS 的启动界面:

smartos

为 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 镜像