如何把 File-based 的 Xen 虚拟机转化成 LVM-based 的

今天 SUN(还是习惯叫 SUN)做了一个 workshop,他们做了一个 ppt,宣传了一下他们的产品,提到了 SUN VDI, VMware VDI 应用到 SunRay 上的一些东西。VPSee 关心的不是他们的 ppt,是上个月从他们那里 “骗” 来的设备到了没有。今天收获不错,收到 4台 SUN Fire V20z,1台 SUN Fire X2200 M2,10几个 SunRay 客户机。SUN Fire V20z 是很老的机型,现在已经停产,不过硬件配置还是蛮强劲的,2颗双核 AMD Opteron 2.2 GHz,8GB RAM,2个 73 GB Ultra320 SCSI 硬盘。现在还没有想好服务器做什么用,先玩玩再说~~

sun fire v20z

说正题⋯⋯

Xen 支持多种存储方式,大致可分三类:最普通最直接的文件存储(file storage),本地物理硬盘或者 LVM 存储(physical devices/LVM storage),更高级一点的 NFS、NAS、GNBD、SAN、AoE、iSCSI 网咯存储(network storage)等。这三类存储介质和方法都被我们用到了生产环境,各有各的优点,VPSee 偏向混合使用,有助于我们了解不同技术的特性。

先扫描一下系统,看看系统上的 LVM 是怎么分配的:

# vgscan 
  Reading all physical volumes.  This may take a while...
  Found volume group "vpseexen" using metadata type lvm2

# lvscan 
  ACTIVE            '/dev/vpseexen/root' [6.52 GB] inherit
  ACTIVE            '/dev/vpseexen/swap_1' [9.25 GB] inherit
  ACTIVE            '/dev/vpseexen/home' [116.88 GB] inherit

假设我们要转化的虚拟机镜像是 xen01.img(对应的交换分区文件是 xen01.swap)。首先我们需要在卷组上创建一个逻辑卷用来复制虚拟机镜像(xen01.img),逻辑卷大小和 xen01.img 一样,还需要一个逻辑卷用来复制 swap 文件(xen01.swap):

# lvcreate -L10G -n xen01_root vpseexen
# lvcreate -L512M -n xen01_swap vpseexen

创建成功后就会出现2个新的逻辑卷:

# lvscan 
  ACTIVE            '/dev/vpseexen/root' [6.52 GB] inherit
  ACTIVE            '/dev/vpseexen/swap_1' [9.25 GB] inherit
  ACTIVE            '/dev/vpseexen/home' [116.88 GB] inherit
  ACTIVE            '/dev/vpseexen/xen01_root' [10.00 GB] inherit
  ACTIVE            '/dev/vpseexen/xen01_swap' [512 MB] inherit

接着把虚拟机的镜像内容 dd 到逻辑卷上:

# dd if=/home/vpsee/xen/xen01.img of=/dev/vpseexen/xen01_root
# dd if=/home/vpsee/xen/xen01.swap of=/dev/vpseexen/xen01_swap

修改虚拟机的 Xen 配置文件,guest 和 host 使用相同的 Xen 内核启动:

# vi /etc/xen/xen01

kernel = "/boot/vmlinuz-2.6.26-2-xen-amd64"
ramdisk = "/boot/initrd.img-2.6.26-2-xen-amd64"
vcpus = 1
memory = 256
name = "xen01"
vif = [ '' ]
disk = [
'phy:/dev/vpseexen/xen01_root,sda1,w',
'phy:/dev/vpseexen/xen01_swap,sda2,w' ]
root = "/dev/sda1"
extra = "fastboot"

最后启动拷贝成功的基于 LVM 的虚拟机就可以了:

# xm create xen01

在 Xen 下运行 Openfiler

在我们的 IT 环境中用到了大量 NAS,有专业的 Sun StorageTek NAS 也有淘汰下来的 PC 做的 NAS,我们几乎虚拟化了所有的服务器,唯一没有虚拟化的部分可能就是存储系统,因为虚拟机的 IO(包括磁盘 IO 和网络 IO)性能目前还达不到裸机的水平。Openfiler 是一个的网络存储管理系统,其功能和 FreeNAS 类似,不同的是 Openfiler 基于 Linux 2.6,支持64位,而 FreeNAS 基于 FreeBSD 的(直到最近才支持64位),Openfiler 的功能和 FreeNAS 差不多,都能支持 NAS, SAN, CIFS, NFS, HTT/DAV, FTP, SIMBA, RSYNC, iSCSI 等,Openfiler 能更好的支持 RAID, LVM,不过 FreeNAS 能支持 ZFS(VPSee 对 ZFS 文件系统非常感兴趣,如果 Linux 上有类似的克隆就好了)。

