在 XenServer 上用 ISO 安装虚拟机

Citrix XenServer 是企业级面向云计算的虚拟平台,有 XenServer, Essentials for XenServer, Enterprise Edition 和 Platinum Edition 三种版本,其中 XenServer 是免费的,和 VMware ESXi 是同级别的竞争产品。XenServer 的安装过程和 VMware ESXi 一样容易,安装完后界面如下。和 VMware ESXi 类似,主要的操作和配置都可以在一个另外一台装有 XenCenter 客户端的机器上完成(和 VMware vShpere Client 一样)。

xenserver

和 VMware ESXi 有点不同的是,XenServer 不能在 XenCenter 客户端管理界面里直接导入 iso 后安装操作系统,需要先把这些 iso 预存到另一台机器上,然后用 NFS 的方式访问。所以我们先在其他的机器开设一个 iso 目录并收集一些 iso 文件,用 NFS 导出这个 iso 目录,然后在 XenServer 服务器上手动把这个目录挂上,这样才能在 XenServer 和 XenCenter 管理界面里看到所有的 iso 文件,也就是说 XenServer 鼓励你把 iso 文件分开存储到另外一台单独服务器以方便管理,对下面的 NFS 操作不清楚的话可以参考 在 CentOS 上安装和配置 NFS 4.0

# vi /etc/export
/home/vpsee/iso 172.16.240.164(rw,sync,no_root_squash) \
172.16.240.164(rw,sync,no_root_squash)

# /etc/init.d/portmap restart
# /etc/init.d/nfs restart

在 NFS 服务器上设置权限,允许 XenServer 服务器访问 NFS:

# vi /etc/hosts.deny
portmap:ALL

# vi /etc/hosts.allow
portmap:172.16.240.0/255.255.254.0

用 ssh 登录 XenServer 后挂在 NFS 服务器上的目录:

$ ssh [email protected]
[email protected]'s password:

# xe-mount-iso-sr 172.16.240.10:/home/vpsee/iso

成功挂载后,在 XenCenter 控制台上(目前 XenCenter 只有 Windows 版本)就可以看到所有的 iso 了:

xencenter

剩下就好办了,有了 iso 就可以直接安装操作系统了,注意如果机器 CPU 不支持全虚拟(Intel VT 或 AMD SVM)的话会导致安装失败、报错:

xenserver-imtxsji: HVM is required for this operation

INVALID_SOURCE - Unable to access a required file in the specified repository:
file:///timp/cdrom-repo-RZ1Yem/install.386/xen/vmlinuz.

如果是这样的话就只能通过网络(Install from URL)安装半虚拟系统了。

在 CentOS 上安装和配置 KVM

RedHat 的下一代旗舰产品 RedHat Enterprise Linux 6 将只包含 KVM,这一点 RedHat 官方已经在很久以前、在不同场合都确认过,也可以从 RHEL 6 的 Beta 版本中得到证实。KVM 发展很快,稳定性有了很大提高,随着 RHEL 6 的正式到来,KVM 应用到生产环境的日子应该不远了。VPSee 曾经测试过 KVM,也看过一些 KVM 的学术论文,在网络性能、扩展、稳定性方面 KVM 不如 Xen,这些因素是做 VPS 的关键,所以现在很少看到 KVM VPS,不知道 RHEL 6 以后会不会多起来,目前 KVM 应用比较少的还有一个原因就是对硬件要求高(CPU 需要 Intel VT 或 AMD SVM 的支持),硬件发展速度很快,以后应该不会有这个问题。由于 KVM 支持全虚拟,所以可以在上面安装各类操作系统,和 Xen HVM 一样。在 VPSee 看来,KVM 更适合做桌面一些,Xen 更适合做数据中心解决方案。以下操作在 SUN Fire X2100 服务器和 CentOS 5.5 上完成。对 OpenVZ 和 Xen 感兴趣的童鞋可以看:在 CentOS 上安装和配置 OpenVZ在 CentOS 上安装和配置 Xen.

