CentOS 5.7下利用LVM分区安装Xen安装虚拟机与磁盘空间动态扩容
一、Xen安装、配置与管理
    1、虚拟主机系统安装
    5.0系统起,Redhat就加入了虚拟系统平台的安装选项,并列为收费项目,要在安装系统的过程中直接安装虚拟系统平台需要购买其系统的序列号,同时也支持用户不输入序列号安装普通的操作系统平台,然后再手工安装支持Xen的内核、管理器和相关管理工具。CentOS,我们有很多人叫它社区企业操作系统,不管你怎么叫它,它都是linux的一个发行版本。CentOS是Red Hat的再编译版本,是一个免费的社区操作系统,我们本文的操作系统都是在Centos5.7上面进行的。
    Xen的安装可以分为源代码安装和RPM包安装两种方式,源代码安装方式相对来说比较复杂并且需要比较长的时间,在实际生产环境中实用性相对不如rpm包安装方式,除用于测试新功能之外,都推荐使用rpm包来安装Xen;而采用rpm包进行安装非常快捷方便,并且系统自带的RPM包都经过了比较严格的稳定性和兼容性测试,运行起来比较稳定,所以我们一般选择使用RPM包进行安装。以源代码来编译安装Xen的方法可以参考Xen的用户手册,我们主要介绍RPM包安装方法。
    手工安装Xen我们需要先安装普通的操作系统平台,因此我们可以参照我们以前的安装规范进行RH5操作系统的安装,安装的时候选项开发库、开发工具和原有的软件开发,安装好普通的操作系统平台以后,我们重启并进入安装好的操作系统,挂载安装盘并查找以下的RPM包:
kernel-xen
dnsmasq
xen-libs
SDL
bridge-utils
xen
python-virtinst
libvirt
libvirt-python
 
    新建一个目录并将上面的rpm包拷贝到该目录下,运行:
rpm -ivh *.rpm
    命令安装所有的rpm包,然后执行命令:
mv /lib/tls /lib/tls.disable
    禁用tls库,因为tls库会影响xen的性能。
    Xen内核在安装完后不会设置为缺省的启动项,需要修改/boot/grub/grub.conf,改变default=1为default=0,然后重启系统进入支持Xen的虚拟系统平台,至此完成Xen虚拟主机安装。
 
    上面的方法是手工用RPM包安装Xen的方法,还有一种方法就是使用yum来安装XEN,但是这种方法需要一个可用的yum源,安装方法如下: 
<1>、运行下面的命令安装xen内核和工具:
yum install kernel-xen xen
   这将下载并安装下面的包和它们的关联包:
kernel-xen:包含允许主机和客户机运行xen的内核,类似管理器
xen:包含与管理器交互的用户空间工具
bridge-untils:用于配置连接多个Ethernet设备的网桥
libvirt:提过使用Xen框架的API的C库
libvirt-python:包含一个让Python应用程序使用libvirt提供的xen框架的API的Python模块
python-virtinst:包含一个使用libvirt在虚拟机内部启动安装Fedora/Red Hat Enterprise Linux发布版本的Python模块
xen-libs:包含运行管理xen的应用程序所需的库
 
<2>、Xen内核在安装完后不会设置为缺省的启动项,需要修改/boot/grub/grub.conf,改变default=1为default=0
 
<3>、xen内核重启系统
 
系统重启后我们还需要进行相关的检查以确保我们的虚拟主机是否正常运行:
<1>、系统启动并运行后,检查正在运行的内核的版本以确定是否在运行Xen内核
 
<2>、xend--Xen控制监视器管理着域,可以用/etc/rc.d/init.d/xend脚本来启动和停止它,它在系统启动的时候默认是自动启动的。检查并确定xend是否正在运行,可以用下面的命令来搜索系统正在运行的进程的列表:
pidof xend
 
<3>、一旦xend运行,它将启动Domain0,这是个私有域。用xm命令检查domain0是否已经被创建并在运行。
xm list
 
<4>、检查网络接口是否已经起了,包括通常的网络接口如eth0和lo,分配给Xen的接口。
 
