Xen使用详解

虚拟化 struggling 2227次浏览 0个评论
文章目录

1,虚拟化介绍

虚拟化是指计算机元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。CPU的虚拟化技术可以单CPU模拟多CPU并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

服务器虚拟化的实现有三个部分的实现,包括CPU虚拟化,内存虚拟化和IO虚拟化。

虚拟化的两种实现方式:

一,全虚拟化(native virtulization)

Type-I: 直接安装虚拟机管理器(基于硬件)

虚拟化软件代表:xen, vmware ESX/ESXi

特点:父分区(宿主机操作系统)的位置挪到了子分区(虚拟机操作系统)的旁边,宿主机操作系统和虚拟机操作系统是平级的,没有谁依附谁之上的关系。cpu和内存不做模拟,只需要对其分配和管理,要对I/O模拟。

I/O协议栈:虚拟机看到的所有设备不再都是虚拟出来的,有部分的硬件资源是真实的物理设备。

架构图:

全虚拟化

二,半虚拟化(para-virtualization)

Type-II: 二型需要安装系统(基于操作系统)

虚拟化软件代表:kvm, vmware workstation, virtualbox

特点:虚拟架构与底层架构完全要一致

I/O协议栈:Xen选择了可维护这条道路,它将所有的I/O操作放到了Linux guest里面,也就是所谓的domain-0里面。重用Linux来做I/O, Xen的维护者就不用重写整个I/O协议栈了。但不幸的是,这样就牺牲了性能:每一个中断都必需经过Xen的调度,才能切换到domain 0, 并且所有的东西都不得不经过一个附加层的映射。

架构图:

半虚拟化

三,Xen虚拟化方法

在Xen环境中,主要有两个组成部分。一个是虚拟机监控器(VMM),也叫hypervisor。Hypervisor层在硬件与虚拟机之间,是必须最先载入到硬件的第一层。Hypervisor载入后,就可以部署虚拟机了。在Xen中,虚拟机叫做“domain”。在这些虚拟机中,其中一个扮演着很重要的角色,就是domain0,具有很高的特权。通常,在任何虚拟机之前安装的操作系统才有这种特权。

Domain0要负责一些专门的工作。由于hypervisor中不包含任何与硬件对话的驱动,也没有与管理员对话的接口,这些驱动就由domain0来提供了。通过domain0,管理员可以利用一些Xen工具来创建其它虚拟机(Xen术语叫domainU)。这些domainU也叫无特权domain。这是因为在基于i386的CPU架构中,它们绝不会享有最高优先级,只有domain0才可以。

在domain0中,还会载入一个xend进程。这个进程会管理所有其它虚拟机,并提供这些虚拟机控制台的访问。在创建虚拟机时,管理员使用配置程序与domain0直接对话。(在本系列的第二部分,我们将探讨如何使用配置程序。)

从RHEL6版本开始,RedHat就不在原生支持Xen,改为投奔KVM的怀抱。尽管KVM号称支援HVM技术的全虚拟化,但KVM毕竟起步晚,远不如Xen技术成熟。所以在RHEL上安装Xen的方法只有两种,一种是自己下载源代码自行编译,但这种方法太耗费精力,所以忽略,另一中就是使用第三方软件源进行安装。本文使用Xen的官方源在CentOS6.6中进行安装。

Xen的工作模式有三种,最常用的就是半虚拟化:

pv: 半虚拟化(CPU,IO半虚拟化,性能非常好);

fv: 依赖于CPU的HVM(完全虚拟化);

pv on hvm: CPU完全虚拟化,但IO采用半虚拟化;

2,安装Xen

在安装Xen之前我们先检查一下CPU是否支持Xen虚拟化,如果看到输出中有pae,那么cpu就支持半虚拟化,如果输出中同时有pae和vmx/svm(注:vmx为intel,svm为amd),那么cpu支持全虚拟化。需要说明的一点儿是,只有fully virtualized的才可以从iso文件、cd-ROM等为虚拟机安装操作系统,且可以安装windows系统,para virtualized只能从ftp/HTTP服务器安装,且不能安装windows系统(由于需需要修改内核参数)。以下使用CentOS6.6进行安装。

[root@Linux ~]# cat /proc/cpuinfo | grep flags
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc up rep_good unfair_spinlock pni ssse3 cx16 sse4_1 sse4_2 popcnt aes hypervisor lahf_lm

1,首先添加镜像源(注:只在将源指向Centos或163的Xen4的源就可以安装了)

[root@localhost ~]# cat /etc/yum.repos.d/xen.repo 
[xen]
name=xenserver
baseurl=http://mirrors.163.com/centos/6.7/xen4/x86_64/
gpgcheck=0