VPSee 想对虚拟机运行存储系统和真实机器运行存储做个对比,看看性能上到底有多大的损失。Openfiler 官方网站上有 VMware ESX Virtual Appliance, XenServer XVA Virtual Appliance, Xen domU Filesystem 等多个预装好的虚拟镜像可以下载。我们选择 Xen 作为运行 Openfiler 的虚拟环境,本来以为 Openfiler 的镜像和 stacklet.com 上面的 Xen 镜像一样直接下载下来就可以用,结果不是这么简单,下载的只是一个文件系统,要自己做一些配置,和徒手安装 Xen domU 的过程差不多。

下载 Openfiler 的 Xen tar 包:

# mkdir -p /xen/openfiler
# cd /xen/openfiler
# wget http://www.rpath.org/rbuilder/downloadImage?fileId=26670

创建一个 LVM 区来存放 Openfiler:

# lvcreate -L 10G -n openfiler XenGroup

在新建的 LVM 上创建 Ext3 文件系统,并作为 Openfiler 虚拟机的 root 根系统:

# mkfs.ext3 /dev/XenGroup/openfiler
# e2label /dev/XenGroup/openfiler root

挂载 root 文件系统后,把下载下来的 openfiler-2.3-x86_64.tar.gz 解压到 /mnt 里面去:

# mount /dev/XenGroup/openfiler /mnt/
# cd /mnt/
# tar xzpvf /xen/openfiler/openfiler-2.3-x86_64.tar.gz

解开 openfiler-2.3-x86_64.tar.gz 后会在 /mnt 下产生一个完整的 Linux 系统,我们需要把这个 Linux 的内核拷贝出来以便加到 Xen 虚拟机配置文件中:

# mkdir -p /xenboot/
# cp /mnt/boot/config-2.6.21.7-3.20.smp.gcc3.4.x86_64.xen.domU /xenboot/
# cp /mnt/boot/initrd-2.6.21.7-3.20.smp.gcc3.4.x86_64.xen.domU.img /xenboot/
# cp /mnt/boot/System.map-2.6.21.7-3.20.smp.gcc3.4.x86_64.xen.domU /xenboot/
# cp /mnt/boot/vmlinuz-2.6.21.7-3.20.smp.gcc3.4.x86_64.xen.domU /xenboot/

解除挂载:

# cd 
# umount /mnt

创建启动 Openfiler 虚拟机需要的 Xen 配置文件:

# vi /etc/xen/openfiler

name = 'openfiler'
memory = '512'
kernel = '/xenboot/vmlinuz-2.6.21.7-3.20.smp.gcc3.4.x86_64.xen.domU'
ramdisk = '/xenboot/initrd-2.6.21.7-3.20.smp.gcc3.4.x86_64.xen.domU.img'
disk = [ 'phy:/dev/XenGroup/openfiler,xvda1,w' ]
root = "/dev/xvda1 ro"
vif = [ "mac=00:16:3e:38:76:22,bridge=xenbr0" ]
on_reboot = 'restart'
on_crash = 'restart'

启动 Openfiler 虚拟机:

# xm create openfiler

启动成功后就可以通过 https://172.16.39.1:446 来访问和管理 Openfiler 了,默认用户名和密码为 openfiler/password,登录后界面如下:

openfiler

在 Debian 上安装和配置 Xen

SUN 每隔一段时间都会有一些服务器捐给大学、实验室、研究机构等。我们项目组就刚 “骗” 了几台免费的 Sun Fire 服务器,当然也和我们是 SUN(也许现在应该叫 Oracle)的长期客户有关,我们的服务器基本都是 SUN 的。现在只要新机器一进来就先虚拟化,虚拟化后才能上机柜,技术变化太快了,记得几年前我们买机器一上来首先装的是操作系统,现在 hypervisor 代替了操作系统。