2、虚拟客户机安装
1)客户机安装总体流程
<1>、选择存储介质--文件、分区、LVM等;
<2>、安装客户机操作系统文件到选择的存储介质,安装这些文件的机制可以是一个自举工具(例如debootstap),一个ISO镜像文件,一个cd-rom,甚至可以是一个包含了所有需要的文件的简单文件系统目录;
<3>、创建一个Xen创建子域时用到的参数的配置文件;
<4>、使用xm创建子域;
 
各操作系统版本客户机的安装流程大体都相同,但是安装方法因系统间的不同而存在一些差异。对我们使用Centos5服务器版系统来说,可以使用系统自带的virt-install工具进行简单快速的操作系统安装,virt-install工具使我们可以像在物理机器上安装Centos系统一样安装虚拟的Centos系统,其过程如下:
<1>、我们设定使用/dev/vgwoyo/vm01 LVM作为我们虚拟系统的存储介质。
 
<2>、创建安装源,首先将CentOS5.7系统的cds挂载到系统中并将所有安装盘中的文件链接到一个相同的目录下(直接挂载CentOS5.7 DVD光盘镜像,用挂载的目录作为安装源目录),然后创建http、ftp或nfs服务,将服务目录设定为上面操作中链接了所有安装文件的目录,我们假定使用http服务并且http服务器IP地址为10.20.1.1。
 
<3>、使用virt-install工具开始客户机安装
首先在一个把一个空闲分区创建为LVM分区。
fdisk /dev/sda << EOF
n
 
 
p
w
EOF              
Partprobe             #创建物理分区
pvcreate /dev/sda6               #创建物理卷(PV)
vgcreate vgwoyo /dev/sda6        #创建卷组,把pv添加到卷组
lvcreate -L 50G -n vm01 vgwoyo   #创建一个大小为50G逻辑卷,加入到vgwoyo卷组
virt-install –n vm01 -r 2048 --vcpus=2 -f /dev/vgwoyo/vm01 –l "http://10.20.1.1/CentOS-5.7-x86_64" -b xenbr0 -m xx:xx:xx:xx:xx:xx
 
参数说明:
n -- 指定虚拟客户机的名称,也就是虚拟机运行以后用xm list命令看到的虚拟机的名称
r -- 指定虚拟客户机的内存值,此处设定为256,一般情况下虚拟主机系统需要至少256M内存,其余的内存都可以分配给虚拟客户机使用
vcpus -- 指定虚拟cpu的个数,可以设定为不超过物理cpu核数的不为零的任意个数
f -- 指定安装介质,此处我们设定为/dev/sda8,生产环境中按照实际情况修改
nographics -- 不使用图像安装方式,也就是使用文本安装方式
p -- 执行半虚拟安装
l -- 指定安装源
b -- 要连接的网桥的名称,默认为xenbr0,如果修改过网桥,请相应修改此值
m -- mac地址,不使用自动生成的MAC,手工指定MA C防止重复,MAC统一分配
 
<4>、安装虚拟客户机操作系统,安装过程跟物理机器安装操作系统过程基本相同,可以参考操作系统安装规范进行安装。
 
<5>、安装完成后重启虚拟客户机操作系统,此时可能会从终端退出客户机的连接,使用命令xm list查看客户机是否正常运行,如果正常,使用xm console name命令连接虚拟客户机的控制台,使用CTRL+]退出客户机控制台回到主机系统控制台。
 
<6>、修改相关自启动服务,完成客户机系统安装。
 
3Xen虚拟客户机配置管理
Xen域配置文件
Xen域的域配置文件指定管理域行为的多个参数,这些不同的配置Xen的文件放在/etc/xen目录下。
 