检查 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 sep mtrr pge mca 
cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt 
rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm 
extapic cr8_legacy
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca 
cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt 
rdtscp lm 3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm 
extapic cr8_legacy

安装 KVM

安装 KVM 所需要的软件包:

# yum install kvm kmod-kvm qemu kvm-qemu-img virt-viewer virt-manager \
libvirt libvirt-python python-virtinst

或者

# yum groupinstall KVM

安装完后重启系统,然后确认一下是否安装成功:

# reboot

# lsmod | grep kvm
kvm_amd                69416  0 
kvm                   226208  1 kvm_amd

# ls -l /dev/kvm 
crw-rw---- 1 root kvm 10, 232 Jun 25 15:56 /dev/kvm

安装虚拟机

用 virt-install 安装,这里以安装 FreeBSD 8.0 为例,os-variant 可以选择 freebsd7:

# virt-install \
--name freebsd \
--ram 512 \
--vcpus=1 \
--disk path=/home/vpsee/freebsd.img,size=4 \
--network network:default \
--os-variant=freebsd7 \
--accelerate \
--cdrom /home/vpsee/8.0-RELEASE-i386-disc1.iso \
--vnc

如果需要获得 virt-install 命令的更多选项和参数,可以查看在线帮助:

# man virt-install

用 virt-viewer 打开控制台连上 FreeBSD 的安装界面:

# virt-viewer freebsd

也可以直接用 virt-manager 图形化安装,安装过程很简单,KVM 中没有 Xen dom0, domU 的概念,更容易理解和使用,任何用过 VMware 和 VirtualBox 的人都会很容易上手,启动 virt-manager 图形界面创建一个虚拟机,创建硬盘、配置内存网络、指定安装光盘 iso 等,一步一步傻瓜操作:

# virt-manager

Tips

安装完 KVM 和上面的 FreeBSD 以后,以后就可以通过 virsh 命令行工具来启动、关闭、重启、进入控制台的工具来操作虚拟机了,就和在 Xen 里使用 xm 一样:

# virsh --connect qemu:///system
start freebsd
console freebsd
quit

如果你在客户端使用 Mac 或者 Linux 的话,而且没有 vnc viewer 之类的工具的话,可以直接用 ssh 和 X 连接到正在安装 FreeBSD 的那个控制台上:

# ssh -X -C [email protected]
# virt-viewer freebsd

freebsd kvm console

Xen domain0 和 domainU 的时间同步

在 Xen 的默认设置下,domainU 的时间总是要自动和 domain0 保持同步,所以想简单的在 domainU 内部用各种时间、日期等命令改变 domainU 的系统时间并不起作用。如何给 domainU 设置单独的时钟而不受 domain0 的影响呢?我们经常接到我们的 Xen VPS 客户的询问是否能把他们的 VPS 时钟改成北京时间,为什么他们改变了时钟和时区却不起作用等问题。如果每个 VPS 用户(domainU)来自不同国家或时区而想在自己的 VPS 里使用自己的区域时间该怎么办?很简单,只需要在自己的 VPS(domainU)里改变一个参数就可以了,Linux/Xen 很灵活,传递参数方式有很多种,可以用下面任意的一种方式来改变这个设置。

直接改变 xen 内核的运行时参数:

# echo 1 > /proc/sys/xen/independent_wallclock

不过上面的方法会在重启 domainU 的时候丢失,可以把上面的命令加到某个自动启动文件中。

或者也可以把改变 xen 内核设置的参数加到 sysctl.conf 文件中,VPSee 更偏向采用这种方法:

# vi /etc/sysctl.conf
xen.independent_wallclock=1

# sysctl -p

另外一种方法在 VPS 外面进行,需要 VPS 服务商的干预,在 domainU 的启动配置文件种加上以下参数:

# vi /etc/xen/vps01
...
extra='independent_wallclock=1'
...

Xen 部署 iSCSI 存储

