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
安装后会在/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,而是安装一个完整的系统,后面会进一步进行说明!