linux Xen 之 v3.0 用户手册
Xen is Copyright ? 2002-2005, University of Cambridge, UK, XenSource Inc., IBM Corp., Hewlett-Packard Co., Intel Corp., AMD Inc., and others. All rights reserved.
Xen 是一个开源项目。Xen的大多部分组件遵循GNU GPL通 用公共许可证的第二版发布。其它部份的组件在GNU 次要通用公共许可证,Zope 公 共许可证 2.0 ,或``BSD-style'' 许可下发布。详情请见COPYING文件。
Contents 目录
● 简介
o 1. 介绍
+ 1.1 使用场合
+ 1.2 操作系统支持
+ 1.3 硬件支持
+ 1.4 基于Xen系统的架构
+ 1.5 历史
+ 1.6 新特性
● 安装
o 2. 基本安装
+ 2.1 安装的先决条件
+ 2.2 通过二进制Tarball包安装
+ 2.3 通过RPMs安装
+ 2.4 通过源代码安装
+ 2.5 配置
+ 2.6 启动 Xen
o 3. 启动一个Xen系统
+ 3.1 从零域(Domain0)启动
+ 3.2 启动客户域(Guest Domains)
+ 3.3 自动启动和停止域(Domains)
● 配置和管理
o 4. 域管理工具
+ 4.1 Xend
+ 4.2 Xm
o 5. 域配置
+ 5.1 配置文件
+ 5.2 网络配置
o 6. 存储和文件系统管理
+ 6.1 输出物理设备作为虚拟块设备(VBD)
+ 6.2 使用文件支持的虚拟块设备(VBD)
+ 6.3 使用LVM支持的虚拟块设备(VBD)
+ 6.4 使用NFS根(NFS Root)
o 7. CPU管理
o 8. 域迁移
+ 8.1 域的保存和恢复
+ 8.2 迁移和活动迁移
o 9. Xen安全
+ 9.1 Xen安全注意事项
+ 9.2 安全方案
● 参考
o 10. 编译和启动选项
+ 10.1 高级配置选项
+ 10.2 编译选项
+ 10.3 启动选贤
+ 10.4 XenLinux启动选项
o 11. 更多支持
+ 11.1 其它文档
+ 11.2 在线参考
+ 11.3 邮件列表
o A. 术语表
简介
1. 介绍
Xen是一个开源的x86处理器架构的para-virtualizing虚拟机监控器(VMM)或者'系统管理程序(hypervisor)'。Xen可以安全地在一个物理系统上以接近于本地硬件的性能运行多个虚拟机。Xen具有方便应用的企业级功能, 包括:
● 虚拟机的性能接近于本地硬件.
● 在物理机器之间活动迁移正在运行的虚拟机.
● 在每个客户虚拟机支持到32个虚拟CPU, 虚拟CPU(VCPU)热插拔.
● x86/32, 物理地址扩展(PAE)的x86/32 , 和 x86/64 平台支持.
● 不用修改客户操作系统(包括微软的Windows)就能支持因特尔虚拟化技术(VT-x).
● 良好的硬件支持(支持几乎所有的Linux设备驱动).
1.1 使用场合
使用Xen的场合包括:
●服务器整合.
在一个物理机器上运行多个服务器,在虚拟机边界上提供错误隔离.
●无硬件依赖(硬件独立性).
允许过时的应用程序和操作系统使用新的硬件.
●多操作系统配置.
为开发或测试提供同时运行的多个操作系统.
●内核开发
在虚拟机的沙盒中,做内核的测试和调试,无需为了测试而单独架设一台独立的机器
●集群运算.
在虚拟机级别的管理比单独物理机器的管理更具灵活性,比单系统的典型方案提供了更好的控制和隔离性,特别是通过使用活动迁移来实现负载平衡.
●为开发新操作系统提供硬件支持.
借助于得到广泛硬件支持的已经存在的操作系统(例如Linux)来开发新的操作系统.
1.2 操作系统支持
Para-virtualization 允许高性能的虚拟化,即使像x86这样的从传统上来说很难虚拟的架构。
这种方法需要操作系统来安装运行Xen。在一个操作系统上安装运行Xen和支持一个新的硬件平台类似,然而过程被简化了,因为虚拟机架构和基础的本地硬件很类似。即使操作系统内核必须明确支持Xen,一个关键特性是用户空间的应用程序和库文件不需要修改。
使用Intel VT和AMD Pacifica技术提供的硬件CPU虚拟技术,运行一个不经修改的客户操作系统内核是可以实现的。即使Xen自己需要额外的驱动支持,但是不需要携带操作系统。不像传统的完全虚拟的管理程序,它正遭受性能瓶颈,Xen和VT或者Xen和Pacifica技术彼此互补,为para-virtualized客户操作系统提供了极好的性能,和不经修改的客户操作系统自然地运行在处理器上。 完全支持VT和Pacifica的芯片会在2006年之前出现。
多数操作系统的Xen虚拟支持日益可用: 当前, 成熟的Linux支持是可用的,包含在标准的发布版本中. 其它的操作系统的ports--包括 NetBSD, FreeBSD 和 Solaris x86 v10-- 正接近完成.
1.3 硬件支持
Xen当前运行在x86架构上,需要一个P6或更新的处理器(例如Pentium Pro, Celeron, Pentium II, Pentium III, Pentium IV, Xeon, AMD Athlon, AMD Duron).多处理器的机器是支持的,超线程(HyperThreading)也是支持的。另外IA64和Power架构的ports正在开发中。
默认的32位Xen支持最大4GB内存。可是Xen 3.0 为Intel处理器物理指令集(PAE)提供支持,这样就能使x86/32架构的机器支持到64GB的物理内存。Xen 3.0也能支持x86/64 平台支持,比如 Intel EM64T 和AMD Opteron,这能支持1TB的物理 内存以上。
Xen卸载了配给域零(Domain 0)管理的虚拟机上运行的客户操作系统的大部分硬件支持.Xen本身仅仅包含需要发现和启动次级处理器、设置中断路由、平台PCI总线枚举的代码。设备驱动运行在一个特权的客户操作系统中而不是在Xen本身.这种方法提供了大多数Linux支持的设备硬件的兼容性. 默认的XenLinux编译包含了大多数服务器类别的网络和磁盘硬件的支持,但是你也可以使用常规的方法配置你的XenLinux来添加其它的硬件支持.
1.4 基于Xen的系统结构
一个Xen系统有多个层,底层和大部分特权层是Xen本身。
Xen可以虚拟出多个客户操作系统,每一个都在一个安全的虚拟机中运行,用Xen术语来说,就是一个域(Domain)。Xen调度这些域以充分地利用可用的物理CPU。每一个客户操作系统管理它自己的应用程序。这个管理包括Xen安排给VM的时间里每一个应用程序的调度职责。
第一个域,域0(domain 0),当系统启动的时候自动创建,并有管理特权。域0创建其它的域、管理他们的虚拟设备。它也能执行管理任务,例如暂停、恢复和迁移其它的虚拟机。
在域0里,xend进程运行管理系统。Xend负责管理虚拟机和提供使用他们的控制台。通过一个命令行工具,命令通过一个HTTP接口被发给xend。
1.5 历史
Xen最初是剑桥大学计算机实验室的系统研究组开发的,作为XenoServers项目的一部分,UK-EPSRC提供自己支持。
XenoServers的目标是为全球分布式计算提供一个公用接口。Xen在这个项目中是一个关键部分,允许一个人有效地分割一个机器,让一些互不相关的客户在一个环境中运行他们自己的操作系统和程序。这个环境提供保护、资源隔离和记帐。项目的web页包含了更多的信息连同文章索引和技术支持: 。
Xen已经依照自己的权利成长为一个羽翼丰满的项目,能让我们去研究有趣的学术问题,关于虚拟资源的最好的技术例如CPU、内存和网络。
项目投稿者包括XenSource, Intel, IBM, HP, AMD, Novell, RedHat.
Xen在SOSP 2003年1月1日第一次在一个论文中叙述过,10月份第一个公共版本1.0发布。其后,Xen值得注目地发展成熟,现在在很多站点的生产环境中使用。
1.6 新特性
Xen 3.0.0提供:
★ 支持最大32路SMP客户操作系统
★ 因特尔PAE(Physical Addressing Extensions)支持,提供32位服务器存取大约4GB物理内存的能力
★ x86/64 支持 (Intel EM64T, AMD Opteron)
★ 因特尔 VT-x 支持,能够运行未经修改的客户操作系统(Windows XP/2003, Legacy Linux)
★ 增强的控制工具
★ 改进的ACPI支持
★ AGP/DRM 图像
Xen 3.0的特性极大地增强了硬件支持、配置灵活性、可用性和大量补充了支持的操作系统。这个最新版本,让Xen成为虚拟化的最终开源方案迈进了一步。
安装
2. 基本安装
Xen发行版包含了三个重要的部分:Xen本身,Xen上运行Linux和NetBSD的ports,和管理一个基于Xen系统的用户空间管理工具。本章描述如何从源代码安装Xen 3.0发行版。另外,也有编译好的包可用,作为你的操作系统发行版的部分。
2.1 安装的先决条件
下面是先决条件的列表。有`$\dag $' 标记的条目是xend控制工具必须的,因此它是需要的如果你想运行不止一个的虚拟机;有`*'标记的条目仅在你想从源代码安装时需要。
$$
A working Linux distribution using the GRUB bootloader and running on a P6-class or newer CPU.
一个工作的Linux发行版,使用GRUB系统引导管理器,运行在一个P6级别或者更新的CPU上.
$\dag $
The iproute2 package(iproute2软件包)
$\dag $
Linux bridge-utils2.1 (e.g., /sbin/brctl)
$\dag $
The Linux hotplug system2.2 (e.g., /sbin/hotplug and related scripts). On newer distributions, this is included alongside the Linux udev system2.3.
Linux热插拔系统2.2。在较新的发行版中,这个被包括在Linux udev 系统2.3中。
*Build tools (gcc v3.2.x or v3.3.x, binutils, GNU make). 编译工具
*Development installation of zlib (e.g., zlib-dev). zlib的开发安装
*Development installation of Python v2.2 or later (e.g., python-dev). Python v2.2的开发安装
*LATEX and transfig are required to build the documentation. LATEX 和 transfig构建文档时需要
一旦你满足了这些先决条件,你现在能安装二进制或者原代码的Xen发行版。
2.2 通过二进制Tarball包安装
预先编译好的tarballs可以从XenSource下载页面下载:
一旦你下载了tarball, 简单地解压和安装:
# tar zxvf xen-3.0-install.tgz
# cd xen-3.0-install
# sh ./install.sh
一旦你已经安装了二进制包,你需要配置你的系统,在章节2.5描述。
2.3 通过RPMs安装
预先编译好的RPMs可以从XenSource下载页面下载:
一旦你下载了RPMs, 你典型地安装它,通过输入RPM命令:
# rpm -iv rpmname
参看每一个RPM的指导和发布说明,在
.
2.4 通过源代码安装
这一段描述如何获取、编译和通过源代码安装Xen.
2.4.1 获得源代码
Xen源代码树不是作为一个压缩的源码tarball就是作为一个我们主Mercurial仓库的一个克隆可用。
获取源代码Tarball
Xen源代码树的稳定版和日常快照可以从Xen下载页下载:
通过Mercurial获取源代码
源代码树可以通过公共的Mercurial仓库获得,位置在:
参看指导和入门指南在:
2.4.2 从源代码建构
顶层的Makefile包含一个"world''的目标,它做如下的工作:
* 编译Xen.
* 编译控制工具, 包括xend.
* 下载(如果需要)和解压Linux 2.6源代码, 为了使用Xen它会给Linux打补丁.
* 编译一个在域0中使用的Linux内核,是一个无特权的内核,它用于无特权的虚拟机.
在编译完成之后,你会看到一个顶层目录叫 dist/,这里放置了所有目标的编译结果。我们最感兴趣的是两个XenLinux内核镜像文件,一个扩展名为"-xen0''的文件,包含硬件设备驱动器和Xen虚拟设备的驱动器;一个扩展名为"-xenU''的文件,仅仅包含虚拟的东西(就是打过补丁的Linux)。这些连同Xen本身的镜像文件和编译时使用的配置文件可以在dist/install/boot/ 中找到。
定制内核集,你需要编辑顶层的Makefile文件。找到下面的一行:
KERNELS ?= linux-2.6-xen0 linux-2.6-xenU
你可以编辑这行,来包括在顶层buildconfigs/目录配置过的任一个操作系统内核集.
2.4.3 定制内核
如果你想编译一个定制的XenLinux内核(例如,支持附加的设备,使用发行版的特性), 你可以使用标准的Linux配置机制,指明编译的构架是Xen,例如:
# cd linux-2.6.12-xen0
# make ARCH=xen xconfig
# cd ..
# make
你也可以拷贝已有的Linux配置文件进来,例如linux-2.6.12-xen0,然后执行:
# make ARCH=xen oldconfig
会提示一些关于Xen的特定选项。我们建议接受这些默认选项。
注意,唯一的不同的是编译两种类型Linux的配置文件。"U''后缀的版本不包含任何的物理硬件驱动,导致文件大小缩小30%;因此你喜欢用这些做非特权的域。"0''后缀的版本的特权版本可以用来启动系统,可作为驱动域和非特权域。
2.4.4 安装生成的二进制代码
编译过程生成的文件在dist/install/目录下。在它们的默认位置安装它们,执行:
# make install
另外,有特殊安装需求的用户可能想手动安装它们通过把文件拷贝到相应的位置。
dist/install/boot目录也包含了编译XenLinux内核的配置文件,也包含了Xen和XenLinux内核调试文件,例如xen-syms-3.0.0 and vmlinux-syms-2.6.12.6-xen0,当系统崩溃时,他们还是有必要的,因为做为开发者,他们需要这些崩溃纪录,您可以通过邮件列表发送给开发者。
2.5 配置
如果您编译并安装好了Xen的发行版,准备用于启动的机器和运行Xen是简单的。
2.5.1 GRUB配置
要在grub.conf(通常在 /boot/ 或者 /boot/grub/下)文件中添加一条记录来允许Xen / XenLinux启动。这个文件有时也叫menu.lst,依赖于你的发行版。记录看起来像下面这样:
title Xen 3.0 / XenLinux 2.6
kernel /boot/xen-3.0.gz dom0_mem=262144
module /boot/vmlinuz-2.6-xen0 root=/dev/sda4 ro console=tty0
kernel行告诉GRUB那里去发现Xen,什么参数传递给它( 在这个例子中,以千字节设置域0的内存分配和串口设置)。关于Xen启动参数的更多信息看章节 10.3。
module行的配置指明了运行Xen的XenLinux内核的位置和参数。这些是标准的Linux参数,确定根设备和指明它在最初被只读挂载,还有指明到屏幕的控制台输出。一些发行版例如SuSe不需要 "ro"参数。
为了使用initrd, 在配置文件中添加另一个module行, 像这样:
module /boot/my_initrd.gz
当安装了一个新的内核,建议你不要删除在menu.lst中已经存在的菜单选项,因为将来你可能需要从老的Linux内核启动,特别是你遇到问题的时候。
2.5.2 (串口控制台.可选)
串行控制台访问允许你管理、监视和于你的系统交互通过一个串行的控制台。它能提供从别的附近的系统通过一个null- modem("LapLink") cable 或经由远程串口集线器访问登录。
你系统的BIOS,启动装载器(GRUB),Xen,Linux和登录访问,必须分别配置串行控制台访问。它不是确实地需要每个组件的全功能,但是它可能相当有用。
关于Linux下串口控制台的更多信息,请参考"Remote Serial Console HOWTO'',位于Linux文档项目:
2.5.2.1 串行控制台Bios配置
启用系统串行控制台输出既不是启用也不是禁止在GRUB、Xen和Linux中的串行能力,而是通过在串行端口上显示POST和其它的启动信息,允许远程BIOS配置,让你方便地远程管理你的系统。
参考你的硬件提供商的兼容性和步骤的文档来启用BIOS串行重定向。
2.5.2.2 串行控制台GRUB配置
启用GRB串行控制台输出既不是启用也不是禁止Xen或者Linux的串行能力,而是通过在串行端口上显示GRUB提示、菜单和动作,允许远程GRUB管理,让你方便地远程管理你的系统。
添加下面两行在你的GRUB配置文件中来启用GRUB串行输出,一般不是/boot/grub/menu.lst就是/boot/grub/grub.conf文件,这个要看你的发布版。
serial --unit=0 --speed=115200 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console
注意,当串口和本地显示器与键盘启用的话,文本"Press any key to continue'' 会在两端显示。 在一个设备上按下一个键会导致GRUB显示到那个设备.其它设备看不到输出.在超时之前如果没有键按下,系统会进入默认的GRUB启动条目。
更多信息请参考GRUB文档.
2.5.2.3 串行控制台Xen配置
启用Xen串行控制台输出既不是启用也不是禁止Linux内核输出也不是通过串口登录到Linux。它是允许你通过串行控制后台去监视和记录Xen启动进程,在调试时这是很有用的。
为了配置Xen串行控制台输出,需要在你的GRUB配置中添加一个启动选项;例如使用下面的kernel行替换前面的例子内容:
kernel /boot/xen.gz dom0_mem=131072 com1=115200,8n1
这个配置Xen在COM1输出,115,200波特率, 8数据位, 1停止位,没有奇偶校验. 根据你的环境修改参数。
你也可以配置XenLinux来共享串行控制台输出; 追加 “console=ttyS0'' 到你的module行可达到这个目的.
2.5.2.4 串行控制台Linux配置
在启动时启用Linux串行控制台输出既不是启用也不是禁止通过串行端口登录到Linux。它是允许你通过串行控制台监视和记录Linux启动进程,在调试的时候这个非常有用。
在启动时启用Linux输出,在你的内核GRUB行添加参数console=ttyS0 (or ttyS1, ttyS2, etc.) 。在Xen下,这个可能是
module /vmlinuz-2.6-xen0 ro root=/dev/VolGroup00/LogVol00 \
console=ttyS0, 115200
在ttyS0以115200波特率启用输出.
2.5.2.5 串行控制台Login配置
通过串行控制台登录到Linux,在Xen下或其它的,需要指明一个在串行端口上启动的登录提示。为了允许root通过串行控制台登录,串行端口必须添加到/etc/securetty 中.
为了在串行端口自动启动一个登录提示, 添加行:
c:2345:respawn:/sbin/mingetty ttyS0
到/etc/inittab文件. 运行 init q 强制重新加载inttab和启动getty.
为了允许root登录, 添加ttyS0到/etc/securetty文件,如果还没有添加的话.
你的发布版可能使用了一个其它的getty;可选的包括getty, mgetty and agetty.更多信息参看你的发布版的文档.
2.5.3 TLS 库
在尝试启动一个XenLinux kernel2.4之前,XenLinux 2.6内核的用户需要禁用TLS(Thread Local Storage)(例如,移动到其它位置/lib/tls /lib/tls.disabled)。你也可以启用TLS通过把目录恢复到原来的位置 (例如 mv /lib/tls.disabled /lib/tls)。
原因是这个当前的TLS实现使用了 Xen下不允许的一种分段方式.如果TLS没有被禁止,Zen使用的仿真模式急剧地削弱性能。为了不影响性能你需要安装'Xen-friendly(Xen友好的)'库版本。
2.6 启动Xen
现在可以重新启动系统和使用Xen.重新启动系统,选择新的Xen选项当Grub屏幕出现的时候。它看起来非常像一个平常的Linux启动。输出的第一部分来自Xen本身,提供了Xen的底层信息和下面的硬件。最后的输出部分来自XenLinux。你可能看到一些错误信息在XenLinux启动期间。这个不用去担心 -- 这个可能是XenLinux内核和你平常用的内核之间的内核配置文件不同造成的。当启动完成,你可以像平常一样登录到你的系统。如果你不能登录,你仍能通过重新启动在GRUB提示里选择进入你以前的Linux内核。
3. 启动一个Xen系统
启动系统到Xen你会进入一个特权的管理域,Domian0(域0)。在这里你使用 xm create命令创建和启动客户域。
3.1 启动域0(Domain0)
安装和配置完成之后,重新启动系统,当GRUB在屏幕出现的时候选择新的Xen选项。
紧接着的非常像一个平常的Linux启动。第一部分来自Xen本身,提供了Xen底层信息和下面的硬件信息。最后的输出部分来自XenLinux。当启动完成,你可以和平常一样登录到系统。如果你不能登录,你仍能通过重新启动在GRUB提示里选择进入你以前的Linux内核。
创建一个域的第一步是准备一个用来导入文件的根文件系统。一般地,这个可以存储在一个通常的分区上,一个LVM或者其它的卷管理分区,一个磁盘文件或者NFS服务器。最简单的是通过操作系统的安装盘把操作系统安装进另一个物理分区。
(注:这句话的意思是,用Xen虚拟的操作系统,可以安装在一个物理分区上,也可以安装在LVM上,可以安装在一个映像文件上,也可以安装在NFS 服务器提供的nfs文件系统上。最简单的方法就是在硬盘上分一个物理分区,安装好操作系统,然后再来通过Xen来虚拟。他在这里所说的创建您的 Domain 就是虚拟新的操作系统。——译者注)。
启动xend守护进程,请输入如下命令:
# xend start
如果您想让xend服务器守护程序开机自动运行,请参考 4.1。一旦xend 运行起来了,就可用xm工具来监视、管理、运行系统中的Domain。这一节提供的仅仅是概要。我们会在下一章节上提供xm工具的详细说明。
3.2 启动客户域(Guest Domains)
3.2.1 创建一个域配置文件
在启动一个虚拟的操作系统之前,您必须创建一个引导这个虚拟操作系统的配置文件 。我们提供了两个示例文件,这能做为您学习Xen虚拟操作系统的一个起点。
● /etc/xen/xmexample1 是一个描述单一VM的简单的模版配置文件.
● /etc/xen/xmexample2 是一个模版描述,配置多个虚拟机时用来重复使用。设置vmid变量,在这个模版的xm 命令行部分。
你也可以发现一些其它有用的例子。可以拷贝这些文件之一并相应的编辑它。你希望编辑的典型值包括:
kernel
设置Xen使用的你编译的内核路径(例如kernel = "/boot/vmlinuz-2.6-xenU'')
memory
以兆字节设置域的内存大小(例如 memory = 64)
disk
在这个列表中设置第一条记录来计算域的根分区偏移量,基于域(domain)ID。第二条记录是/usr的位置如果你想在域之间共享/usr目录。(例如 disk = ['phy:your_hard_drive%d,sda1,w' % (base_partition_number + vmid), 'phy:your_usr_partition,sda6,r' ]
dhcp
去掉dhcp变量的注释, 允许domain从DHCP服务器接收IP地址(例如dhcp="dhcp'')
你也可能想去编辑vif变量,来自己选择虚拟以太网接口的MAC地址. 举个例子:
vif = ['mac=00:16:3E:F6:BB:B3']
如果你没有设置这个变量, xend将自动产生一个随机的MAC地址,范围00:16:3E:xx:xx:xx,IEEE分配给XenSource的OUI(organizationally unique identifier). XenSource公司允许任何人为他的Xen域随便地使用这个范围的地址.
IEEE OUI的分配列表参看 。
3.2.2 启动客户域
xm工具提供了多种命令来管理域。使用create命令来启动新的域。假设你已经生成了一个基于/etc/xen/xmexample2配置文件myvmconf,启动一个域,虚拟机ID为1,你需要输入:
# xm create -c myvmconf vmid=1
-c开关导致xm在生成之后进入域的控制台。vmid=1设置了在myvmconf文件中使用的vmid变量。你能在你输入命令的终端看到来自新域显示的控制台启动信息,最终是一个登录提示。
3.3 自动 启动 / 停止 域
它是可能的,在启动的时候自动启动特定域和在dom0(域0)关闭系统之前停止所有正在运行的域。为了让一个域在启动的时候启动,把它的配置文件放在/etc/xen/auto/下。如果提供了一个Rad Hat和LSB兼容系统的Sys-V类型的init脚本,那么安装的过程中会自动拷贝到/etc/init.d/下。你可以为你的发行版通过相应的方法启用它。
例如, 在Red Hat上:
# chkconfig --add xendomains
默认情况下, 这个将会启动 boot-time域在运行级别 3 、4 和5。
你也可以手动地使用service命令运行这些脚本,例如:
# service xendomains start
启动/etc/xen/auto/下所有配置文件的域.
# service xendomains stop
停止所有正在运行的Xen域.
2 配置和管理
4. 域管理工具
本章概述可用的管理软件和工具。
4.1 Xend
Xen Daemon (Xend)执行与虚拟机相关的系统管理功能。它构成了一个机器的中心控制点,可以使用基于HTTP协议进行控制.为了启动和管理虚拟机Xend必须运行.Xend必须以root身份运行,因为它需要特权的系统管理功能。一小部分命令可以用在xend命令行中:
# xend start 启动xend, 如果还没运行
# xend stop 停止xend,如果已经运行
# xend restart 如果正在运行重起xend, 否则启动它
# xend status 通过返回代码显示xend状态
一个名字为xend的SysV 初始化脚本用来在系统启动的时候运行xend。make install安装这个脚本在/etc/init.d目录下。为了启用它,你需要在相应的运行级别目录做一个指向它的符号链接,或者使用chkconfig工具(如果这个工具可用)。一旦xend运行,可以使用xm工具管理。当xend运行,时间会被记录到 /var/log/xend.log 和 /var/log/xend-debug.log文件.这个和标准的系统日志在一起,当解决问题的时候是有用的。
4.2 Xm
xm工具是一个从控制台管理Xen的主要工具。这个命令的一般格式是:
# xm command [switches] [arguments] [variables]
变量开关和参数依赖于你选择的命令。变量可以通过 variable=value 的形式来声明,命令行声明的变量覆盖在配置文件中使用相应变量的值,包括上面描述的标准变量和任何定制变量(例如,xmdefconfig文件使用的vmid变量)。
命令的在线帮助, 请输入:
# xm help
这个会列出大部分常使用的命令。获得详细命令列表请使用 xm help --long. 你也可以输入 xm help 来获得一个给定命令的详细信息.
4.2.1 基本管理命令
一个比较有用的指令是 xm list ,它能列出所有正在运行的Domain ,格式如下::
name domid memory vcpus state cputime
每一列的意义如下:
name
虚拟机的名字.
domid
正在运行的虚拟机的域ID.
memory
以兆为单位的内存大小.
vcpus
这个域使用的CPU数量.
state
域的状态:
r
正在运行
b
阻塞
p
暂停
s
停止
c
崩溃
cputime
到目前为止域使用的CPU时间(以秒为单位)。
# xm list命令也支持长输出格式,使用 -l 开关. 使用xend's SXP配置格式输出正在运行域的充分的细节。你可以使用# xm console命令进入到特定域的控制台(例如 # xm console myVM)。
5. 域配置
下面包含了域配置文件的语法、进一步设置网络的说明,驱动域和通常的调度行为。
5.1 配置文件
Xen 配置文件包含了下面的标准变量. 除非另作说明, 配置条目使用引号括起来: 参看/etc/xen/下的具体例子的配置脚本。
kernel
内核镜像文件路径.
ramdisk
内存磁盘镜像路径Path to a ramdisk image (可选).
memory
内存尺寸,单位兆字节.
vcpus
虚拟CPUs的数量.
console
域控制台使用的端口(默认 9600 + 域 ID).
nics
虚拟网络接口数量.
vif
MAC地址列表(如果没有给出地址随机指派) and 域网络接口使用的桥, 例如
vif = [ 'mac=00:16:3E:00:00:11, bridge=xen-br0',
'bridge=xen-br1' ]
指派一个MAC地址和桥到第一个接口,指派一个不同的桥到第二个接口,留给xend去选择MAC地址.
disk
输出到域上的块设备列表,例如 disk = [ 'phy:hda1,sda1,r' ] 输出物理设备 /dev/hda1 到域 作为只读存取的/dev/sda1. 输出一个可读写磁盘,挂在上是很危险的- 如果你确认你希望这样做, 你可以指定 w! 写模式.
dhcp
设置'dhcp',如果你想使用DHCP去配置网络.
netmask
手动配置IP子网掩码.
gateway
手动配置的IP网关.
hostname
虚拟机的主机名.
root
在内核命令行上 指定根设备参数.
nfs_server
NFS服务器的IP地址(若有的话).
nfs_root
NFS服务器的根文件系统的路径(若有的话).
extra
额外的字符创追加在内核命令行上 (若有的话)
附加的字段写在例子配置文件中(例如,配置虚拟TPM功能).
为了额外的灵活性, 在配置文件中包含Python脚本命令是可能的。xmexample2文件就是这样的一个例子,它用Python代码来处理vmid变量。
5.2 网络配置
对大多数用户, 默认的安装工作在"盒外(out of the box)''. 更复杂的网络设置, 例如多网络接口或者桥设置需要一些特别的配置.这个章节的目的是描述xend提供的机制,允许灵活的配置Xen的虚拟网络.
5.2.1 Xen虚拟网络技术
每一个域网络接口连接到域0(dom0)中虚拟网络接口通过一个点对点的连结(有效的一个 "虚拟交叉线(virtual crossover cable)''). 这些设备命名vif. (例如 vif1.0 是域1(domain 1)中的第一个网络接口, vif3.1是域3(domain 3) 中的第二个网络接口.
这些虚拟接口的传输在域0(domain 0)里使用标准的Linux机制(例如桥接、路由、速度限制等等)处理。Xend调用两个shell脚本来执行初始化的网络配置和新虚拟接口的配置. 默认情况下,这些脚本为所有虚拟接口配置一个单个桥 . 任意的 路由/ 桥配置可以通过定制的脚本来配置, 就像下面的章节描述的一样.
5.2.2 Xen网络脚本
Xen的虚拟网络脚本通过两个shell脚本来配置(默认是 network-bridge 和 vif-bridge). 这些脚本当某一事件发生的时候xend自动调用,携带参数的脚本提供更多的上下文信息. 这些脚本默认在 /etc/xen/scripts 目录下. 脚本的名字和为止可以在/etc/xen/xend-config.sxp中配置.
network-bridge:
这个脚本被调用当xend启动或者停止时来分别地初始化和拆卸Xen虚拟网络. 默认的初始化配置创建桥 `xen-br0' 并移动 eth0 到这个桥里, 相应地修改路由. 当xend退出时, 它删除Xen桥并移出eth0, 恢复正常的IP和路由配置.
vif-bridge:
这个脚本可以被每一个域的虚拟接口调用,可以配置防火墙规则和添加vif到适当的桥. 默认情况下, 这个在默认的Xen桥上添加和移出VIFs. 其它的例子脚本是可用的 (network-route 和 vif-route, network-nat 和 vif-nat). 对于更复杂的网络配置 (例如, 需要路由或者与已存在的桥结合)这些脚本可以为你站点的首选配置使用定制变量来替换.
6. 存储和文件系统管理
有许多不同的方法来配置虚拟机中使用的存储. 这章介绍一些可能的配置.大部分简单的方法是从域0(dom0)直接输出一个物理块设备(一个硬盘设备或者分区)到客户域作为一个虚拟块设备(VBD).存储也可以从一个文件系统镜像或者分区的文件系统镜像输出作为一个基于文件的VBD.最后, 标准的网络存储协议例如NBD, iSCSI, NFS, 等等, 能够用来为虚拟机提供存储.
6.1 输出物理设备作为VBDs
一个最简单的配置是从域0(domain 0)直接输出各自的分区到其它的域中。实现这个使用 phy: 指示符在你的配置文件中。比如类似下面的一行:
disk = ['phy:hda3,sda1,w']
指明在域0(domain 0)中的分区 /dev/hda3 被读写输出到新域作为 /dev/sda1; 当然也可以虚拟为/dev/hda或 /dev/sdb5,就看您想用哪个了。
另外采用相同的方式,本地磁盘和分区可以输出任一个Linux可认作"一个磁盘"的设备。举例来说,如果你有iSCSI 磁盘 或者 GNBD 卷输入到域0( domain 0)你可以输出这些到其它域,使用phy: disk语法. 例如:
disk = ['phy:vg/lvm1,sda2,w']
\framebox{\bf Warning: Block device sharing}
块设备在域之间进行共享典型地采用只读方式,否则Linux内核文件系统会混乱, 因为在它们下面文件系统结构可能改变(同样的ext3分区挂载两次绝对是一种玩火的方法会导致不可挽回的损坏)!Xend将会尝试防止你做这些,通过检查设备没有在域0(domian 0)中读写挂载,也没有以读写方式输出到另一个域。如果你想读写共享,经由NFS从域0(domain 0)输出目录到其它域(或者使用一个集群文件系统,例如GFS或者ocfs2).
6.2 使用基于文件的虚拟块设备(VBDs)
可以使用在域0(Domain 0)的一个文件作为虚拟机的主存储。这既方便也有好处,虚拟块设备将会是稀疏的 -- 仅仅实际分配部分使用的文件. 因此如果一个虚拟机仅仅使用了它的磁盘空间的一半,那么文件真正使用了已分配尺寸的一半。
举个例子, 生成一个2GB稀疏的基于文件的虚拟块设备 (实际上此时仅消耗了2kb磁盘空间):
# dd if=/dev/zero of=vm1disk bs=1k seek=2048k count=1
在磁盘文件中制作文件系统:
# mkfs -t ext3 vm1disk
(当工具提示确认的时候, 回答 'y')
移植文件系统 ,举例来说,从当前的根进行拷贝:
# mount -o loop vm1disk /mnt
# cp -ax /{root,dev,var,etc,usr,bin,sbin,lib} /mnt
# mkdir /mnt/{proc,sys,home,tmp}
附加文件系统通过编辑/etc/fstab、/etc/hostname文件等等. 不要忘记在挂载文件系统里去编辑文件,而不是你的域0(domian 0)的文件系统,举例来说,你应该编辑/mnt/etc/fstab文件而不是/etc/fstab文件。对于这个例子把/dev/sda1放到根在fstab文件中.
现在卸载 (这个非常重要!):
# umount /mnt
在配置文件中设置:
disk = ['file:/full/path/to/vm1disk,sda1,w']
因为虚拟机往它的"磁盘"写文件, 稀疏的文件会被填充,消耗更多的空间最大到原来的2GB.
注意,基于文件的VBDs可能不适合后台I/O密集的域. 基于文件的VBDs在繁重的I/O负载下会遭受严重的速度瓶颈, 因为通过回送块设备的I/O处理被用来支持在域0(dom0)中基于文件的VBDs. 更好的I/O性能可以被达到,通过使用LVM-backed VBDs (章节 6.3) 或者 物理设备作为VBDs (章节 6.1).
默认情况下,Linux最大支持8个基于文件的跨越所有域的VBDs. 这个限制可以被静态地增加通过使用max_loop模块参数,如果CONFIG_BLK_DEV_LOOP在域0(dom0)内核中作为模块编译了话,或者使用max_loop启动选项如果CONFIG_BLK_DEV_LOOP被直接编译到域0(dom0)内核中.
6.3 使用基于LVM的VBDs
一个格外吸引人的方案是使用LVM卷作为后台域文件系统,因为这个允许动态增加/缩减卷,还有快照(snapshot)和其它功能。
初始化一个分区来支持LVM卷:
# pvcreate /dev/sda10
在物理分区上创建一个卷组名为 'vg':
# vgcreate vg /dev/sda10
生成一个4GB的逻辑卷,名为'myvmdisk1':
# lvcreate -L4096M -n myvmdisk1 vg
你能看到你有一个/dev/vg/myvmdisk1。制作一个文件系统, 挂载它和使用它,举例来说:
# mkfs -t ext3 /dev/vg/myvmdisk1
# mount /dev/vg/myvmdisk1 /mnt
# cp -ax / /mnt
# umount /mnt
现在使用下面的磁盘配置来配置你的VM(虚拟机):
disk = [ 'phy:vg/myvmdisk1,sda1,w' ]
LVM能够让你增加逻辑卷的尺寸,但是需要你重新设置相应文件系统的大小来利用新的空间.一些文件系统(例如 ext3)现在支持在线调整大小.更多信息参看 LVM 手册.
您也可以通过copy-on-write(CoW)来创建LVM 卷的克隆(在LVM术语的通称是可写的持续快照)。这个工具在最早出现在Linux 2.6.8的内核中,因此他不可能象希望的那样稳定。特别注意的是,大量应用CoW LVM 硬盘会占用很多dom0的内存,并且有错误情况发生,例如超出硬盘空间的不能被处理。希望这个特性在未来有所提升。
创建上面文件系统的copy-on-write克隆,你应该使用下面的命令:
# lvcreate -s -L1024M -n myclonedisk1 /dev/vg/myvmdisk1
# lvcreate -s -L1024M -n myclonedisk2 /dev/vg/myvmdisk1
上面的命令从主卷为两个逻辑卷各划分了1G的差额空间.你可以使用lvextend命令增加差额空间存储的大小, 例如:
# lvextend +100M /dev/vg/myclonedisk1
不能让 '差额卷(differences volume)'不断地装满,否则LVM会有些冲突. 可以让这个增加过程自动执行,通过使用 dmsetup wait 察出卷满了,然后发出一个lvextend命令.
原则上,可以往克隆的卷(变化对克隆的卷来说是不可见的)上连续写, 但是我们不推荐这样:把克隆卷作为没有直接挂载在任何一个虚拟机上的'干净的'文件系统安装。
6.4 使用NFS根(NFS Root)
首先, 在服务器的一个目录下移植一个根文件系统. 这个可以在一个不同的物理机器上,或者只是运行在同一个节点的一个虚拟机上.
现在在网络上配置NFS服务器来输出这个文件系统,在/etc/exports中加入一行, 例如:
/export/vm1root 1.2.3.4/24 (rw,sync,no_root_squash)
最后, 配置域来使用NFS根.除了通常的变量外,你需要在域配置文件中设置下面的这些值:
root = '/dev/nfs'
nfs_server = '2.3.4.5' # substitute IP address of server
nfs_root = '/path/to/root' # path to root FS on the server
域在启动的时候需要网络存取,因此不是通过配置变量ip、netmask、gateway、hostname来静态配置IP地址就是启用DHCP(dhcp='dhcp').
注意Linux NFS实现在高负载下存在稳定性问题(这不是一个Xen问题),因此这个配置对于那些重要的服务器不适合。
7. CPU管理
Xen允许一个域的虚拟CPU(s)和一个或者多个主机CPU关联。这可以用来在一个或者多个客户域之间分配实际的资源,或者优化使用处理器资源当使用双核、超线程或者其它高级CPU技术的时候。Xen采用'深度优先(depth first)'的方式仿真物理CPU。对于一个既有超线程又有双核心的系统,这就是在一个给定核心上的所有线程,然后是在一个给定插槽上的所有核心,然后是所有插槽。也就是,如果你有两个插槽,双核超线程Xen CPU,顺序将是:
socket0 socket1
core0 core1 core0 core1
ht0 ht1 ht0 ht1 ht0 ht1 ht0 ht1
#0 #1 #2 #3 #4 #5 #6 #7
让同一个域内的多个虚拟CPU影射到相同物理CPU很可能导致性能不佳。最好使用'vcpus-set'来热插拔其中一个虚拟CPU,确保其它的虚拟CPU在不同的CPUs上。如果你正在运行IO繁重的任务,典型地最好把一个超线程或者整个核心给正在运行的域0(domain 0),因此束缚其它的域让他们不能使用CPU 0.如果你的工作负载主要是计算,你可能想这样配置vcpus,所有的物理CUP线程对所有的客户域可用。
8. 迁移域
8.1 域的保存和恢复
Xen的超级管理员可以在域0(domian 0)中挂起一个虚拟机的当前状态到一个磁盘文件中,允许在以后某个时间恢复它。
例如你可以使用如下命令挂起"VM1"域到磁盘:
# xm save VM1 VM1.chk
这个会停止"VM1"域,保存它的状态到 VM1.chk文件中.
恢复这个域的执行,使用xm restore 命令:
# xm restore VM1.chk
这会恢复域的状态并执行它.域会像以前那样运行,控制台可以使用 xm console 命令重新连接,就像以前描述的那样.
8.2 迁移和活动迁移
迁移用来在不同的物理主机之间传输域.有两种情况:常规的和活动的迁移.前者移动一个虚拟机从一个主机到另一个主机,通过中止它、拷贝它的内存内容,然后再目标主机上恢复它。后者执行相同的逻辑功能但是在迁移期间不用中止域。通常当执行活动迁移的时候,域继续他平常的活动,从用户的角度看,迁移是感觉不到的。执行一个活动迁移,两个主机必须正在运行Xen / xend ,在移动之后,目的主机必须有足够的资源(例如内存容量)给域使用。而且我们通常需要源和目的机器在同一个L2子网内。
通常,当一个域被迁移的时候,远程存取存放在本地磁盘的文件系统是不支持的。管理员需要选择一个适合的存储方案(例如 SAN, NAS等等)来确保域文件系统在它的目标节电也可用。从一个机器到另一个机器输出卷,GNBD是一个好方法。iSCSI也能完成相同的工作,但是它的设置更复杂。
当一个域迁移的时候,它的MAC和IP地址也会一起移动,因此仅可能在同一个layer-2网络和IP子网内迁移虚拟机。如果目标节电在一个不同的子网上,管理员需要在远程节电的域0(domain 0)内手动配置一个合适的etherip或者IP通道。
可以使用 xm migrate 命令迁移一个域。活动迁移一个域到另一个机器,我们可以使用命令:
# xm migrate --live mydomain destination.ournetwork.com
没有-live标志,xend简单地停止域,拷贝内存映像到新节点并重起它。因为域可能有巨大的分配,所以这可能相当耗费时间,即使在一个千兆网上。使用 -live 标志,xend尝试当迁移正在进行的时候保持域的运行状态,导致通常的大约60-300毫秒的停歇(或者说是中断)。
目前需要使用 xm console命令在新的机器上重新连接到域的控制台。如果迁移的域有一些开放的网络连接,那么他们会被保留,因此SSH连接没有这个限制。
9. Xen安全
This chapter describes how to secure a Xen system. It describes a number of scenarios and provides a corresponding set of best practices. It begins with a section devoted to understanding the security implications of a Xen system.
9.1 Xen安全事项
当布置一个Xen系统的时候,你必须尽可能的确保管理域0(Domain-0)的安全。如果管理域受到威胁,所有的域也处于危险之中。下面是一些管理域0的较好的策略:
1. 运行最小数量的所需服务,确认不用的服务尽量停止掉。在管理的域中运行的服务越少越好T。记住,在管理域中,以root身份运行的服务对系统上的所有域都有存取权限。
2. 使用防火墙限定管理域上的传输。使用“默认拒绝规则“的防火墙可以帮助管理域免受攻击。
3. 不允许用户存取Domain-0. Linux内核已经对本地用户root可用。如果你允许一般的用户(即使是非特权用户)存取域0(Domain-0),那么你要冒内核被利用的风险,你的所有域容易受到攻击。
9.2 安全方案
9.2.1 隔离管理网络
在这种情况中,在集群中每个节点都有两块网卡。一个网卡要与外部相连,另一个网卡是被Xen接口而用的物理隔绝管理的网络。只要所有的管理分区是平等可信,这种情况就是最可信的。没有必要为了隔绝网络,而额外配置强制Xend绑定到其它管理端口。
9.2.2 子网位于防火墙之后
在这种情况中,每个节点有自己的网卡,但整个集群在防火墙之后。这个网络至少做到以下方面:
1. 阻止来自外网的IP欺骗.
2. 阻止对集群内任何节点隔离端口的访问,除非是来自群集内部.
下面的防火墙规则可以用在每个节点上,防止那个节点迁移时来自子网外部的访问,假设主防火墙还没有做这些:
# 这个禁止所有到重布置的Xen 8002端口的访问
# port:
iptables -A INPUT -p tcp --destination-port 8002 -j REJECT
# 这个命令指定子网192.168.1.1/8访问8002端口
# subnet:
iptables -I INPUT -p tcp -{}-source 192.168.1.1/8 \
--destination-port 8002 -j ACCEPT
9.2.3 节点位于不信任子网上
对于一个不可信的子网,在Xen当前版本下,进行迁移是不安全的。但它能通过一个安全通道来实现,比如VPN或SSH。在缺乏安全通道的不环境下,完全屏掉迁移只能是一个安全选择。比较容易的办法是用下面的iptable指令。
# this command disables all access to the Xen relocation port
iptables -A INPUT -p tcp -{}-destination-port 8002 -j REJECT