运行在 Xen 的虚拟机(domainU)有多种存储方式可以选择,可以是普通的文件(file)、逻辑卷(LVM)、物理硬盘分区(partition)等,也可以是网络存储 NFS、NAS、GNBD、SAN、AoE、iSCSI 等。在企业、高校等机构里,我们一般有充足的硬件资源来部署基于 Xen 的虚拟化环境,比如我们最近拿到的一台 SUN Fire V880,可以容下12个硬盘,就非常适合来做网络存储,为了虚拟环境达到高可靠、高性能的要求,采用一些更高级、更昂贵的网络存储方式会让后续的管理、容错、备份、迁移、灾难恢复等工作更容易一些。

NFS 是文件级别的存储(Network File Storage),提供文件、目录级别的共享和访问,而 iSCSI 之类的网络存储则是块级别的存储(Block Storage)。他们的工作方式不一样,缓存机制也不一样,NFS 自己有文件缓存系统,而 iSCSI 的缓存依赖相应的文件系统的缓存。经测试表明,在大数据繁重(Data-intensive)的应用中 NFS 的性能稍好一些,在小数据(Meta-data)频繁、面向操作的应用中 iSCSI,因为虚拟化环境大部分传输的是命令之类的 meta-data,所以 iSCSI 非常适合部署在虚拟化环境。

为了描述方便,VPSee 用 A 机器代表运行 domain0 的 Xen 服务器,用 B 机器代表存储多个 domainU 的 iSCSI 服务器。他们的关系是这样的,A(iSCSI 客户端)通过 iSCSI 协议来启动和运行 B(iSCSI 服务端)上的 Xen 虚拟机镜像(可以是文件、LVM、物理分区等)。下面的操作在 CentOS 5.5 上执行:

安装必要软件包

# yum install kernel-devel openssl-devel gcc rpm-build

安装和配置 iSCSI target 服务器

到 http://sourceforge.net/projects/iscsitarget/ 下载最新的 iscsitarget 源代码、解压、编译并安装:

# mv iscsitarget-1.4.20.1.tar.gz /usr/src
# cd /usr/src
# tar xvf iscsitarget-1.4.20.1.tar.gz
# cd iscsitarget-1.4.20.1
# make
# make install

关闭防火墙或者打开 iSCSI 需要的 3260 端口,否则客户端会连接不上:

# system-config-securitylevel-tui

配置 iSCSI target 服务器,设置客户端可以访问的用户名和密码,本来为了达到好的稳定性和性能这里是应该分一个 LVM 逻辑分区出来当作 Xen 虚拟机的块设备,然后在上面安装 domainU 的,这里为了简便 VPSee 直接拿一个已经装好的虚拟机镜像文件 vpsee.img 来充当 LVM 分区:

# vi /etc/iet/ietd.conf
...
Target iqn.2010-06.xen-sanhead:xen-vpsee
        IncomingUser vpsee 123456
        OutgoingUser vpsee 123456
        Lun 0 Path=/iSCSI/vpsee.img,Type=fileio,IOMode=wb
        Alias iSCSI for diskname
        ImmediateData Yes
        MaxConnections 1
        InitialR2T Yes

iSCSI target 服务器端设置完后重启服务:

# /etc/init.d/iscsi-target restart

安装和配置 iSCSI 客户端

安装 iSCSI 客户端:

# yum install iscsi-initiator-utils

配置 iSCSI 客户端:

# vi /etc/iscsi/iscsid.conf

...
node.session.auth.username = vpsee
node.session.auth.password = 123456
discovery.sendtargets.auth.username = vpsee
discovery.sendtargets.auth.password = 123456

启动服务:

# /etc/init.d/iscsi start

发现并登陆:

# iscsiadm -m discovery -t sendtargets -p 172.16.39.101
172.16.39.101:3260,1 iqn.2010-06.xen-sanhead:xen-vpsee

# iscsiadm -m node -T iqn.2010-06.xen-sanhead:xen-vpsee --login
# /etc/init.d/iscsi restart

执行 fdisk 就会看到本机(A 机器)多出了一个块设备,那正是 B 机器上的 vpsee.img:

# fdisk -l
...
Disk /dev/sdc: 10.4 GB, 10486808576 bytes
64 heads, 32 sectors/track, 10001 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