如果在创建域的时候使用绝对路径,则可以把创建domUs的配置文件放在任何地方。/etc/xen/auto是一个特殊目录,所有放置在里面的域配置文件对应的域都会在xend监听程序启动的时候被自动启动。
下面是一些在Xen域配置文件中可能要配置的常用的选项:
* kernel:用于域的内核镜像,提供到内核镜像文件的绝对路径
* ramdisk:指定给域的初始ramdisk。如果你的内核有用于你的根文件系统和硬盘的内置驱动,可能你不需要创建和指定ramdisk。此配置提供到initrd文件位置的完整路径
* memory:指定分配给域的总体内存容量,以MB为单位。如果分配的内存不足将阻止域的启动。你还必须确定Xen管理的总内存--包含dom0和所有的domUs--必须少于或等于安装在你的机器上面的物理内存总量。
* name:提供一个识别域的唯一的名称。这名称将会在你列出系统里正在运行的域的时候被显示。
* root:指定用于域的根设备
* disk:指定输出到域的块设备列表。它以如下格式提供:
 disk = [ "backend device", "frontend device", "mode" ]
 “backend device”指定输出到客户域的设备的格式和名称。
 “frontend device”指定输出的backend device如何出现在客户域中。它可以用通常的/dev/sda1的形式或使用该设备的16进制主要/次要号码(hex major/minor number)来指定--0x301
   “mode”指定设备是以只读还是可读写的形式输出。两个合法的选项是:
    r -- read-only
    rw -- read and write
* vif:指定域的虚拟网络接口配置。以如下的格式指定:
 vif = [ "key1 = value1", "key2 = value2" ]
 配置该指令的常用的选项是:
    bridge:指定用于此接口的网桥
    mac:指定此虚拟接口的MAC地址。如果有没有提供一个MAC地址,它将在Xen启动的时候随机配置一个MAC地址。此随机的地址是从IEEE分配给XenSource的(00-16-3E)的范围内选取的。你也可以用此指令定义一个静态的MAC地址,使你能够从DHCP服务器上分配到一个静态的IP地址。
* on_reboot:指定域重启过程中发生的动作。重启时候的合法状态有:
    destroy:完全关闭域
    preserve:域不会被清除,可得到域的调试信息以帮助调试崩溃
    rename-restart:旧的域不被清除。替代的是它被重命名同时启动一个新的域替换旧的域
* on_crash:指定domU崩溃后所执行的动作。此指令的合法状态与on_reboot选项相同
* vcpus:虚拟CPUs的数量
 
虚拟客户机可以使用xm命令来进行管理,下面是xm命令的一些基本用法:
创建一台虚拟客户机 xm create cfg-file
进入客户机的控制台 xm console vm-name/vm-id
退出客户机的控制台 CTRL+]
列举正在运行的客户机    xm list
关闭正在运行的客户机    xm shutdown vm-name/vm-id
强制关闭正在运行的客户机    xm destroy vm-name/vm-id
 
当使用xm命令连接到某台虚拟客户机上以后,其操作方式与在一台物理机器的控制台操作相同,我们也可以打开虚拟客户机的sshd服务,进行远程连接管理。
 
虚拟CPU管理
xen客户机启动的时候,虚拟CPU是由dom0系统决定固定在某个物理CPU核心上的,这个分配具有随机性,比如我们的机器上有2个双核的处理器,也就是说有4个cpu核心,同时我们分配4个核给我们的虚拟客户机,那么我们在客户机也看到4个cpu核心的,但是这四个vcpu核心并不是真的对应着物理机器上的四个核,可能四个虚拟cpu对应的是物理cpu中的1~4个核,也就是说有下面4个可能:
4vcpu=1cpu
4vcpu=2cpu
4vcpu=3cpu
4vcpu=4cpu
 
vcpu指虚拟CPU核心
cpu指物理CPU核心
 
因此,当我们的虚拟客户机上如果运行的是运算密集型的任务的时候,就必须看看我们vcpu与物理CPU的对应,必要的情况下手工固定VCPU到物理CPU上,使该虚拟机可以使用所有的物理核心;而如果你正在运行IO密集型任务,那么最好就分配一个超线程或整个核给dom0,并且固定其他的域让他们不能使用CPU 0
查看vcpu于cpu的对应情况,可以使用两种方法:
1、使用xm vcpu-list命令
    xm vcpu-list        #列出所有域的CPU对应情况
    xm vcpu-list domname    #列出指定域的CPU对应情况
如果不进行VCPU固定,上面的list结果在最后一列CPU关联关系(cpu affinity)的值应该是any cpu,并且第三第四列就列出了VCPU和其对应的CPU
 
2、进入virsh,运行vcpuinfo命令
    vcpuinfo domname    #列出指定域的CPU对应情况