首先最小化安装64位的 Debian,下面的安装步骤和配置过程基于 Debian 5.04 版本,CentOS 版本可以参看:在 CentOS 上安装和配置 Xen,Ubuntu 版本可以参看:在 Ubuntu 上安装和配置 Xen,OpenSolaris 版本参看:在 OpenSolaris 上安装和配置 Xen,NetBSD 版本参看:在 NetBSD 上安装和配置 Xen.

安装 Xen

检查一下 source list:

# vi /etc/apt/sources.list

deb http://http.us.debian.org/debian stable main contrib non-free
#deb http://non-us.debian.org/debian-non-US stable/non-US main contrib non-free
deb http://security.debian.org stable/updates main contrib non-free

安装 Xen 及相关工具:

# apt-get install xen-hypervisor-3.2-1-amd64 \
xen-linux-system-2.6.26-2-xen-amd64 xen-utils-3.2-1 \
xenstore-utils xenwatch xen-shell xen-tools

我们需要很多 loop devices 来挂载基于文件的虚拟机,所以需要把 loop device 的数目限制设成最大

# vi /etc/modules

loop max_loop=64

安装完 Xen 后,Debian 上的 Xen 的默认网络配置用的是 network-dummy,和 CentOS 上有点不一样,我们需要修改成 bridge 以便每个虚拟机都像一个独立机器一样运行在网络上:

# vi /etc/xen/xend-config.sxp

#(network-script network-dummy)
(network-script network-bridge)

安装成功后,检查 Xen 内核是否已经装好,并给内核加上 dom0_mem=256M 限制 Xen Dom0 的内存,防止 dom0 把内存耗光:

# vi /boot/grub/menu.lst

...
title           Xen 3.2-1-amd64 / Debian GNU/Linux, kernel 2.6.26-2-xen-amd64
root            (hd0,0)
kernel          /xen-3.2-1-amd64.gz dom0_mem=256M
module          /vmlinuz-2.6.26-2-xen-amd64 root=/dev/mapper/vpsee-root ro console=tty0
module          /initrd.img-2.6.26-2-xen-amd64
...

重启系统后检查一下是否是 Xen 的内核以及 Xen 是否启动:

# reboot

# uname -r
2.6.26-2-xen-amd64

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   256     2     r-----      9.3

创建和安装 guest

如果把正在运行的 Xen 内核的操作系统看成 host 的话,那么运行在 host 上面的操作系统就可以看成 guest。先建一个目录用来存放所有的 guest 操作系统的 image,vm01.img,vm02.img 等,1个 guest 对应1个 image。

# mkdir /vm

# xen-create-image --hostname=vm01 --size=10Gb --swap=512Mb --ide \
--ip=172.16.39.121 --netmask=255.255.254.0 --gateway=172.16.38.1 --force \
--dir=/vm --memory=512Mb --arch=i386 \
--kernel=/boot/vmlinuz-2.6.26-2-xen-amd64 \
--debootstrap --dist=etch --mirror=http://ftp2.de.debian.org/debian/ --password

可以根据需要调整 /etc/xen-tools/xen-tools.conf

进入 guest

安装成功后需要增加给对应的虚拟机器增加一个 Xen 配置文件以便 Xen 能启动这个虚拟机:

# vi /etc/xen/vm01

kernel      = '/boot/vmlinuz-2.6.26-2-xen-amd64'
ramdisk     = '/boot/initrd.img-2.6.26-2-xen-amd64'
memory      = '512'
root        = '/dev/xvda2 ro'
disk        = [
                  'file:/vm/domains/vm01/swap.img,xvda1,w',
                  'file:/vm/domains/vm01/disk.img,xvda2,w',
              ]
name        = 'vm01'
vif         = [ 'ip=172.16.39.121,mac=00:16:3E:C0:21:DE' ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'

启动刚安装的 Debian 虚拟机后就可以登录了,

# xm create vm01
# xm console vm01

如果要退出 guest 的话,用 Ctrl + ],就会回到 host。

如果想每次启动 host 时自动启动 guest 的话:

# ln -s /etc/xen/vm01 /etc/xen/auto

更懒的办法

如果觉得安装 guest 操作系统太麻烦,可以到 http://stacklet.com/ 下载一个已经装好的镜像文件,调整 Xen guest 的配置文件,然后在 host 下启动 guest 镜像就可以了,这里这里有更详细的介绍。

增加 swap

如何给 guest 系统(domU)增加 swap,这里有介绍。

让 Xen dom0 得到足够 CPU 处理 IO