或者使用以下方法将Xen4CentOS资料库连接到你的机器来轻松完成。

[root@localhost ~]# yum install centos-release-xen

2,安装xen

[root@localhost ~]# yum -y install xen

xen安装

安装后会在/boot/grub/grub.conf中看到一个支持xen的新内核已经配置好,修改 default 的值默认启动 Xen 内核(default=0表示从第一个内核启动)。

3,修改引导文件

安装完xen后,查看/boot/grub/grub.conf应该会有这样的条目

[root@localhost ~]# cat /etc/grub.conf 
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.18.21-17.el6.x86_64)
	root (hd0,0)
	kernel /xen.gz dom0_mem=1024M,max:1024M cpuinfo com1=115200,8n1 console=com1,tty loglvl=all guest_loglvl=all
	module /vmlinuz-3.18.21-17.el6.x86_64 ro root=UUID=4297c241-b06c-44d6-be69-c9c214140d55 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
title CentOS 6 (2.6.32-504.el6.x86_64)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=4297c241-b06c-44d6-be69-c9c214140d55 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-504.el6.x86_64.img

将安装完的内核以模块方式加载;引导xen.gz,dom0的内存分配1G:

[root@localhost boot]# cat  grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.18.21-17.el6.x86_64)
	root (hd0,0)
	kernel /xen.gz dom0_mem=1024M,max:1024M cpuinfo com1=115200,8n1 console=com1,tty loglvl=all guest_loglvl=all
	module /vmlinuz-3.18.21-17.el6.x86_64 ro root=UUID=4297c241-b06c-44d6-be69-c9c214140d55 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	module /initramfs-3.18.21-17.el6.x86_64.img
title CentOS 6 (2.6.32-504.el6.x86_64)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=4297c241-b06c-44d6-be69-c9c214140d55 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-504.el6.x86_64.img

4,重启系统并查看内核

[root@localhost boot]# uname -r
3.18.21-17.el6.x86_64

5,配置网卡为桥接模式

我们使用 Xen 虚拟机的时候一般都是用桥接(bridging)的方式把虚拟机(domU)直接暴露在网络上,就像网络上单独的一台服务器一样,这种方式简单好用,不用在 dom0 做任何的端口转发也不用任何 iptable 规则。不过除了 bridging 以外,Xen 还支持 routing 和 NAT 的方式配置虚拟机网络。

注:创建网桥之前必须关闭NetworkManager

    [root@localhost ~]# service NetworkManager stop
    [root@localhost ~]# brctl addbr br1   #添加一个桥
    [root@localhost ~]# brctl stp br1 on    #STP生成树协议,避免出现环路
    [root@localhost ~]# ifconfig eth1 0 up    #先卸掉eth0的地址
    [root@localhost ~]# brctl addif br1 eth1    #在br0上添加eth0
    [root@localhost ~]# ifconfig br1 192.168.1.107/16 up    #给br0配置地址
    [root@localhost ~]# route add default gw 192.168.1.1    #添加网关

以上方法只是进行临时配置,要永久保存需要修改配置文件:

[root@localhost network-scripts]# cp ifcfg-eth1 ifcfg-br1
[root@localhost network-scripts]# cat ifcfg-br1    #修改br1文件中type为Bridge,删掉MAc地址
DEVICE=br1
BOOTPROTO=dhcp
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE=Bridge
[root@localhost network-scripts]# cat ifcfg-eth1   #在eth1中添加BRIDGE=br1
DEVICE=eth1
BOOTPROTO=dhcp
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
BRIDGE=br1
[root@localhost network-scripts]# service network restart  #重启网络服务

配置完成如下所示:

网卡

6,xen管理工具介绍

xen的工具栈有:xm/xend, xl, xapi/xe,xm需要依赖xend服务,属于比较老的一种工具。XL在Xen 4.1中作为默认的管理工具,凡是使用xen的版本等于或高于4.1,强烈推荐使用XL这个工具。xl具有和xm几乎完全一致的使用方法,完全兼容。xl主要基于libxl这个库来实现的。XAPI即Xen管理API(The Xen management API),它是Citrix XenServer和XCP默认使用的工具栈。目前,其移植向libxenlight的工作正进行中。XAPI是目前功能最通用且功能最完备的Xen工具栈,CloudStack、OpenNebula和OpenStack等云计算解决方案都基于此API管理Xen虚拟机。

还可以使用libvirt来进行管理,libvirt是一个通用工具栈,能直接管理xen,kvm和quem,安装libvirt,安装后会自动创建一个virbr0桥,相当于vmware的hostonly,所以不会与外部主机通信是一个仅主机接口,libvirt既能使用图形化来管理虚拟主机,也能使用命令行进行虚拟主机的配置。

[root@localhost vm1]# yum install libvirt -y   #安装libvirt
[root@localhost vm1]# service libvirtd  start 
[root@localhost vm1]# virt-manager &  #以此使用图形化工具来创建
[root@localhost vm1]# virt-install -n "centos6.5" -r 512 --vcpus=2 -l http://222.24.51.147/cobbler/centos6.4 --disk path=/xen/vm1/centos.6.5.qcow --network bridge=br0 --force   #使用命令行进行配置   
        
virt-install 的选项:
# -n :虚拟机名称,配置文件位于/etc/xen下
# -r :分配的内存大小,至少需要256才能夠執行,单位为M
# --vcpus : 分配多少个cpu
# -f :后面接磁盘文件
# --nographics :不使用图形化安装;
# --vnc :使用VNC安装(需先安装virt-viewer)
# -p : 半虚拟化
# -s : 虚拟机的硬盘空间,单位为G
# -l :安装源
# -x :其它选项 

xen pv模式(半虚拟化)创建过程:

硬件 –> 安装Linux –> 安装xen –> 修改grub,配置其内核为xen,而不再使用原Linux的内核(Linux的内核和initramfs文件被当作xen的模块)–> 重新编译Linux内核,使得其能够运行于Dom0 ((即能运行在半虚拟化下的内核))–> 重启系统;

创建DomU: 在Dom0使用工具创建虚拟机(xm/xl)–>启动虚拟机–>安装操作系统;

[root@localhost ~]# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  1024     1     r-----     46.5


#name:每一个域的独有名称
#ID:每一个域的身份标识
#Mem:分配的内存空间大小
#Vcpus:虚拟CPU的颗数
#State:Xen虚拟机的状态
#Time:占用CPU真正运行的时长

[root@localhost ~]# xl info  #显示主机当前信息

xl常用子命令介绍:
xl list - 列出所有虚拟机
xl console - 连接到指定域的控制台,按 ctrl + ] 键切换出来
xl create -c /path/to/config - 根据配置文件创建虚拟机实例(默认的配置文件在/etc/xen下), -c 表示启动一个虚拟机,启动后会默认进入此虚拟机的控制台
xl shutdown - 属于正常关闭一个实例
xl destroy - 关闭一个实例 
xl migrate - 将某一域迁移到其它机器上
xl reboot - 重启某一个domain
xl restore - 还原某一个己建立的快照 
xl save - 为某一个域建立一个快照 
xl start - 启动一个xend管理的实例 
xl top - 实时监控虚拟机的运行状态 
xl help - 帮助

7,创建一个最小化的虚拟机

(1)创建磁盘

[root@localhost xen]# qemu-img create -f qcow2 -o size=12G,preallocation=metadata /images/xen/busybox1.qcow2
[root@localhost xen]# ls -lh   #创建的磁盘映像文件
total 2.1M
-rw-r--r--. 1 root root 13G Jan 19 12:09 busybox1.qcow2

[root@localhost xen]# qemu-img info  /images/xen/busybox1.qcow2 
image: /images/xen/busybox1.qcow2 
file format: qcow2
virtual size: 12G (12884901888 bytes)
disk size: 2.0M
cluster_size: 65536 

(2)格式化

[root@xen xen]# mke2fs -t ext4 busybox1.qcow2

(3)挂载

[root@xen xen]# mount -o loop /images/xen/busybox1.qcow2 /mnt/

(4)安装busybox

[root@localhost ~]# wget -c https://busybox.net/downloads/busybox-1.23.2.tar.bz2    #下载busybox
[root@localhost ~]# tar xf busybox-1.23.2.tar.bz2 
[root@localhost ~]# cd busybox-1.23.2
[root@localhost busybox-1.23.2]# yum -y groupinstall "Development Tools" "Server Platform Development"
[root@localhost busybox-1.23.2]# yum -y install glibc-static  #安装glibc-static 将busybox编译成静态文件
[root@localhost busybox-1.23.2]# make menuconfig  
1)选择busybox settings
2)选择build options
3)勾选第一项,保存退出
[root@localhost busybox-1.23.2]# make -j    #编译
[root@localhost busybox-1.23.2]#make install
[root@localhost busybox-1.23.2]# cp -a _install/* /mnt/   #复制install到mnt目录,并创建linux必须的一些目录
[root@localhost busybox-1.23.2]# cd /mnt/
[root@xen mnt]# mkdir proc sys dev etc var boot home

(5)测试是否可以访问目标系统

[root@xen /]# chroot /mnt/ /bin/sh
/ # ls
bin         dev         home        lost+found  sbin        usr
boot        etc         linuxrc     proc        sys         var
/ # 

(6)设置xen启动配置文件

[root@localhost ~]# cp /boot/vmlinuz-2.6.32-504.el6.x86_64 /tmp/vmlinuz     #创建内核文件
[root@localhost ~]# cp  /boot/initramfs-2.6.32-504.el6.x86_64.img /tmp/initramfs
[root@localhost ~]# cd /etc/xen/
[root@localhost xen]# cat busybox | grep -v '#'| tr -d ''   #编辑配置文件如下所示

name = "busybox1"


kernel = "/tmp/vmlinuz"

ramdisk = "/tmp/initramfs"

extra = "selinux=0 init=/bin/sh"

memory = 512


vcpus = 2


disk = [ 'file:/images/xen/busybox1.qcow2,xvda,w' ]

root = "/dev/xvda ro"

注:xl的配置文件
	kernel:内核    ----定义DomU的内核通常放在Dom0上
	ramdisk: initramfs或initrd
	name: 域名称
	memory: 内存大小
	disk: 磁盘设备文件列表,格式disk=["disk1", "disk2",], 每个disk都由三个参数进行定义:“backend-dev”,“frontend-dev”,“mode”
		backend-dev: 有两种类型,物理设备,虚拟磁盘映像文件,格式为分别为phy:device和file:/path/to/image_file; 
		front-dev: 定义其在DomU中设备类型;虚拟磁盘映像文件对应的设备文件名称通常为xvd[a-z]
		mode: 访问权限模型,r, w
	vcpus: 虚拟CPU的个数;
	root: 根文件系统所在的设备;
	extra: 传递给内核的额外参数;selinux=0
	on_reboot: 执行xm reboot命令时的操作,有destroy和restart; 
	on_crash: 有destroy, restart, preserve(保存崩溃时的信息以用于调试)
	vif :vif = ['ip="172.16.100.11", bridge=br0']
		type: 设备类型,默认为netfront
		mac: 指定mac地址;
		bridge: 指定桥接到的物理设备
		ip: ip地址;
		script: 配置此接口的脚本文件
		vifname: 后端设备名称
	bootloader: 引导器文件的路径,一般指的PyGrub的路径;

(7)创建虚拟机

[root@localhost xen]# xl create -c  busybox

<a href="http://www.tianfeiyu.com/wp-content/uploads/2016/01/busybox1.jpg"><img src="http://www.tianfeiyu.com/wp-content/uploads/2016/01/busybox1.jpg" alt="busybox" width="1125" height="942" class="alignnone size-full wp-image-1527" /></a>

使用control+‘]’ 退出


[root@localhost xen]# xl list
Name                                        ID   Mem VCPUs	State	Time(s)
Domain-0                                     0  1023     1     r-----     167.4
busybox1                                    15   512     2     -b----       3.4

xen虚拟状态:
	r: 运行状态
	b: 阻塞
	p: 暂停
	s: 停止
	c: 崩溃  正在崩溃中,或崩溃重启中
	d: dying, 正在关闭的过程中

[root@localhost net]# xl destroy busybox1  #关闭虚拟机

(8)添加网卡

[root@localhost ~]# vim  /etc/xen/busybox  
vif=['bridge=br1']    #添加此行

[root@localhost ~]# mkdir /mnt/lib/modules
[root@localhost ~]# cd  /lib/modules/2.6.32-504.el6.x86_64/kernel/drivers/net/   #添加网卡驱动
[root@xen net]# cp xen-netfront.ko 8139too.ko mii.ko /mnt/lib/modules/

[root@localhost xen]# xl create -c  busybox 
。。。。。。。
    / # insmod /lib/modules/xen-netfront.ko    #载入模块
    Initialising Xen virtual ethernet driver.
    / # ifconfig -a
    eth0      Link encap:Ethernet  HWaddr 00:16:3E:56:DA:00  
              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)
              Interrupt:18 

    lo        Link encap:Local Loopback  
              LOOPBACK  MTU:65536  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:0 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

此示例只是便于演示的,实际中并不是安装这样一个小的Linux,而是安装一个完整的系统,后面会进一步进行说明!


DevOps-田飞雨 》》转载请注明源地址
喜欢 (2)or分享 (0)
发表我的评论
取消评论
*

表情 贴图 加粗 链接 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址