如果不进行VCPU固定,上面的命令的结果中,列表中的CPU关联关系项(CPU Affinity)的值应该全部为y,物理CPU有多少核就有多少个y,而如果有指定的话,只有对应的核为y,其他的为-,比如我们的机器有4个核,那么:
没有进行VCPU固定:                      CPU Affinity: yyyy
VCPU固定在第二个核(编号为1)上:       CPU Affinity: -y--
 
 
Xen中虚拟客户机的cpu动态调整有两种方法
1、使用xm vcpu-set命令可以设置cpu个数
    xm vcpu-set domname vcpu-num
   使用xm vcpu-pin命令可以固定vcpu到物理cpu
    xm vcpu-pin domname vcpu cpu
    vcpu--虚拟cpu的号码(号码可以用cat /proc/cpuinfo命令得到,一般从0~N-1[其中N为CPU核数])
    cpu--主机中cpu的号码
2、进入virsh,然后用setvcpus命令进行设置
    setvcpus domname vcpu-num
   使用vcpupin命令可以将vcpu固定到物理cpu
    vcpupin domname vcpu cpu
 
两种配置方法可以混用。由于上面已经提到物理CPU的分配默认是由系统分配的,所有动态地增加CPU个数之后,应该检查CPU分配情况以确保是否满足了自己的需求。
 
二、虚拟网络
Xen的网络主要有:
* 桥接网络
* 路由网络
    xen里面缺省的网络设置是桥接,这可以通过查看Xen在配置文件(/etc/xen/xend-config.sxp)来进一步确认,它应该有非注释的下面两行:
(network-script network-bridge)
(vif-script vif-bridge)
    要使用桥接网络,只需在虚拟客户机的配置文件的网络接口配置项中指定所要连接的网桥:
vif = [ 'bridge=xenbr0' ]
    当我们使用virt-install完成客户机安装以后,默认就已经完成了此项配置。
    桥接网络的结构图如下:
Xen启动桥接网络的过程:
1、执行/etc/xen/scripts/network-bridge脚本
2、这将创建一个叫xenbr0的新网桥
3、从物理网卡eth0复制MAC和IP地址
4、停止物理网卡eth0
5、创建一对新的已连接的虚拟网络接口--veth0和vif0.0
6、将之前复制的MAC和IP地址指派到veth0
7、重命名物理网卡eth0为peth0
8、重命名虚拟网卡veth0为eth0
9、连接peth0和vif0.0到xenbr0
10、启动网桥xenbr0和网卡peth0、eth0、vif0.0
 
如果我们需要将网络改为路由网络,那么需要修改xend的配置文件,首先要停止xend
service xend stop
然后修改xen配置文件/etc/xen/xend-config.sxp使我们能够使用路由网络。注释关联桥接网络的两行并取消注释关联路由网络的两行,如果在配置文件中没发现配置路由网络的行,那么加上他们:
(network-script network-route)
(vif-script     vif-route)
再重新启动xend让它用新的配置起动
xend start
 
最后修改我们之前使用的domU的配置文件,去掉之前设定的桥接配置,加入静态的IP地址,使它能使用路由网络
vif = [ 'ip=10.20.10.150']
 
路由网络的结构图如下:
 
Xen启动路由网络的过程:
1、允许dom0进行IP转发
2、当domU起动的时候,xen从eth0复制IP地址到虚拟网络接口vif<id#>.0。虚拟接口的ID是自动分配给xen起动的每个客户域的。被分配的id在单个会话里面永远不会被重用,因此如果你停止并重启一个域,它将重新分配到一个新的ID。
3、启动虚拟接口vif<id#>.0。
4、为domU的配置文件中指向虚拟接口vif<id#>.0分配的IP地址增加静态路由
三、xen虚拟机磁盘扩容
1. 首先在物理机上对xen虚拟所安装的lvm逻辑卷进行扩容
lvextend -L +50G /dev/vgwoyo/vm01
2. 重启xen虚拟机后进入到虚拟机系统。利用fdisk –l 查看磁盘是否增加。
3. 把多出来的空间创建为一个单独的分区,然后在此分区上创建物理卷PV
fdisk /dev/xvda <<EOF
n
 
 
p
w
EOF
partprobe             
pvcreate /dev/xvda3   #创建物理分区
vgextend VolGroup00 /dev/xvda3,进行卷组扩展
lvextend -L +20G /dev/VolGroup00/LogVol02,给分区/var扩展20G的容量
lvextend -l +100%FREE /dev/VolGroup00/LogVol02,扩展整块硬盘空间
e2fsck -f /dev/VolGroup00/LogVol02         检查/var逻辑卷
resize2fs /dev/VolGroup00/LogVol02         重新定义分区大小
至此整个扩容步骤全部完成。
 