默认情况下 Xen 使用的是 Credit-Based CPU Scheduler,一种基于权重的 CPU 调度算法。简单的说就是给每个虚拟机的 CPU 一个权重,权重多的得到和使用物理 CPU 的时间就会多,如果虚拟机1的 CPU(VCPU 1.0)权重是256,虚拟机2(VCPU 2.0)的权重是512,那么虚拟机2的 VCPU 2.0 得到物理 CPU 的使用时间就是虚拟机1的2倍。

Xen 给每个虚拟机(包括 dom0 和 domU)分配的默认权重都是 256,也就是说 Xen 上运行的所有 guest 操作系统,dom0 和 众多 domU 都是均分和共享 CPU 的,他们能得到 CPU 的时间和机会都是一样的。这看上去对虚拟机用户(domU)来说很公平,但这种大锅饭的方法对 dom0 来说可不合适,dom0 承担着艰巨的任务,要处理来自其他 domU 的 IO 请求,如果都平均享用 CPU 的话就会造成 dom0 常常因得不到足够的 CPU 时间而不能及时处理自己或来自 domU 的 IO,所以在各虚拟机 IO 负载重的情况下我们需要修改 dom0 的权重,以便它能及时处理 IO. IO 这个问题很重要,一旦 IO 处理不及时,所有虚拟机的 IO 都会等待,将会影响所有虚拟机用户。这也是为什么我们不提供 64MB VPS 的一个原因,64MB VPS 用户会明显感到内存不足,系统会大量频繁 swapping,大量 disk IO 请求会影响服务器整体性能和所有其他用户。可以在这篇:64MB 的 VPS 能支持多少访问量?看到 128MB 的 swap 就用了 75MB.

查看当前 dom0 的 CPU 权重:

# xm sched-credit -d Domain-0
{'cap': 0, 'weight': 256}

修改 dom0 的 CPU 权重:

# xm sched-credit -d Domain-0 -w 512

# xm sched-credit -d Domain-0
{'cap': 0, 'weight': 512}

随机生成 Xen 虚拟机的 MAC 地址

如果不在创建 Xen 虚拟机(domU)的时候指定 MAC 地址的话,Xen 就会随机生成一个 MAC 地址给虚拟机,这样管理员就没办法知道虚拟机的 MAC 地址了,不利于以后带宽的统计和虚拟机的管理,所以最好就在 Xen 虚拟机配置文件中直接指明虚拟机的 MAC 地址,比如:

# vi /etc/xen/vpsuser1
vif = [ "mac=00:16:3e:0c:11:53,ip=172.16.16.200,bridge=xenbr0" ]

IEEE OUI 为 Xen domU 保留了一段 MAC 地址,前3段是 “00-16-3e”,后3段是随机的,其中第1个随机段的第1个 bit 是0(IEEE OUI 给 VMware 保留的前3段地址是 “00-0c-29”,后3段随机)。我们在为用户分配 MAC 地址时候不想有规律的分配(虽然也不会有什么安全问题),所以 VPSee 写了一个简单的 Python 脚本用来随机生成符合 Xen 虚拟机标准的 MAC 地址:

#!/usr/bin/python 
# generates a MAC address for Xen domU
# http://www.vpsee.com
#

import random

mac = [ 0x00, 0x16, 0x3e, random.randint(0x00, 0x7f), 
random.randint(0x00, 0xff), random.randint(0x00, 0xff) ]
s = []
for item in mac:
        s.append(str("%02x" % item))
print ':'.join(s)

给 Xen 虚拟机添加一个网络接口

我们在工作中用到了大量的虚拟机,至少一半的物理服务器都被虚拟化了。VPSee 正在考虑用一个虚拟机来替代一台物理机器来监测网络上的主机情况。前不久我们小组拉了一根自己的 ADSL,建了一个自己的网,这样加上工作网络就有2个不同的网,我们希望能在一个虚拟机上用 Cacti 等工具同时监测2个网络上的多台关键服务器、路由器和交换机的实时情况。这就需要在我们的虚拟机上连接到另一个网络,Xen 默认安装后在 dom0 和 domU 上只有一个虚拟网络接口,现在我们需要在 Xen 虚拟机(domU)上添加另一个虚拟网络接口,并和物理服务器上新添加的网卡和网络配置对应起来。

配置

打开 Xen 的配置文件,注释掉 (network-script network-bridge) 一行,然后加上下面一行:

# vi /etc/xen/xend-config.sxp

#(network-script network-bridge)
(network-script network-multi-bridge)

然后创建一个 network-multi-bridge 脚本,用来2次执行 network-bridge 脚本:

# vi /etc/xen/scripts/network-multi-bridge

#!/bin/sh
dir=$(dirname "$0")
"$dir/network-bridge" "$@" vifnum=0 bridge=xenbr0 netdev=eth0  
"$dir/network-bridge" "$@" vifnum=1 bridge=xenbr1 netdev=eth1

重启 Xen 服务使配置生效:

# /etc/init.d/xend restart

打开 Xen 虚拟机的配置文件,加入一个虚拟网卡:

# vi /etc/xen/vpsee

vif = [ "mac=00:16:3E:58:FF:AB,bridge=xenbr0",
        "mac=00:16:3E:58:FF:AD,bridge=xenbr1" ]

重启虚拟机后,查看网络适配器的配置就会发现多了一个 eth1:

# /sbin/ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:16:3E:58:FF:AB  
          inet addr:172.16.38.200  Bcast:172.16.39.255  Mask:255.255.254.0
          inet6 addr: fe80::216:3eff:fe58:ffab/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:801 errors:0 dropped:0 overruns:0 frame:0
          TX packets:209 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:93950 (91.7 KiB)  TX bytes:42427 (41.4 KiB)

eth1      Link encap:Ethernet  HWaddr 00:16:3E:58:FF:AD  
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

给 eth1 配置 IP 地址、掩码、网关等:

# vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
IPADDR=192.168.10.200
GATEWAY=
NETMASK=255.255.255.0

配置好虚拟机的网卡后启动网卡:

# /etc/sysconfig/network-scripts/ifup eth1

这样就给运行在一台物理机器上的 Xen 虚拟机增加了一个新网卡,并连接到了物理服务器所在的新网络,虚拟机上的2个网卡和物理服务器上的2个网卡一一对应。

配置路由表

如果想在服务器上同时访问2个网络和其子网络的话,需要修改默认网关和配置路由表:

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
IPADDR=172.16.39.200
GATEWAY=172.16.38.1
NETMASK=255.255.254.0

# vi /etc/sysconfig/network-scripts/ifcfg-eth2
IPADDR=192.168.10.200
GATEWAY=
NETMASK=255.255.255.0

# vi /etc/sysconfig/network-scripts/route-eth0
192.102.5.0/24 via 172.16.38.1 dev eth0

# vi /etc/sysconfig/network-scripts/route_eth1
192.168.0.0/23 via 192.168.10.2 dev eth1

在 VMware ESXi 上安装 Minix

VMware ESXi 是业界领先的 hypervisor,更重要的是它现在是免费的,只要在 VMware 上注册一个账号就可以拿到一个免费的 license,下载 iso 后刻盘启动,安装过程非常简单,安装完后界面如下,可以修改的东西不多,可修改管理员密码和网络配置。主要操作和配置需要在一个另外一台机器上(安装 VMware vShpere 客户端)完成。需要注意的是 VMware ESXi 对硬件设备要求很高,好像一般的桌面 PC 都安装不了,VMware ESXi 4.0 Hardware Compatibility List这里给出了能运行 VMware ESXi 的兼容硬件设备列表。

vmware esxi installation

在主控台配置完 ESXi 的网络后在另外一台机器上打开 http://your-ip-address/ 就会看到一个页面,下载和安装 VMware-viclient.exe 客户端工具后就可以用来管理 VMware ESXi. 启动 VMware vShpere Client 后就会发现是个60天试用版本,需要输入 license(虽然是免费的)。VPSee 找了半天才找到输入 license 的地方,不在菜单上,在右边页面的 Configuration tab 下的 Software->Licensed Features:

vmware esxi installation

VMware ESXi 安装成功后就是创建虚拟机、安装 Minix 了,原以为会很顺利,结果昨天因为网卡驱动问题折腾了一上午。安装 Minix 时候会碰到如下问题:

Probing for disks. This may take a short while... AT0-D0: controller not ready
AT0-D0: controller not ready
AT0-D0: reset failed, driver busy
AT0-D1: controller not ready
AT0-D1: controller not ready
AT0-D1: reset failed, driver busy
......
Found no drivers - can't partition.
Autopart tool failed. Trying again.

