Xen虚拟化

Xen虚拟化基础

Xen虚拟化类型

  hypervisor

Xen组件

Xen hypervisor

    Colletion CPU、Memory、Interrupter

Domain0  ---> Dom0

    Privilieged Domain

    特权区 I/O资源分配

        网络设备

            net-front、net-backend

        块设备

            block-front、block-backend

    Linux Kernel

        2.6.37  开始支持运行Dom0

        3.0 对关键特性进行了优化

    提供管理DomU工具栈

        用于实现对虚拟机进行添加、启动、快照、停止、删除等操作

DomainU  ---> DomU

    Unprivilieged Domain

        PV

            半虚拟化

        HVM

            完全虚拟化

            只有硬件支持辅助虚拟化,Xen才能使用完全虚拟化,否则,只能使用半虚拟化

        PV on HVM

            CPU完全虚拟化,I/O半虚拟化

Xen的PV技术

不依赖于CPU的HVM特性,但要求GuestOS的内核作出修改以知道自己运行于PV环境

运行于DomU中的OS

    Linux 2.6.24+

    NetBSD 

    FreeBSD

    OpenSolaris

Xen的HVM技术

依赖于Intel VT-x、AMD-V

依赖于Qemu来模拟I/O设备

运行于DomU中的OS

    几乎所有支持x86平台的OS

Xen的PV on HVM技术

CPU完全虚拟化

I/O半虚拟化

运行于DomU中的OS:支持PV模式下虚拟I/O设备的OS

XenStore

  为各Domain提供的共享信息存储空间

  层级结构的名称空间

  位于DOM0中

CentOS对Xen的支持

  RHEL 5.7- 默认的虚拟化技术为Xen

    kernel version 2.6.18

    kernel+xen

  RHEL 6+ 仅支持kvm

    Dom0 不支持

    DomU 支持

在不支持Xen的CentOS版本中使用Xen

  手动编译安装

    1. 编译3.0以上版本的内核,启用对Dom0的支持

    2. 编译安装Xen程序

  使用开源项目,制作好相关程序包的项目

    xen4centos

    xen made easy

安装使用Xen

指定EPEL或阿里云的yum源

1 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

CentOS7安装下载xen

# yum installation

    yum install -y centos-release-xen

    yum install -y xen

    # 安装perl工具包(Xen工具需要使用Perl工具包)

    yum install -y perl

# 更新内核

    yum install -y kernel

# Xen hypervisor内核文件

    ls /boot/

        xen.gz

        xen-4.6.6-10.el7.gz

    cat /etc/grub.d/08_linux_xen

# grub文件

    cat /etc/default/grub

        GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=1024M,max:1024M cpuinfo com1=115200,8n1 console=com1,tty loglvl=all guest_loglvl=all"

        GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT="console=hvc0 earlyprintk=xen nomodeset"

# 自动修改/boot/grub/grub.conf配置文件

    /usr/bin/grub-bootxen.sh

# CentOS6及一下版本,则需要修改/etc/grub.conf,配置参数参考如下

    http://xenbits.xen.org/docs/unstable/misc/xen-command-line.html

# 重启系统,载入Xen hypervisor内核

    reboot

CenOS6修改grub.conf

Xen的工具栈

xm/xend 在Xen hypervisor的DOM0中启动xend的服务

    xm 命令行管理工具,有诸多子命令

        create、destory、stop、pause ... 

xl 基于libxenlight提供轻量级的命令行工具栈

    list                List information about all/some domains

        xen虚拟机状态

            r   运行

            b   阻塞

            p   暂停

            s   停止

            c   崩溃

            d   dying,正在关闭的过程中

xe/xapi 提供了对xen管理的API,因此多用于cloud环境

    Xen Server

    XCP

virsh/libvirt

    物理机开启libvirtd服务

    远程通过virsh管理虚拟机

Xen半虚拟化模式