四、注意事项
1、稳定的物理硬件环境,由于虚拟机的使用将会使多个系统运行在单个物理设备上,所以保证稳定可靠的物理系统是非常重要的,否则物理硬件的不稳定直接使多个应用受到影响。
2、Xen主机必须保持洁净,也就是说不应该在xen主机上安装任何的应用程序,因为xen上管理器管理着domU,如果xen主机出现故障,那么将直接导致本机上所有的domU受影响。
3、Xen客户机的MAC地址如果不指定的话是由主机随机分配的,此随机的地址是从IEEE分配给XenSource的(00-16-3E)的范围内选取的。在大的局域网内部应该做好规划,手工分配MAC地址并做好记录,防止随机生成相同的MAC而影响应用的正常。
4、生产环境中压力较大在应用不应该使用镜像文件来安装系统,因为这样系统的性能会比较差,但是压力小的应用则可以考虑使用文件作为存储介质,这样方便转移数据和备份,在使用文件作为安装介质的过程中发现有时候安装会非常慢,有待进一步确认原因。
5、虚拟客户机的时钟是模拟的,如果出现时间不准确的情况,使用ntpdate前应该先检查物理机器的时间是否准确,校准物理机器的时间后再校正虚拟客户机的时间。同时如果客户机的时间设置得比物理机的内存快,ntpdate可能会不成功,此时需要用date命令将客户机的时间调整为比物理主机慢,则客户机自动会校准时间了。如果客户机的时间快过物理主机的话客户机的时间是不会变的,直到物理主机的时间跟他相同的时候才会继续走。现发现XEN客户机中的时间跟主机时间会存在数秒到数十秒的差距,并且无论如何调整时间都不能调整为相同的情况,有待进一步寻找解决方法。
6、调整虚拟CPU个数的过程中,不能将cpu个数调到超过虚拟机初始启动的时候的值,也不能将虚拟CPU个数设置为大于物理CPU核数。
7、进行在线迁移的时候,源机与目标机器的配置文件应该是相同的
8、客户机的命名应该有意义,一般建议使用IP的最后两段作为客户机名称,并把“.”用“-”代替
9、虚拟机器的记录管理,如何做好虚拟机器的登记管理。
10、关闭IPv6支持
   #vi /etc/modprobe.conf
加入下面两行:
alias net-pf-10 off
alias ipv6 off
11、路由应该写在/etc/init.d/xend中,写在/etc/init.d/network文件中将不生效。
12、Xen的配置文件名不应该含义“.”,否则可能导致启动虚拟机的时候出现异常
13、64位RHEL5U2系统中XEN主机进行ntpdate校准时间的时候,如果此时有客户机运行并且主机时间与当前准确时间有较大偏差(比如数小时),可能导致客户机停止响应,不能正常关闭,创建虚拟客户机,不能正常安装虚拟客户机等情况,出现此情况暂时未发现较有效的解决方法,只能重启物理服务器。所以在安装客户机前最好进行一次时间校准,防止出现此情况。
14、现发现XEN客户机中的时间跟主机时间会存在数秒到数十秒的差距,并且无论如何调整时间都不能调整为相同的情况,对于时间要求非常精确的应用请注意,此问题可能为一个bug,现阶段已有一个临时解决方法,首先手工调整虚拟主机时间(可调整为当前时间前或后的几分钟或当前时间的秒数清零),然后用ntpdate重新同步校正时间,即可让主机时间与客户机时间保持一致,如果此时客户机时间比主机时间偏慢,客户机时间将自动同步为正确时间,如果客户机时间比主机时间偏快,则客户机时间将暂停,直到主机时间与其相同后再继续。