原因是 VMware ESXi 默认创建的虚拟硬盘设备是 SCSI 的,Minix 不支持 SCSI 只支持 IDE 的,解决办法是 Power Off Minix 虚拟机,在 Edit virtual machine settings 中 Add 一个 Hard Disk 设备并在 Virtual Device Node 中选择 IDE (0:0),然后再启动虚拟机后就可以顺利安装 Minix 了。要注意的是,安装 Minix 一定要安装 Minix 3.1.6 或以上版本,不然就会遇到烦人的网卡驱动问题,昨天花了很长时间才找到问题所在,压根就没有想到会是驱动有 bug,驱动完全不工作也好说,至少可以马上定位问题所在,最怕这种有时候工作有时候不工作的情况,anyway,安完 Minix 后需要配置一下 Minix 环境以便以后操作。

设置静态 IP 地址:

# vi /etc/rc.net
ifconfig -l /dev/ip0 -n 255.255.255.0 -h 172.16.20.201
add_route -g 172.16.20.1
daemonize nonamed -L

在系统启动的时候就启动 telnet 和 ftp 服务:

# vi /etc/rc.net
intr -d tcpd telnet in.telnetd &
intr -d tcpd ftp in.ftpd &

如果要安装很多 Minix 的话,可以在安装和配置好一个 Minix 后导出为一个虚拟机通用模版(VMware ESXi 主菜单上的 File->Export OVF Template… ),然后再利用这个模版(File->Deploy OVF Template… )部署多个 Minix 虚拟机器。下图是刚创建的20个 Minix 虚拟机:

vmware esxi installation

监测 Xen 服务器的几个常用命令

安装完 Xen 服务器后,随着 Xen 虚拟机用户的增加,有必要经常查看一下 Xen 服务器(host)的状态,以及各个虚拟机(guest)的运行情况、占用的系统资源等。现在已经有很多针对 Xen 的监测工具可以使用,不过 VPSee 不主张滥用第三方工具,会增加 dom0 的负担以及带来安全隐患,保持简单(KISS),尽量用简单的工具做事情(不明白为什么有人写个便条还要用 Word,Notepad 就可以轻松搞定啊,这又让我想到了 Vi vs IDE~~)。VPSee 的几台 Xen 服务器只用来提供虚拟单一服务,dom0 只是为了提供硬件抽象、一个 hypervisor 层给 domU,所以应该尽量保持 dom0 的精简,同时也为了安全,不提倡在 dom0 上安装和运行任何不必要的软件。要监测 Xen 服务器的话最好就是用好一些 Xen 自带的命令行工具。

Top 是 Unix/Linux 中监测性能的重要工具,Xen 中也有 top,用来监测 host 和各 domains 的实时状态:

# xm top
xentop - 20:48:24   Xen 3.1.2-164.11.1.el5
10 domains: 2 running, 8 blocked, 0 paused, 0 crashed, 0 dying, 0 shutdown
Mem: 8388156k total, 7617344k used, 770812k free    CPUs: 2 @ 2814MHz
      NAME  STATE   CPU(sec) CPU(%)     MEM(k) MEM(%)  MAXMEM(k) MAXMEM(%) VCPUS NETS NETTX(k) NETRX(k) VBDS   VBD_OO   VBD_RD   VBD_WR S
SID
  Domain-0 -----r	1478    2.6     524412    6.3   no limit       n/a     2    6   648948    66380    0        0        0        0
  0
vm01 --b---        194    0.2     532352    6.3     540672	   6.4     1    1        0        0    1        0	 0
 0    0
vm02 --b---        211    0.2     532352    6.3     540672	6.4     1    1        0        0    1        0        0        0
   0
vm03 -----r	1685  106.4    1048440   12.5    1048576      12.5     2    1    26384    26900    2        0     6751    21520
  0
vm04 --b---	5255   20.6    2105216   25.1    2113536      25.2     1    1        0        0    1        0        0        0
  0
...

显示所有 domains 的运行状态信息:

# xm list
Name                                      ID Mem(MiB) VCPUs State   Time(s)
Domain-0                                   0      512     2 r-----   1457.3
vm01                                       1      519     1 -b----    191.9
vm02                                       2      519     1 -b----    208.9
vm03                                       8     1023     2 -b----   1666.1
vm04                                       9     2055     1 -b----   5100.9
...