Disk /dev/sdc doesn't contain a valid partition table

最后在 A 机器上把 Xen 配置文件的 disk 一行改成:

disk = [ "phy:/dev/sdc,sda1,w" ]

启动 Xen 虚拟机后,就实际上从 A 机器的块设备 /dev/sdc 通过 iSCSI 协议启动并连到了 B 机器上的 vpsee.img 文件,虽然 domainU 运行在 A 机器上,但是所有数据和程序都在 B 机器的 vpsee.img 中。这样实现了操作和数据的分离,将更有利于以后迁移、管理和备份 Xen 虚拟机。

Xen 支持的虚拟机类型

我们都知道 Xen 支持两种虚拟机类型:半虚拟化(paravirtualization)和全虚拟化(full virtualization),我们也知道 Xen 支持32位的和64位的虚拟机。决定 Xen 服务器是否能支持半虚拟化、全虚拟化、32位和64位的关键因素是处理器,即 CPU 的类型。

当 Xen 虚拟机运行在不支持虚拟化的硬件上的时候(CPU 不支持虚拟化),所有的内核和虚拟机(domains)都必须使用相同类型内存模型和指令大小。比如,如果使用的是 64位的 hypervisor 和 domain0,那么上面所有的 domainU 都必须是64位的或32位 PAE 的;同样,如果使用的是32位(带 PAE 内存扩展)的 xen 内核的话,那么所有在上面运行的 domainU 也都必须是32位(带 PAE 内存扩展)的。

当 Xen 虚拟机运行在支持虚拟化的硬件上、有了硬件的支持的时候(CPU 支持虚拟化),上面的限制就变得宽松多了,可支持的虚拟机类型范围要大多了。1个32位带 PAE 支持的 Xen 内核可以在上面运行1个不带 PAE 支持、全虚拟出来的 domainU;1个64位的 Xen 系统可以运行任何32位的 Linux domainU(包括半虚拟的 domainU 和全虚拟的 domainU);但是1个32位的 Xen 系统可以运行32位半虚拟的 domainU 而不能运行64位半虚拟的 domainU 了。所以 Xen 是向前兼容的,64位的 Xen 内核可以兼容运行32位PAE、纯32位的 domainU,但是不能反过来,32位的 Xen 内核不能运行64位的 domainU 等。

如果觉得上面的文字说明看得有点头昏,VPSee 整理了一个表格:

Hypervisor domain0 domainU (PV) domainU (HVM)
32bit 32bit 32bit 32bit
32bit PAE 32bit PAE 32bit PAE 32bit or 32bit PAE
64bit 64bit 64bit or 32bit PAE 32bit, 32bit PAE or 64bit

Intel VT(Virtualization Technology)和 AMD SVM(Secure Virtual Machine)是两大处理器生产商为了迎合虚拟化发展的趋势而在自己的处理器里直接增加对虚拟化技术的硬件支持。辨别自己的 CPU 是否支持虚拟技术很简单,只需要检查 cpuinfo 里面是否带有虚拟化标志,如果使用的是 Intel CPU,那么 flags 里应该有 vms 字样;如果使用 AMD CPU,那么 flags 里应该可以找到 svm,下面是 VPSee 在一台 SUN Fire X2100 服务器上打印的结果:

# cat /proc/cpuinfo | grep flags
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm
3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov 
pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt rdtscp lm 
3dnowext 3dnow pni cx16 lahf_lm cmp_legacy svm extapic cr8_legacy

注意:如果已经启动到 Xen 系统中, cat /proc/cpuinfo | grep flags 将在默认情况下不会显示 vmx 或 svm 标志位,只有在安装 Xen 前的纯 Linux 内核下才可以看到。还有就是,确定 BIOS 中打开了 Intel VT 或 AMD SVM 虚拟化的支持。

通常安装完 Xen 后,Xen 就能自动识别出系统支持哪几种虚拟机类型。只需要简单打印出 Xen 虚拟机的兼容名单就可以看出来:

# cat /sys/hypervisor/properties/capabilities
xen-3.0-x86_64 xen-3.0-x86_32p hvm-3.0-x86_32 hvm-3.0-x86_32p hvm-3.0-x86_64

上面打印出来的内容表示这个系统可以运行 64位 domains(xen-3.0-x86_64)、32位带 PAE 的 domains(xen-3.0-x86_32p)、32位全虚拟化 domains(hvm-3.0-x86_32)、32位带 PAE 全虚拟化 domains(hvm-3.0-x86_32p)、64位全虚拟化 domains(hvm-3.0-x86_64).

在普通 Linux 下面的 /proc 里包含了一些运行时的 Linux 内核参数可以查看和修改,和 /proc 的作用类似,在 Xen 里面 /sys 里包含了 xen hypervisor 的一些参数。如果在你的 Xen 系统上没有发现 /sys/hypervisor,多半时因为在配置 Xen 内核的时候没有选择上 XEN_SYSFS,重新配置、编译和安装 带 Xen 的 Linux 内核就可以了。

在自己的 IT 环境里部署 Xen 虚拟化前需要了解一下自身 IT 环境的一些特点,比如:用户的使用类型(将在虚拟机上干什么?),需要运行的应用(是否某应用程序必须运行在老的32位的系统上?)等,这样方便选购服务器、迁移平台和应用以及部署虚拟化。

在 Xen VPS 上安装 Kloxo 可能遇到的问题

昨天有位客户在 VPS 上安装 Kloxo 后重启导致错误而不能登录,VPSee 用控制台登录后发现客户的 VPS 启动后就 kernel panic 了,这是由客户安装 Kloxo 后错误设置 selinux 造成的,这个问题好办,关闭 selinux 就可以了。然后紧接着第二个问题来了,系统启动到快结束的时候报错:

init: no more processes left in this runlevel

Google 了一下发现其他人在 VPS 上安装 Kloxo 时也遇到同样的问题,Getting: init: no more processes left in this runlevel after installing Kloxo,但是没人给出解决方案。VPSee 不懂 Kloxo,不知道在安装 Kloxo 时,Kloxo 的安装脚本修改了哪些配置,不过看了错误提示后第一反应就是检查 /etc/inittab 文件,打开 /etc/inittab 后发现缺少一行,Xen domU 的默认控制台设备是 xvc0,如果缺少这一行在服务器终端输入 xm console 输入后就会报以上错误,因为没有指定 xvc0 的话 xm console 将无法 attache 到 domU 的控制台。知道了原因,解决办法就容易了,直接在 /etc/inittab 文件末尾加上下面这行就可以了:

# vi /etc/inittab
...
xvc0:2345:respawn:/sbin/mingetty xvc0

我们不推荐 VPS 用户安装 cPanel/DirectAdmin/ISPConfig/Webmin/Kloxo 这类控制面板,原因是:

  • 玩 VPS 的目的就是能自己控制和管理服务器、自由定制、压榨 VPS 以取得最大性能,如果在自己 VPS 上安装了各种笨重的控制面板,就和 shared hosing(共享主机)没有区别了,那就没有必要花更多的钱购买 VPS 了;
  • 对于 256MB VPS 来说,最小系统启动后就占据了 80MB 左右的内存,通常安装控制面板都会附带安装一堆没用的东西或者自己不需要的东西,比如有的甚至还带上 Clam AntiVirus 杀毒软件,这样安装完控制面板和启动 mysql/apache/php 后又消耗了120 MB 左右的内存,剩下几十 MB 怎么用呢?花钱买了 256MB,到最后自己只用了 40MB,不划算啊;
  • 控制面板的安装脚本通常会修改一些系统配置文件以便达到 “一键安装” 的目的,但是事实上不是那么简单,使用控制面板安装 mysql 安装到哪里了呢?配置文件在哪里呢?更糟糕的是不同的控制面板配置文件也都是不同的。安装控制面板很容易,安装完后想删除就不容易了,因为不知道控制面板在安装过程中到底装了哪些软件、增加和修改了哪些配置;
  • 安装控制面板会引入新的 bug 和安全隐患,控制面板是软件,其开发人员也是普通人,做软件开发就一定会有 bug,所以引入控制面板就实际上给自己的系统引入 bug 和麻烦,这样其实是增加了复杂度,而不是变得容易了;
  • 过度依赖控制面板不利于 Linux 的学习和使用,如果自己维护的 VPS 出现问题不利于排错,因为控制面板装了一堆东西把事情搞复杂了,出错机会也增大了,排错更困难了。