将一下内容定义在DomU配置文件中

  1. kernel

    内核文件安放位置

  2. initrd或initramfs

  3. DomU内核模块

  4. 根文件系统

  5. swap设备

  PS:  xm于xl启动DomU使用的配置文件略有不同

xl帮助

  man xl.cfg 启动某个虚拟机配置

  man xl.conf 通用配置

xl常用选项

shutdown    关机

reboot      重启

pci-list    显示pass-through的PCI设备

pause       暂停

unpause     解除暂停

console     连接到控制台

vncviwer    使用VNC连接至虚拟机

save        将当前DomU内存中的数据转存至指定的磁盘文件中

    xl save VM_NAME /tmp/. /etc/xen/VM_CONF 

restore     从指定的磁盘文件中恢复DomU的内存数据

    xl restore /etc/xen/VM_CONF /tmp/<filename>

migrate     虚拟机迁移

dump-core   将当前Dom0的核心模块转储

cd-insert   插入一块光盘

cd-eject    弹出一块光盘

mem-max     虚拟机的最大内存

mem-set     设置虚拟机内存

button-press    关机电源按钮

vcpu-list   显示指定Dom上运行的CPU个数及相关信息

vcpu-pin   固定某个CPU在物理核心上

    xl [-vfN] vcpu-pin <Domain> <VCPU|all> <Hard affinity|-|all> <Soft affinity|-|all>

vcpu-set    设置一个Dom上活跃CPU的个数,只能少于conf文件中定义的CPU个数

info    查看虚拟机的详细

domid   根据Dom名称获取DomID

domname 根据DomID获取Dom名称

rename  修改指定域名称

dmegs   查看虚拟机内核运行相关信息

top     显示各虚拟机的资源利用率信息

network-list 显示指定Dom现有的网络接口

network-attach 网络接口热插入

network-detach 网络接口热拔出

block-list 显示指定Dom现有的磁盘设备

block-attach 磁盘设备热插入

    xl block-attach VM_NAME "/images/xen/xxx.img,qcow2,xvdb,rw"

block-detach 磁盘设备热拔出

uptime  显示指定Dom的运行时长

xl常用指令

name 指定域名称

builder 指定虚拟机类型,generic半虚拟化,HVM完全虚拟化

vcpus  虚拟CPU个数

maxvcpus  最大虚拟CPU个数

cpus  指定虚拟CPU运行在哪些物理核心列表上

cpu_weight CPU权重

memory  指定虚拟机内存大小

maxmem  指定最大内存大小

on_poweroff 指明关机时,DOM0采取的action

    destroy
        destroy the domain

    restart
        destroy the domain and immediately create a new domain with the same configuration

    rename-restart
        rename the domain which terminated, and then immediately create a new domain with the same configuration as the original

    preserve
        keep the domain.  It can be examined, and later destroyed with `xl destroy`.

    coredump-destroy
        write a "coredump" of the domain to /var/lib/xen/dump/NAME and then destroy the domain.

    coredump-restart
        write a "coredump" of the domain to /var/lib/xen/dump/NAME and then restart the domain.

on_reboot  重启时,执行操作,采取的action

on_crash  虚拟机意外崩溃时,采取的action

uuid  指定一个域的UUID

disk=[ "DISK_SPEC_STRING", "DISK_SPEC_STRING", ...]  指明磁盘设备

    http://xenbits.xen.org/docs/unstable/man/xl-disk-configuration.5.html

    [<target>, [<format>, [<vdev>, [<access>]]]],

        target 表示磁盘映像文件或设备文件路径,/images/xen/linux.img, /dev/myvg/linux

        format 表示磁盘格式,如果是映像文件,有多种格式raw,qcow2 ...

        vdev 指明虚拟机中被识别的磁盘名称,/dev/hd[x]、sd[x]、xvd[x]

        access 指明磁盘访问权限

    使用qemu-img管理磁盘映像

        create [-q] [-f fmt] [-o options] filename [size]

        qemu-img create 0f raw -o size=2G /images/xen/busybox.img

    使用mke2fs格式化磁盘设备

        mke2fs -t ext2 busybox.img

        # 无分区表

    查看磁盘大小

        ll -h 

        du -sh 

vif=[ "NET_SPEC_STRING", "NET_SPEC_STRING", ...]  指明网络设备

    http://xenbits.xen.org/docs/unstable/man/xl-network-configuration.5.html

    https://wiki.xenproject.org/wiki/Network_Configuration_Examples_(Xen_4.1%2B)

    vif = [ '<vifspec>', '<vifspec>', ... ]

        <vifspec> = [<key>=<value>|<flag>,]

        mac  指定虚拟机的MAC地址,以“00:16:3e”

        bridge  指定此设备网络接口在Dom0中被关联至哪个桥设备上

        model  指定虚拟机模拟成哪种网络接口

            rt18139

            e1000

        vifname  指明接口名称,在Dom0中显示的名称

        script  创建接口的辅助脚本

        ip  直接指定固定IP地址,会注入到DomU中

        rate  指定网卡传输速率

            RATE is in bytes and can accept suffixes:

            GB, MB, KB, B for bytes.

            Gb, Mb, Kb, b for bits.

vfb=[ "VFB_SPEC_STRING", "VFB_SPEC_STRING", ...]  指明虚拟显卡接口

    # 本地虚拟桌面

        # 配合虚拟机的默认启动级别

        vfb = [ "sdl=1" ]

    # vncviwer本地

        # 本机需要安装tigervnc

        vfb = [ "vnc=1" ]

        vncviwer :5900

    # vncviwer远程

        # 本机需要安装tigervnc

        vfb = [ "vnc=1,vnclisten=0.0.0.0,vncpasswd=123456" ]

        # 使用桌面号连接,5900桌面号0

pci=[ "PCI_SPEC_STRING", "PCI_SPEC_STRING", ... ]  指明PCI设备

xl半虚拟化专用指令

kernel  内核文件路径,为Dom0中的路径

ramdisk  为kernel指定内核提供的ramdisk文件路径

root  指明根文件系统

extra  额外传递给内核引导时使用的参数

bootloader  如果DomU使用自己的kernel及ramdisk,则需要使用Dom0中的应用程序,实现启动器功能,不能和kernel、ramdisk参数同时使用

安装半虚拟化VM

基于Dom0安装一个虚拟机

# pv类型

# 该虚拟使用外部(Dom0)的引导启动文件和内核文件

1. 准备环境

    yum -y groupinstall "Development Tools" "Server Platform Development" glibc-static ncurses-devel

2. 准备busybox文件

    wget http://busybox.net/downloads/busybox-1.28.3.tar.bz2

3. 为busybox准备磁盘映像文件

    qemu-img create -f raw -o size=2G /images/xen/busybox.img

    mke2fs -t ext2 busybox.img

    mount /images/xen/busybox.img /mnt/

4.编译安装busybox,并提供一个根文件系统,创建相应文件

    tar xf busybox-1.28.3.tar.bz2

    cd busybox-1.28.3/

    make menuconfig

        选择Settings

        在Build Options中选择Build static binary (no share libs)

        # 这样所有依赖的库文件都会打包好编译进内核

    make 

    make install

    # 拷贝编译安装的文件

    cp -a _install/* /mnt/

    mkdir /mnt/{proc,dev,sys,etc,var,boot,home}

5. 切换根目录到/mnt下,使用busybox系统

    chroot /mnt /bin/sh

    # 没问题后,准备在DomU运行此系统

    umount /mnt

    # 我们需要使用系统自带文件引导启动映像文件

    ln -sv vmlinuz-3.10.0-514.el7.x86_64 vmlinuz

    ln -sv initramfs-3.10.0-514.el7.x86_64.img initramfs.img

6. 创建桥接设备

    https://wiki.xenproject.org/wiki/Network_Configuration_Examples_(Xen_4.1%2B)

    cd /etc/sysconfig/network-scripts/

    cp ifcfg-eth0 ifcfg-xenbr0

    vim ifcfg-eth0

        # 删除IPADDR、NETMASK、GATEWAY、DNS

        BRIDGE=“xenbr0”

    vim ifcfg-xenbr0

        # 删除mac地址,boot类型为static

        TYPE=Bridge

    service network restart 

    chkconfig NetworkManager off

    # CentOS6使用修改配置文件的方式创建桥设备会死机

    # 可能是bridge-utils和CentOS6内核有冲突,可以尝试升级bridge-utils

    # 或者使用brctl命令的方式创建桥设备

    ifconfig eth0 0

    brctl  addbr xenbr0

    brctl addif xenbr0 eth0

    brctl show

    ipconfig xenbr0 x.x.x.x/x

    # 下面尝试升级bridge-utils

        下载并安装新的 bridge-utils-1.5-9.el7.x86_64.rpm

        rpm -q bridge-utils

        # 再次尝试创建桥设备

        # 发现还是不行,内核运行还是崩溃了

    # 下面方案尝试使用旧版内核,使用阿里云yum源下载指定的kernel,以及对应的固件驱动

    # 内核一定要下载,不要更新,更新一但使得系统不能运行,此虚拟机将不能再使用

    yum install -y kernel-3.10.68 kernel-firmware-3.10.68

    /usr/bin/grub-bootxen.sh

    # 此方法没问题,内核不会运行时崩溃

7. 使用xl文件创建一台Xen虚拟机

    cp /etc/xen/xlexample.pvlinux busybox

    vim /etc/xen/busybox

        name = "busybox-001"

        root = "/dev/xvda ro"

        kernel = "/boot/vmlinuz"

        ramdisk = "/boot/initramfs.img"

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

        memory = 256

        #vif = [ '' ]

        disk = [ '/images/xen/busybox.img,raw,xvda,rw' ]

        vif = [ 'bridge=xenbr0' ]

    xl help create 

    xl -v create busybox -n 

    xl -v create /etc/xen/busybox

    xl list
        Name                                        ID   Mem VCPUs    State    Time(s)
        Domain-0                                     0  1024     2     r-----     970.2
        busybox-001                                  5   256     2     r-----       3.8

    xl create /etc/xen/busybox -c 

8. 由于我们使用了网卡,必须确保DomU上有相应的网卡驱动

    cd /lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/net

    mount -o loop /images/xen/busybox.img /mnt/

    mkdir -pv /mnt/lib/modules/

    cp xen-netfront.ko /mnt/lib/modules/

    sync 

    umount /mnt 

9. 连接至虚拟机的控制台

    xl console busybox-001 

    # 手动装载网卡驱动

        insmod /lib/modules/xen-netfront.ko

    ifconfig

    # 可以看到虚拟机的前端网卡 

10. 返回shell

    Ctrl + ]

    ifconfig vif3.0

    # 可以看到虚拟机的后端网卡,3.0和DomU的ID有关系,表示ID为3的虚拟机上的第0块网卡

    brctl show

    # eth0和vif3.0后桥接在虚拟网桥上

11. 销毁虚拟机

    xl destroy busybox-001

使用Dom0中的磁盘分区为DomU提供存储空间

# 性能会有所提高,但是不能进行虚拟机迁移

1. 准一个磁盘分区

    fdisk -l 

    fdisk /dev/sda

    # 在物理机上

    # t 指定分区类型

    # 指定为8e LVM类型

2. 刷新分区表信息

    kpartx -a /dev/sda 

3. 创建逻辑卷

    pvcreate /dev/sdb1

    vgcreate vg /dev/sdb1

    lcreate -L 2G -n busybox vg 

4. 格式化分区

    mke2fs -t ext2 /dev/vg/busybox

5. 挂载分区

    mount /dev/vg/busybox /mnt

6. 同样复制busybox文件到分区中

    cd busybox-1.28.3/

    cp -a _install/* /mnt/

    # 创建目录

    cd /mnt 

    mkdir /mnt/{proc,dev,sys,etc,var,boot,home}

7. 编辑xl文件

    # 详细查看第一个实例

    vim busybox

        name = "busybox-001"

        kernel = "/boot/vmlinuz"

        ramdisk = "/boot/initramfs.img"

        # 指定yum源上的kickstart引导启动文件

        # yum源和ks文件准备这里就不缀述了

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

        memory = 512

        vcpus = 2

        vir = [ "bridge=xenbr0" ]

        disk = [ "/dev/vg/busybox,raw,xvda,rw" ]

        root = "/dev/xvda ro"

8. 创建虚拟机

    xl create busybox

    xl list 

    xl console busybox-001

虚拟机安装实例3

# pv类型    

# 安装一个完整的虚拟机,使用DomU自带内核模块、引导文件等

1. 制作磁盘映像文件

    qemu-img create -f raw -o size=5G,preallocation=metadata /images/xen/busybox3.img 

2. 设置并控制本地回环设备

    回环设备( 'loopback device')
    
        允许用户以一个普通磁盘文件虚拟一个块设备。
        
        设想一个磁盘设备,对它的所有读写操作都将被重定向到读写一个名为 disk-image 的普通文件而非操作实际磁盘或分区的轨道和扇区。
        
        (当然,disk-image 必须存在于一个实际的磁盘上,而这个磁盘必须比虚拟的磁盘容量更大。)回环设备允许你这样使用一个普通文件

        回环设备的使用与其它任何块设备相同。特别是,你可以在这个设备上创建文件系统并像普通的磁盘一样将它挂载在系统中

    # qcow2的磁盘映像文件格式不能使用回环设备创建分区,虚拟机中是不能识别的

    显示已经使用的回环设备
    
        losetup -a

    显示空闲的第一个回环设备

        losetup -f

    关联磁盘映像文件和换回设备关系

        losetup /dev/loop0 /images/xen/busybox3.img

3. 分区格式化

    fdisk -l /dev/loop0

    # 创建2个分区

        ... 

    kpartx -av /dev/loop0

    # partprobe /dev/loop0  和上面命令作用相同

    mke2fs -t ext2 /dev/mapper/loop0p1

    mke2fs -t ext2 /dev/mapper/loop0p2

4. 挂载分区

    mkdir /mnt/{boot,sysroot}

    mount  /dev/mapper/loop0p1 /mnt/boot

    mount  /dev/mapper/loop0p1 /mnt/sysroot

    mount

    df -h 

5. 拷贝引导启动文件

    cp /boot/vmlinuz-3.10.0-514.el7.x86_64 /mnt/boot/vmlinuz 

    cp cp /boot//initramfs-3.10.0-514.el7.x86_64.img /mnt/boot/initramfs.img 

6. 安装引导配置文件

    grub-install --root-directory=/mnt /dev/loop0

    vim /mnt/root/grub/grub.conf 

        default = 0
        timeout = 5 
        titile BusyBox(kernel-3.10.0)
            root (hd0,0)
            kernel /vmlinuz root=/dev/xvda1 ro selinux=0 init=/bin/sh 
            initrd /initramfs.img

7. 拷贝busybox安装好的文件

    # 如果安装参考上一个实例

    cp -a busybox-1.28.3/_install/* /mnt/sysroot

    mkdir -pv /mnt/sysroot/{proc,dev,sys,etc,var,boot,home}

8. 拷贝网卡前端驱动

    cp /lib/modules/3.10.0-514.el7.x86_64/kernel/drivers/net/xen-netfront.ko /mnt/sysroot/lib/modules

    sync

9. 收尾工作

    umount /mnt/boot

    umount /mnt/sysroot

    losetup -d /dev/loop0

    # 删除分区信息

        kpartx -d /dev/loop0

    losetup -d /dev/loop0

    losetup -f

10. 准备xl文件,用于创建虚拟机

    # 具体如果创建查看上一个实例

    vim busybox3

        #kernel
        #extra
        #root

        disk = [ '/images/xen/busybox3.img,raw,xvda,rw' ] 

        # 由于虚拟磁盘不能装载MBR分区信息,bootloader就必须再xen中提供
        bootloader='/usr/bin/pygrub'
        # grub第一阶段由它来引导,后续引导会自动读取/images/xen/busybox3.img,grub第二阶段正常进行

11. 创建虚拟机

    xl create busybox-003 -c

    # 至此引导没有问题,如果终端不能显示,则需要使用console指定虚拟终端

使用yum源安装虚拟机

# 安装一个CentOS6虚拟机

# 1.准备启动引导和内核文件

    # 自行挂载CentOS6的光盘

        mount /dev/cdrom /media/cdrom

    cd /media/cdrom/isolinux

    mkdir -pv /images/kernel

    cp initrd.img vmlinuz /images/kernel/

# 2.准备磁盘映像文件

    qemu-img create -f raw -o size=20G,preallocation=metadata /images/xen/centos6.img

# 3.拷贝xl文件

    mkdir -pv /images/xen/centos

    cp /etc/xen/xlexample.pvlinux /images/xen/centos/

# 4.编辑CentOS xl文件

    vim /iamges/xen/centos/xlexample.pvlinux

        name = "centos6-001"

        kernel = "/images/kernel/vmlinuz"

        ramdisk = "/images/kernel/initrd.img"

        # 指定yum源上的kickstart引导启动文件

        # yum源和ks文件准备这里就不缀述了

        extra = "ks=http://yum_server_ip/cfg_path/filename.cfg"

        memory = 512

        vcpus = 2

        vir = [ "bridge=xenbr0" ]

        disk = [ "/images/xen/centos6.img,qcow2,xvda,rw" ]

        on_reboot = "shutdown"

        #root

    mv /iamges/xen/centos/xlexample.pvlinux /iamges/xen/centos/CentOS6

    # 查看编辑文件是否正确

        grep -v "^#" xlexample.pvlinux | grep -v "^$"

# 5.xl引导创建虚拟机

    xl create /iamges/xen/centos/CentOS6 -c

# 6.收尾工作,修改配置文件

    vim /iamges/xen/centos/CentOS6

        #extra
        #kernel
        #ramdisk

        bootloader = "pygrub"

    # 第一次引导安装完成后,虚拟机自己就用了bootloader文件,可以自行引导启动

# 7. 虚拟机模板

    # 可以将当前虚拟机的映像文件当做模板文件,并配置相关的xl文

    # 但并不能直接使用,我们需要将虚拟mac地址、IP地址、SSH-id等产生冲突的文件拆除

    # 可以使用专门为云主机做磁盘映像文件初始化

    yum info cloud-init

        Available Packages
        Name        : cloud-init
        Arch        : x86_64
        Version     : 0.7.9
        Release     : 9.el7.centos.6
        Size        : 628 k
        Repo        : updates/7/x86_64
        Summary     : Cloud instance init scripts
        URL         : http://launchpad.net/cloud-init
        License     : GPLv3
        Description : Cloud-init is a set of init scripts for cloud instances.  Cloud instances
                    : need special scripts to run during initialization to retrieve and install
                    : ssh keys and to let the user run various scripts.

libvirt管理工具

实现xen虚拟机管理

# 服务包安装

    yum install -y libvirt libvirt-daemon-xen

# 启动服务

    service libvirtd start 

# 工具包安装

    # 图形控制台

        yum install -y virt-manager python-virtinst

        # 默认使用virt-manager创建的磁盘映像文件路径

            ls /var/lib/libvirt/images/

    # 命令行工具后续博客将更新使用方法

        yum install -y libvirt-client

        # 命令

            virsh 

            virsh-install 
原文地址:https://www.cnblogs.com/cq146637/p/8931844.html