显示所有 domains 的上线时间:

# xm uptime
Name                              ID Uptime
Domain-0                           0 20:30:40
vm01                               1 20:28:54
vm02                               2 20:28:48
vm03                               8  7:44:07
vm04                               9 20:28:34
...

显示 host 的信息:

# xm info

显示所有 domains 使用虚拟处理器的情况:

# xm vcpu-list
Name                              ID VCPUs   CPU State   Time(s) CPU Affinity
Domain-0                           0     0     0   r--    1392.3 0
Domain-0                           0     1     1   -b-      80.5 1
vm01                               1     0     1   -b-     194.1 any cpu
vm02                               2     0     1   -b-     210.6 any cpu
vm03                               8     0     1   -b-     901.8 any cpu
vm03                               8     1     1   -b-     770.8 any cpu
vm04                               9     0     0   -b-    5211.0 any cpu

显示某个 domain 使用的虚拟网卡信息:

# xm network-list vm01
Idx BE     MAC Addr.     handle state evt-ch tx-/rx-ring-ref BE-path
0   0  00:16:3e:24:c4:0b    0     4      12    768  /769     /local/domain/0/backend/vif/10/0

显示 xend 的日志:

# xm log

显示 xend 的 demsg 信息:

# xm dmesg

显示 host(node)的信息,和 xm info 类似:

# virsh nodeinfo
CPU model:           x86_64
CPU(s):              2
CPU frequency:       2814 MHz
CPU socket(s):       1
Core(s) per socket:  2
Thread(s) per core:  1
NUMA cell(s):        1
Memory size:         8387584 kB

显示某个 domain 的相关信息:

# virsh dominfo vm01
Id:             1
Name:           vm01
UUID:           8636724a-0369-4d18-ab92-969ad3a21bf6
OS Type:        hvm
State:          idle
CPU(s):         1
CPU time:       2992.5s
Max memory:     540672 kB
Used memory:    532352 kB
Autostart:      enable

显示某个 domain 使用的虚拟处理器信息:

# virsh vcpuinfo vm01
VCPU:           0
CPU:            1
State:          idle
CPU time:       2989.9s
CPU Affinity:   yy

限制 Xen Dom0 的内存

今年来的新人比较多,每个人都需要至少两个 Xen 虚拟机做项目,一个 Linux 一个 Windows,去年升级到 16GB 内存的服务器都显得资源很紧张,今天 VPSee 给新来的人分配虚拟机的时候居然发现内存不够用。Xen 运行一段时间后,dom0 就会吃掉几乎所有可用内存(这是 Linux 的特点,把多余的内存用来做缓存),这时候如果要新建一个 Xen 虚拟机的话就造成内存分配不足的错误:

# xm create vm01
Using config file "./vm01".
Error: (12, 'Cannot allocate memory')

解决的办法很容易,就是在 Xen 内核启动的时候加上 dom0_mem=512M 参数限制,这样 dom0 最多只能使用 512MB 的内存。当然可以根据自己情况来决定给 dom0 分配多少内存,如果不确定的话,这篇 “应该给 Xen Dom0 和 DomU 配置多大内存?” 可能会有帮助。

# vi /etc/grub.conf
default=0
timeout=2
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.18-164.11.1.el5xen)
        root (hd0,0)
        kernel /xen.gz-2.6.18-164.11.1.el5 dom0_mem=512M
        module /vmlinuz-2.6.18-164.11.1.el5xen ro root=LABEL=/
        module /initrd-2.6.18-164.11.1.el5xen.img

在 OpenSolaris 上安装和配置 Xen

OpenSolaris 的一个杀手级应用就是 ZFS,很多人也是为了 ZFS 而 ”不得不“ 用 OpenSolaris/Solaris,虽然现在 FreeBSD 上也有 ZFS 的移植,但不是很稳定。ZFS 把存储管理(volume management)和文件系统(file system)两个功能结合在一起,提供了一种全新的存储管理方式,磁盘管理简单,想增加磁盘加到 pool 里就可以了;基于事务,保证数据完整、一致;自动修复,没有 fsck 的痛苦;自由伸缩,自由增减磁盘;快照,轻松而快速地创建快照;海量存储,几乎无限的存储容量等这些优点使得 ZFS 很适合做存储、文件服务器。这也是 VPSee 想用 OpenSolaris 做 dom0 的一个主要原因,ZFS 将会给 domUs 的备份、扩展带来极大方便,现在正在测试,将来会用 ZFS 来存储 10GB×2×400=8TB 的虚拟机镜像(400个人,每个人2种桌面系统 ubuntu 和 windows,每种系统占用 10GB)。下面的安装步骤和配置过程基于 OpenSolaris 2009.06 版本,Ubuntu,Debian 和 CentOS 版本可以分别看这里:在 Ubuntu 上安装和配置 Xen在 Debian 上安装和配置 Xen在 CentOS 上安装和配置 Xen,NetBSD 版本参看:在 NetBSD 上安装和配置 Xen.