在 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 工具。

在 CentOS 下源码安装 Xen

在 CentOS 源码编译安装 Xen 的过程和在 Debian 上编译安装 Xen 的过程差不多,只是第一步安装编译所需要的工具和软件包有所不同,后续步骤有点小差别,不过方法都是一样的,这也说明各个 Linux 发行版之间的区别真的不大,没有必要为选择 Linux 发行版而发愁。编译一个 Xen 内核和编译一个普通 Linux 内核没有什么不同,如果发现编译后的内核启动不了,出现 kernel panic 的情况,多半是内核与机器的硬件没有配置好的原因,和 Xen 没有关系,比如常见的 switchroot: mount failed: No such file or directory 就可能是因为内核配置的时候忘了加上 root 的硬盘驱动,也可能找到驱动了但是挂载的时候发现文件系统类型不对,等等。VPSee 在一台 Intel(R) Core(TM) i3 CPU 540 @ 3.07GHz, 4GB 机器上使用最新的 Xen 4.0.0 源代码和 CentOS 5.4 完成以下操作。这里还有在 Ubuntu 上源码安装 Xen 的详细过程。如果觉得源码安装很麻烦的话,这里有 在 CentOS 上安装和配置 Xen 的二进制安装过程。

安装需要的软件包

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

# yum groupinstall "Development Tools" 
# yum install hmaccalc ncurses-devel zlib-devel openssl-devel python-devel \
bridge-utils  libtool-ltdl iasl xorg-x11-drv-evdev xorg-x11-drv-fbdev \
xorg-x11-drv-i810-devel xorg-x11-drv-via-devel xorg-x11-proto-devel \
xorg-x11-server-sdk xorg-x11-xtrans-devel

安装完以上软件包后,剩下的操作就和在 Debian 上编译和安装 Xen 差不多了。

安装 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
# make install-xen install-tools install-stubdom

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

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

加入到启动脚本:

# /sbin/chkconfig --add xend
# /sbin/chkconfig --add xendomains
# /sbin/chkconfig xend on
# /sbin/chkconfig xendomains on

安装 Xen 内核

下载 Linux 内核后给内核打 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

配置带 xen 的 Linux 内核:

$ 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
$ make modules
# make modules_install
# make install
# /sbin/depmod 2.6.31.8

更新 grub:

#  vi /boot/grub/menu.lst
...
title CentOS (2.6.31.8-xen)
        root (hd0,0)
        kernel /xen-4.0.0.gz
        module /vmlinuz-2.6.31.8 ro root=/dev/VolGroup00/LogVol00
        module /initrd-2.6.31.8.img
...

重启系统,确认 Xen 安装成功:

# reboot

# uname -a
Linux localhost.localdomain 2.6.31.8 #2 SMP Tue Apr 20 11:19:19 SAST 2010 x86_64 GNU/Linux

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  3713     4     r-----     36.0

在 Debian 上源码安装 Xen

博客上有位网友遇到源代码安装的问题,留了不少评论。源代码安装不难就是麻烦,如果不是特别需要还是选择二进制安装比较方便,直接用 yum install,apt-get install 或者 emerge 轻松搞定。源代码安装有两个好处,一个是可以定制 Linux 内核,这样可以删除网卡、无线、USB、蓝牙、多余的文件系统等 n 多服务器不需要的硬件驱动和模块,得到一个最小而且针对硬件编译过的内核,性能会好很多;第二个就是二进制发布往往滞后,所以如果想尝鲜新功能的话就只能源码安装。安装服务器前对每台服务器的硬件都做记录是个好习惯,特别是服务器多的时候,方便以后需要的时候查阅,VPSee 在内部使用 Wiki 记录服务器硬件信息,用源代码控制工具来追踪系统配置文件的更改。以下的操作记录使用最新的 Xen 4.0.0 源代码版本和 Debian 5.04,这里有在 CentOS 下源码安装 Xen 和 在 Ubuntu 上源码安装 Xen 的过程。

