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