安装 xVM

Sun 把 Xen 移植到 OpenSolaris 后改叫 xVM. 首先创建一个单独的启动环境,这一步不是必须的:

# beadm create -a -d xvm xvm

安装必要的软件包:

# beadm mount xvm /tmp/xvm-be 
# pkg -R /tmp/xvm-be install SUNWvirt-manager SUNWxvm SUNWvdisk SUNWvncviewer 
# beadm umount xvm

安装成功后,检查 Xen 内核是否已经加到 grub 启动文件里:

# vi /rpool/boot/grub/menu.lst

title xvm
findroot (pool_rpool,0,a)
bootfs rpool/ROOT/xvm
kernel$ /boot/$ISADIR/xen.gz
module$ /platform/i86xpv/kernel/$ISADIR/unix /platform/i86xpv/kernel/$ISADIR/unix -B $ZFS-BOOTFS,console=text
module$ /platform/i86pc/$ISADIR/boot_archive

# bootadm list-menu
the location for the active GRUB menu is: /rpool/boot/grub/menu.lst
default 1
timeout 2
0 OpenSolaris 2009.06
1 xvm

打开 xVM 服务:

# svcadm enable -r xvm/virtd ; svcadm enable -r xvm/domains

重启系统后看一下 Xen 的内核(i86xpv)以及 xend 是否启动:

# uname -a
SunOS vpsee 5.11 snv_111b i86pc i386 i86xpv

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1879     2     r-----     24.0

创建和安装 guest

用 zfs 工具创建一个 volume 保存 guest 操作系统的 image:

# zfs create -o compression=on -V 5G rpool/vm

# zfs list
NAME                     USED  AVAIL  REFER  MOUNTPOINT
...
rpool/vm               5G   222G    16K  -
...

# ls -l /dev/zvol/dsk/rpool/
total 3
...
lrwxrwxrwx 1 root root 35 Oct 28 09:56 vm->../../../../devices/pseudo/zfs@0:3c
...

从 ISO 文件(osol-0906-x86.iso)安装 OpenSoaris Guest 操作系统,注意这里 -p 选项是 paravirtualized 安装,paravirtualized 不能安装 windows:

# virt-install --nographics -p -r 1024 -n vm01 -f /dev/zvol/dsk/rpool/vm \
-l /export/home/vpsee/osol-0906-x86.iso

要安装 windows 需要使用 fully virtualized 选项并且要有 CPU 的支持(Intel VT or AMD V)。服务器上面通常没有图形界面,所以图形化安装 windows 需要打开 vnc 服务,并给 vnc 设置一个密码,然后从 vnc client 登录后就可以看到 windows 的安装界面了:

# svccfg -s xvm/xend setprop config/vnc-listen = astring: \"0.0.0.0\"
# svccfg -s xvm/xend setprop config/vncpasswd = astring: \"password\"

# virt-install -v --vnc -n vm02 -r 512 -f /dev/zvol/dsk/rpool/vm \
-c /export/home/vpsee/windowsxp.iso --os-type=windows

进入 guest

Guest 安装成功后就可以登进去了:

# xm console vm01

如果要退出 guest 的话,用 Ctrl + ] 就会回到 host。

Troubleshooting

ZFS 很容易就耗光 dom0 的可用内存,所以要对 ZFS ARC 的内存使用做限制,如下设定最大可用内存为 256MB:

# vi /etc/system
...
set zfs:zfs_arc_max = 0x10000000

限制 dom0 内存也对系统的安全有所帮助,在 gurb/menu.lst 加一行可以设定 Xen dom0 的最大可用内存为 1GB:

# vi /rpool/boot/grub/menu.lst
...
kernel$ /boot/$ISADIR/xen.gz dom0_mem=1024M
...