安装需要的软件包

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

# apt-get install bcc bin86 gawk bridge-utils iproute libcurl3 \
libcurl4-openssl-dev bzip2 module-init-tools transfig tgif texinfo \
pciutils-dev mercurial build-essential make gcc libc6-dev \
zlib1g-dev python python-dev python-twisted libncurses5-dev \
patch libvncserver-dev libsdl-dev libjpeg62-dev uuid-dev iasl

# apt-get build-dep linux

如果是64位系统的话,还需要安装:

# apt-get install gcc-multilib

安装 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
# make install-xen install-tools install-stubdom

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

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

加入到自动启动脚本中:

# update-rc.d xend defaults 20 21
# 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
# make install
# make modules_install
# update-initramfs -c -k 2.6.31.8
# depmod 2.6.31.8

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

# vi /etc/modules
...
netbk
blkbk

更新 grub:

#  update-grub
#  vi /boot/grub/menu.lst

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

# reboot

# uname -a
Linux debian 2.6.31.8 #1 SMP Sat Apr 17 09:26:20 SAST 2010 x86_64 GNU/Linux

# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   3713     4     r-----     48.7

用 duplicity 加密备份 Xen 虚拟机

在我们的 VPS 计划中有备份的附加服务,我们的数据中心能提供多种专业存储备份服务,为了降低成本我们选择的是最简单的 FTP 服务器,大家都知道 FTP 不安全,密码都可以 sniffer 到,把文件直接放在上面毫无秘密可言,太危险,为了保护我们客户的数据和隐私我们决定使用加密工具把虚拟机加密后再备份到 FTP 上,这样就算别人进入到我们的 FTP 服务器也什么都 “看” 不见,也无法删除、修改文件,数据都是 GPG 加密的,还有这个 FTP 服务器只有我们数据中心的人才能访问,与外界隔绝。所以这样既满足了我们备份需求又帮我们大大的降低了成本,如果使用数据中心的专业存储的话成本会高得惊人,那我们就无法提供10美元以下的 VPS 了。

Duplicity 是一个是我们正在用的加密备份工具,采用 rsync 算法和类库实现增量备份,并用 gpg 对数据包加密和签名,支持本地、远程、ftp, ssh/scp, rsync, Amazon S3 等多种存储方式和介质。

首先安装 duplicity:

# yum install duplicity

生成一个 gpg key:

$ gpg --gen-key

$ gpg --list-keys

我们把所有的 Xen 虚拟机镜像都放在一个目录里,然后备份本机的 /home/vpsee/xen 目录到远程机器 172.16.39.2 的 /backup/xen 目录,这样的备份是经过加密的,在远程机器的 /backup/xen 下看不到任何东西:

$ duplicity --encrypt-key="D2CDC262" /home/vpsee/xen/ \ 
ftp://user:[email protected]/backup/xen/

从远程机器 172.16.39.2 的 /backup/xen 目录恢复到本地的 /home/vpsee/restore/ 目录:

$ mkdir /home/vpsee/restore
$ duplicity --encrypt-key="D2CDC262" \
ftp://user:[email protected]/backup/xen/ /home/vpsee/restore/

同样的道理,我们也可以用 scp 来替代 ftp 完成备份的传输,备份操作:

# duplicity --encrypt-key="D2CDC262" /home/vpsee/xen/  \
scp://user:[email protected]/backup/xen/

恢复操作:

# mkdir /home/vpsee/restore
# duplicity --encrypt-key="D2CDC262" \
scp://user:[email protected]/backup/xen  /home/vpsee/restore/
GnuPG passphrase:

删除远程机器上的备份:

# duplicity cleanup ftp://user:[email protected]/backup/xen
GnuPG passphrase: