Linux操作系统原理 虚拟化技术基础原理 网桥创建 ================================================================================================================================================ 1、CPU 等待队列 运行队列 重新均衡 数据在CPU上的缓存 {进程绑定,提高缓存命中率} 通过总线和内存交互,取得运行指令。 内存频率 2、程序局部性 空间局部性 时间局部性 内存和CPU之间的频率不协调,引入缓存。 3、CPU能够使用的存储空间 寄存器 一级缓存 二级缓存 三级缓存(各CPU核心共享) 内存 硬盘(固态、机械式硬盘) NUMA 非一致性内存访问。每一个核心都有自己的缓存。 4、I/O设备 组成: 设备控制器:集成在主板上的一块芯片或一组芯片 设备本身 驱动程序:位于内核 控制器都有少量的用于通信的寄存器。每个寄存去表现为一个I/O端口。所有寄存器组合成为设备的IO地址空间。 IO端口用16位二进制数表示,每次开机时,控制器都向总线注册I/O端口。 5、操作系统 CPU被抽象为时间片(time slice) 进程使用时间片 CPU读取数据是通过程序的指令读去内存中读取数据。CPU字长的寻址的地址范围,32bit字长的CPU支持的最大寻址为4G。 虚拟地址空间 进程运行的资源集: cpu时间 内存空间:地址空间(抽象、虚拟地址空间) I/O设备:文件。每个文件都有文件描述符 ================================================================================================================================================ 虚拟化技术基础原理 1、CPU虚拟化 多一个计算机抽象为多个相互隔离的独立的计算平台。虚拟化技术能够节省计算资源,平衡计算资源。 CPU的虚拟化:时间片的虚拟化。 使用软件的 方式模拟出虚拟化的CPU。 虚拟机用户空间的指令需要在CPU上运行的时候,需要先将指令传送给Host宿主机,然后由宿主机在CPU上运行指令,单此种方式非常低效且消耗时间。 BT技术的引入(二进制翻译),能够让虚拟机对特权指定的执行,边转换边执行,从而提高的效率。 完全虚拟化 BT:二进制翻译(软件) HVM:引荐辅助虚拟化 半虚拟化(para-virtulization) 属主机内核明确知道运行的虚拟化环境中,特权指令向宿主机发起调用。 指令被 hyper call 代为向宿主机请求调用。 2、Memory虚拟化 Intel:EPT,Extended Page Table AMD:NTP,Nested Page Table 3、I/O虚拟化 4、虚拟化实现方式 1、xen、vmware ESX/ESXi 硬件之上直接安装虚拟化软件,然后创建虚拟机。 2、KVM、vmware workstion、virtualbox 硬件之上安装操作系统,操作系统上安装虚拟化软件。由虚拟软件创建虚拟机。 5、虚拟化技术分类 1、模拟 著名的模拟器:PearPC、Bochs、QEMU 2、完全虚拟化:(native virtulization) 加速方式:BT、HVM 产品:Vmware Workstation、VMware Server、Parallels Dsktop、LVM、XEN 3、半虚拟化 4、OS级别虚拟化(直接运行于物理硬件,将用户空间切割为多份) OpenVZ、lxc、Solaris Containers、FewwBSD jajls、Docker 6、网络虚拟化 桥接模式 物理机的物理网卡直连到网络中的交换机,虚拟机自身也有虚拟的网卡设备。物理网卡被物理机所使用,当物理网卡接收到数据帧时,这 些数据帧会被发给物理机。桥接模式下,可以理解为将物理网卡虚拟成为一个交换机来使用,而物理机上又虚拟了一个网卡设备作为物理 机的网卡,每个虚拟机也有虚拟网卡。 总结:在桥接模式下,物理机的网卡被模拟成为一个交换机,而物理机使用的网卡也是一个虚拟网卡,此"交换机"接收到数据后,将不同 目标的数据发给不同的主机。 仅主机模式 各虚拟主机能够通信,各虚拟主机和物理机也能够通信。但不能和外部网络通信。 虚拟化工具虚拟出一个虚拟网卡给物理机使用。各虚拟机又连接在一个软件虚拟出来的交换机上,同时将给虚拟机使用的虚拟网卡也连接 到此虚拟交换机上。 nat模型 使用nat服务器 ====================================================================================================== 网桥创建 1、安装工具包 yum install bridge-utils 2、编辑网桥配置文件 cp ifcfg-eth0 ifcfg-br0 # br0设备负责教收所有发往本机的数据 vim ifcfg-br0 NM_CONTYROLLED="no" BOOTPROTO="none" DEVICE="br0" TYPE="Bridge" ONBOOT="yes" IPADDR=172.18.26.6 PREFIX=16 GATEWAY=172.18.0.1 DNS1=172.18.0.1 DNS2=114.114.114.114 DOMAIN=xuejinwei.com 3、编辑网卡配置文件 vim ifcfg-eth0 IPV6INIT="no" IPV6_AUTOCONF="no" BOOTPROTO="none" DEVICE="eth0" ONBOOT="yes" NM_CONTROLLED="no" BRIDGE=br0 # 定义网卡桥接到那个网桥设备上 4、查看网桥设备 brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29a129ea no eth0 Note:"STP enabled" 是否支持生成树协议,避免在物理网络中出现环路 5、开启生成树协议支持 brctl stp br0 on 6、命令行方式配置网桥 brctl addbr br0 brctl stp br0 on ifconfig eth0 0 up {ip link set br0 up} ifconfig br 172.18.26.5/16 up brctl addif br0 eth0 route add default gw 172.18.0.1 ================================================================================================================================================ (马哥笔记) 虚拟化技术基础: cpu虚拟化: 模拟:emulation 虚拟:virtulization 完全虚拟化(full-virtulization) BT: 二进制翻译 (软件) HVM:硬件辅助的虚拟化 (硬件) 半虚拟化(para-virtulization) Memory: 进程:线性地址空间 内核:物理地址空间 MMU Virtulization Intel: EPT, Extended Page Table AMD: NTP, Nested Page Table TLB virtulization tagged TLB I/O: 外存: 硬盘、光盘、U盘 网络设备: 网卡 显示设备: VGA: frame buffer机制 键盘鼠标: ps/2, usb I/O虚拟化的方式: 模拟: 完全使用软件来模拟真实硬件 半虚拟化化: IO-through: IO透传 Intel: VT-d 基于北桥的硬件辅助的虚拟化技术; 两种实现方式: Type-I: xen, vmware ESX/ESXi Type-II: kvm, vmware workstation, virtualbox Intel硬件辅助的虚拟化: CPU: vt-x, EPT, tagged-TLB IO/CPU: vt-d, IOV, VMDq 第一类:跟处理器相关:vt-x 第二类:跟芯片相关:vt-d 第三类:跟IO相关:VMDq和SR-IOV QEMU, virtio 虚拟化技术的分类: 模拟:著名的模拟器,PearPC, Bochs, QEMU 完全虚拟化:也称为native virtulization 两种加速方式: BT HVM VMware Workstation, VMware Server, Parallels Desktop, KVM, Xen(HVM) 半虚拟化:para-virtualization xen, uml(user-mode linux) OS级别的虚拟化: OpenVZ, lxc Solaris Containers FreeBSD jails 库虚拟化: wine 应用程序虚拟化: jvm 虚拟化网络: nat mode bridge mode routed mode isolation mode 使用brctl的配置的过程示例: # brctl addbr br0 # brctl stp br0 on # ifconfig eth0 0 up # brctl addif br0 eth0 # ifconfig br0 IP/NETMASK up # route add default gw GW 补充资料:TUN与TAP 在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。 TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。 操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。 回顾: 虚拟化技术的分类: (1) 模拟:Emulation; Qemu, PearPC, Bochs (2) 完全虚拟化:Full Virtualization, Native Virtualization HVM VMware Workstation, VirtualBox, VMWare Server, Parallels Desktop, KVM, XEN (3) 半虚拟化:ParaVirtualization GuestOS: 知晓自己是运行Virtualization Hypercall 解决安装:Xen, UML(User-Mode Linux) (4) OS级别的虚拟化: 将用户空间分隔为多个,彼此间互相隔离; 容器级虚拟化 OpenVZ, LXC(LinuX Container), libcontainer, Virtuozzo, Linux V Servers (5) 库级别虚拟化 WINE Type-I, Type-II IaaS: Infrastructure PaaS: Platfrom Xen: 剑桥大学,开源VMM; Xen组成部分: (1) Xen Hypervisor 分配CPU、Memory、Interrupt (2) Dom0 特权域,I/O分配 网络设备 net-front(GuestOS), net-backend 块设备 block-front(GuestOS), block-backend Linux Kernel: 2.6.37:开始支持运行Dom0 3.0:对关键特性进行了优化 提供管理DomU工具栈 用于实现对虚拟进行添加、启动、快照、停止、删除等操作; (3) DomU 非特权域,根据其虚拟化方式实现,有多种类型 PV HVM PV on HVM Xen的PV技术: 不依赖于CPU的HVM特性,但要求GuestOS的内核作出修改以知晓自己运行于PV环境; 运行于DomU中的OS:Linux(2.6.24+), NetBSD, FreeBSD, OpenSolaris Xen的HVM技术: 依赖于Intel VT或AMD AMD-V,还要依赖于Qemu来模拟IO设备; 运行于DomU中的OS:几乎所有支持此X86平台的; PV on HVM: CPU为HVM模式运行 IO设备为PV模式运行 运行于DomU中的OS: 只要OS能驱动PV接口类型的IO设备; net-front, blk-front Xen的工具栈: xm/xend:在Xen Hypervisor的Dom0中要启动xend服务 xm:命令行管理工具,有诸多子命令; create, destroy, stop, pause... xl: 基于libxenlight提供的轻量级的命令行工具栈; xe/xapi:提供了对xen管理的api,因此多用于cloud环境;Xen Server, XCP virsh/libvirt: XenStore: 为各Domain提供的共享信息存储空间;有着层级结构的名称空间;位于Dom0 CentOS对Xen的支持: RHEL 5.7-:默认的虚拟化技术为xen; kernel version: 2.6.18 kernel- kernel-xen RHEL 6+:仅支持kvm Dom0: 不支持 DomU: 支持 如何在CentOS 6.6上使用Xen: (1) 编译3.0以上版本的内核,启动对Dom0的支持; (2) 编译xen程序; 制作好相关程序包的项目: xen4centos xen made easy 演示:使用Xen4CentOS 安装完成后对grub的配置示例: (1) title CentOS (3.18.12-11.el6.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M cpufreq=xen dom0_max_vcpus=2 dom0_vcpus_pin module /vmlinuz-3.18.12-11.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet module /initramfs-3.18.12-11.el6.x86_64.img (2) title CentOS (3.4.46-8.el6.centos.alt.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M,max:1024M loglvl=all guest_loglvl=all module /vmlinuz-3.4.46-8.el6.centos.alt.x86_64 ro root=/dev/mapper/vg_xen01-lv_root rd_LVM_LV=vg_xen01/lv_swap rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=uk rd_NO_MD LANG=en_GB rd_LVM_LV=vg_xen01/lv_root SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM rhgb quiet module /initramfs-3.4.46-8.el6.centos.alt.x86_64.img (3) title CentOS (3.7.10-1.el6xen.x86_64) root (hd0,0) kernel /xen.gz dom0_mem=1024M,max:1024M dom0_max_vcpus=2 dom0_vcpus_pin cpufreq=xen module /vmlinuz-3.7.10-1.el6xen.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet module /initramfs-3.7.10-1.el6xen.x86_64.img grub.conf boot options(官方文档):http://xenbits.xen.org/docs/unstable/misc/xen-command-line.html 官方Man手册:http://wiki.xenproject.org/wiki/Xen_Man_Pages 工具栈: xm/xend xl xl list:显示Domain的相关信息 xen虚拟状态: r: running b: 阻塞 p: 暂停 s: 停止 c: 崩溃 d: dying, 正在关闭的过程中 如何创建xen pv模式: 1、kernel 2、initrd或initramfs 3、DomU内核模块 4、根文件系统 5、swap设备 将上述内容定义在DomU的配置文件 注意:xm与xl启动DomU使用的配置文件略有不同; 对于xl而言,其创建DomU使用的配置指令可通过“man xl.cfg”获取 常用指令: name: 域惟一的名称 builder:指明虚拟机的类型,generic表示pv,hvm表示hvm vcpus:虚拟cpu个数; maxcpus:最大虚拟cpu个数 cpus:vcpu可运行于其上物理CPU列表 memory=MBYTES: 内存大小 maxmem=MBYTES:可以使用的最大内存空间 on_poweroff:指明关机时采取的action destroy, restart, preserve on_reboot="ACTION": 指明“重启”DomU时采取的action on_crash="ACTION":虚拟机意外崩溃时采取的action uuid:DomU的惟一标识; disk=[ "DISK_SPEC_STRING", "DISK_SPEC_STRING", ...]: 指明磁盘设备,列表, vif=[ "NET_SPEC_STRING", "NET_SPEC_STRING", ...]:指明网络接口,列表, vfb=[ "VFB_SPEC_STRING", "VFB_SPEC_STRING", ...]:指明virtual frame buffer,列表; pci=[ "PCI_SPEC_STRING", "PCI_SPEC_STRING", ... ]: pci设备的列表 PV模式专用指令: kernel="PATHNAME":内核文件路径,此为Dom0中的路径; ramdisk="PATHNAME":为kernel指定内核提供的ramdisk文件路径; root="STRING":指明根文件系统; extra="STRING":额外传递给内核引导时使用的参数; bootloader="PROGRAM":如果DomU使用自己的kernel及ramdisk,此时需要一个Dom0中的应用程序来实现其bootloader功能; 磁盘参数指定方式: 官方文档:http://xenbits.xen.org/docs/unstable/misc/xl-disk-configuration.txt [, [, [, []]]] 表示磁盘映像文件或设备文件路径:/images/xen/linux.img,/dev/myvg/linux 表示磁盘格式,如果映像文件,有多种格式,例如raw, qcow, qcow2 vdev: 此设备在DomU被识别为硬件设备类型,支持hd[x], xvd[x], sd[x] access: 访问权限, ro, r: 只读 rw, w: 读写 disk=[ "/images/xen/linux.img,raw,xvda,rw", ] 使用qemu-img管理磁盘映像: create [-f fmt] [-o options] filename [size] 可创建sparse格式的磁盘映像文件 示例: 创建一个pv格式的vm: (1) 准备磁盘映像文件 qemu-img create -f raw -o size=2G /images/xen/busybox.img mke2fs -t ext /images/xen/busybox.img (2) 提供根文件系统 编译busybox,并复制到busybox.img映像中: yum -y groupinstall "Development Tools" "Server Platform Development" tar -xf busybox-1.22.1.tar.bz2 cd busybox-1.22.1/ make menuconfig make install cp -a _install/* /mnt/ cd /mnt mkdir proc sys dev etc var boot home cd /boot ln -sv vmlinuz-2.6.32-696.el6.x86_64 vmlinz mount -o /images/xen/busybox.img /mnt cp -a $BUSYBOX/_install/* /mnt mkdir /mnt/{proc,sys,dev,var} (3) 提供配置DomU配置文件 name = "busybox-001" kernel = "/boot/vmlinuz" ramdisk = "/boot/initramfs.img" extra = "selinux=0 init=/bin/sh" memory = 256 vcpus = 2 disk = [ '/images/xen/busybox.img,raw,xvda,rw' ] root = "/dev/xvda ro" (4) 启动实例: xl [-v] create -n xl create -c Ctrl + ] 如何配置网络接口: vif = [ '', '', ... ] vifspec: [=|,] 常用的key: mac=:指定mac地址,要以“00:16:3e”开头; bridge=:指定此网络接口在Dom0被关联至哪个桥设备上; model=: vifname=: 接口名称,在Dom0中显示的名称; script=:执行的脚本; ip=:指定ip地址,会注入到DomU中; rate=: 指明设备传输速率,通常为"#UNIT/s"格式 UNIT: GB, MB, KB, B for bytes. Gb, Mb, Kb, b for bits. 官方文档:http://xenbits.xen.org/docs/unstable/misc/xl-network-configuration.html 回顾: xen基本组件: xen hypervisor, Dom0(Privileged Domain), DomU(Unprivileged Domain) netdev-frontend, netdev-backend; blkdev-frontend, blkdev-backend; Xen的DomU虚拟化类型: pv hvm(fv) pv on hvm Dom0: kernel, ramdisk RootFS: busybox qemu-img Xen(2) 注意:内核版本降级至3.7.4, Sources/6.x86_64/xen-4.1; 网络接口启用: vif = [ 'bridge=xenbr0', ] xl的其它常用命令: shutdown: 关机 reboot:重启 pause: 暂停 unpause: 解除暂停 save: 将DomU的内存中的数据转存至指定的磁盘文件中; xl [-vf] save [options] [] restore: 从指定的磁盘文件中恢复DomU内存数据; xl [-vf] restore [options] [] vcpu-list vcpu-pin vcpu-set info: 当前xen hypervisor的摘要信息 domid domname top: 查看domain资源占用排序状态的命令 network-list: 查看指定域使用网络及接口; network-attach network-detach block-list: 查看指定域使用的块设备的列表; block-attach block-detach uptime: 运行时长 使用DomU自有kernel来启动运行DomU: 制作磁盘映像文件: losetup - set up and control loop devices losetup -a: 显示所有已用的loop设备相关信息 losetup -f: 显示第一个空闲的loop设备文件 使用xl命令进行创建虚拟机并完成CentOS 6.6的系统安装 (1) 创建磁盘映像文件; (2) 获取安装指定版本的系统所需要kernel及initrd文件; (3) 创建DomU配置文件,示例如下: name = "centos-001" kernel = "/images/kernel/vmlinuz" ramdisk = "/images/kernel/initrd.img" extra = "ks=http://172.16.0.1/centos6.x86_64.cfg" memory = 512 vcpus = 2 vif = [ 'bridge=xenbr0' ] disk = [ '/images/xen/centos6.6.img,qcow2,xvda,rw' ] on_reboot = "shutdown" (4) 安装完成后,创建虚拟机的配置文件需要做出修改; name = "centos-001" bootloader = "pygrub" memory = 512 vcpus = 2 vif = [ 'bridge=xenbr0' ] disk = [ '/images/xen/centos6.6.img,qcow2,xvda,rw' ] 启动图形窗口: 在创建虚拟机的配置文件中定义vfb (1) vfb = [ 'sdl=1' ] (2) vnc (a) yum install tigervnc (b) vfb = [ 'vnc=1' ] vnc监听的端口为5900, 相应的DISPLAYNUM为0 使用Dom0中物理磁盘分区为DomU提供存储空间: 使用libvirt实现xen虚拟机管理: yum install libvirt libvirt-deamon-xen virt-manager python-virtinst libvirt-client service libvirtd start virt-manager, virsh, virt-install 实践: (1) 提供DomU配置文件: /etc/xen/bbox (2) 创建磁盘映像文件,导致busybox文件系统,启动之; 补充:xm的配置文件: kernel:内核 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的路径; xm的配置文件说明 Xen配置文件一般由选项(options)、变量(variables)、CPU、网络、PCI、HVM、计时器(timers)、驱动(drivers)、磁盘设备(disk devices)、动作(behavior),以及图形及声音(Graphics and audio)几个段组成,分别用于定义不同类别的域属性或设备属性。 上面的配置文件中的各选项作用如下。 ◇ kernel:为当前域指定可用于DomU的内核文件; ◇ ramdisk:与kernel指定的内核文件匹配使用的ramdisk映像文件,根据需要指定,此为可选项; ◇ name:当前域的独有名称;每个域必须使用全局惟一的名称,否则将产生错误; ◇ memory:当前域的可用物理内存空间大小,单位为MB,默认为128; ◇ disk:当前域的所有可用磁盘设备列表,格式为disk = [ “disk1”, “disk2”, …],每个disk都有三个参数进行定义,格式为“backend-dev,front-dev,mode”;  backend-dev主要有两种类型,物理设备或虚拟磁盘映像文件,它们的格式分别为“phy:device”和“file:/path/to/file”;  frontend-dev定义其在DomU中的设备类型,一般为xvd[a-z];  mode则用于定义其访问权限,r为只读,w为读写; ◇ vcpus:配置给当前域使用的虚拟CPU的个数;默认为1; ◇ root:为当前域指定其根文件系统所在的设备,这个将作为内核参数在内核启动传递给内核; ◇ extra:传递给内核的额外参数,其中selinux=0表示禁用selinux,init则用于指定init程序的路径;多个参数之间使用空格隔开; ◇ on_reboot:执行xm reboot命令或在当前域内部执行重启操作时由Xen执行的动作;其常用的值为destroy和restart; ◇ on_crash:当前域由于各种原因崩溃时由Xen执行的动作;其常用的值为destroy、restart和preserve,preserve可以保存系统崩溃前的状态信息以用于调试; ◇ on_shutdown:执行xm shutdown命令或在当前域内部执行关机操作时由Xen执行的动作; /dev/sdb disk = [ 'phy:/dev/sdb,xvda,w', ] 其它常用参数: ◇ vif:定义当前域的可用虚拟网络接口列表,每个虚拟网络接口都可以使用“name=value”的格式定义其属性;也可在定义某接口时不指定任何属性,其所有属性将均由系统默认配置;例如:vif = ['ip = "192.168.1.19", bridge=xenbr0']  type:接口设备的类型,默认为netfront;  mac:MAC地址,默认为随机;  bridge:桥接到的物理设备,默认为Dom0中的第一个桥接设备;  ip:ip地址;  script:配置此接口的脚本文件,省略时将使用默认的配置脚本;  vifname:后端设备的设备名称,默认为vifD.N,其中D为当前域的ID,N为此网络接口的ID; ◇ vfb:为当前域定义虚拟帧缓冲,其有许多可用属性,可以使用“name=value”的格式进行定义;  vnc或sdl:定义vnc的类型,vnc=1表示启动一个可由外部设备连接的vnc服务器,sdl=1则表示启用一个自有的vncviewer;两者可以同时使用;  vncdisplay:vnc显示号,默认为当前域的ID,当前域的VNC服务器将监听5900+此显示号的端口;  vnclisten:VNC服务器监听的地址,默认为127.0.0.1;  vncunused:如果此属性的值为非零值,则表示vncserver监听大于5900的第一个没被占用的端口;  vncpasswd:指定VNC服务器的认证密码;  display:用于域的自有vncviewer显示,默认为DISPLAY环境变量的值; 示例: 第一种: vfb = [ 'sdl=1' ] 第二种: vfb = [ 'vnc=1,vncpasswd=mageedu' ] http://wiki.xen.org/wiki/XenConfigurationFileOptions#Graphics_and_Audio ◇ cpu:指定当前域应该在哪个物理CPU上启动,0表示第一颗CPU,1表示第二颗,依次类推;默认为-1,表示Xen可自行决定启动当前域的CPU; ◇ cpus:指定当前域的VCPU可以在哪些物理CPU上运行,如cpus = ”3,5-8,^6”表示当前域的VCPU可以在3,5,7,8号CPU上运行; ◇ bootloader:bootloader程序的路径;基于此bootloader,PV DomU的内核也可直接位于其文件系统上而非Dom0的文件系统; 更多的选项请参见xmdomain.cfg的手册页,或参考Xen官方wiki链接http://wiki.xen.org/wiki/XenConfigurationFileOptions中的详细解释。 在启动DomU时,可以为其定义可用的虚拟网络接口个数、每个虚拟网络接口的属性等,这仅需要在其对应的配置文件中使用vif选项即可。vif选项的值是一个列表,列表中的每个条目使用单引号引用,用于定义对应虚拟网络接口属性,条目之间使用逗号分隔。比如下面的示例就为当前域定义了三个虚拟网络接口,每个接口的属性均采用了默认配置。 vif = [ ‘ ‘, ‘ ‘, ‘ ‘ ] 每个网络接口可定义的属性语法格式为‘type= TYPE, mac=MAC, bridge=BRIDGE, ip=IPADDR, script= SCRIPT," + \ "backend=DOM, vifname=NAME, rate=RATE, model=MODEL, accel=ACCEL’。 ◇ type:网络接口的类型,即其前端设备类型,默认为netfront;其可用的值还有有ioemu,表示使用QEMU的网络驱动; ◇ mac:指定此接口的MAC地址,默认为00:16:3E:(IEEE分配给XenSource的地址段)开头的随机地址; ◇ bridge:指定此接口使用的桥接设备,默认为Dom0内的第一个桥接设备; ◇ ip:为当前域定义固定IP地址,如果网络中存在DHCP服务器,请确保此地址一定没有包含于DHCP的可分配地址范围中;事实上,在DHCP环境中,可以直接在DHCP服务器上为此接口分配固定IP地址,因此,没有必要再使用此参数手动指定; ◇ script:指定用于配置当前接口网络属性的脚本,默认为xend的配置文件中使用vif-script指定的脚本; ◇ vifname:定义当前网络接口的后端设备在Dom0显示的名字;默认为vifDomID.DevID,其在当前域启动时自动生成,并随当前域ID的变化而改变;为其使用易于识别的固定名称有助于后期的管理工作; ◇ rate:为当前接口指定可用带宽,例如rate=10MB/s; ◇ model:由QEMU仿真的网络设备的类型,因此,只有在type的值为ioemu此参数才能意义;其可能的取值有lance、ne2k_isa、ne2k_pci、rt1839和smc91c111。默认为ne2k_pci; 无论DomU中安装的是什么操作系统,为其定义网络接口时指定固定的MAC地址和接口名称通常是很有必要,因为其有助于追踪特定域的报文及当域多次启动后仍能使用相同的网络接口名称从而保证日志信息的连贯性。此外,如果Dom0中定义了多个桥接设备,还应该为桥接的网络接口使用bridge参数指定固定桥接到的桥接设备。下面的示例展示了指定此三个参数的接口定义。 vif = [ ‘vifname=web0.0, mac=00:16:3E:00:00:01, bridge=xenbr0’ ] 补充:Xen常见的工具栈 ◇ Default / XEND Xen 4.0及之前的版本中默认使用的工具栈,Xen 4.1提供了新的轻量级工具栈xl,但仍然保留了对Xend/xm的支持,但Xen 4.2及之后的版本已弃用。但xl在很大程度上保持了与xm的兼容。 ◇ Default / XL xl是基于libxenlight创建的轻量级命令行工具栈,并从Xen 4.1起成为默认的工具栈。xl与Xend的功能对比请参照http://wiki.xen.org/wiki/XL_vs_Xend_Feature_Comparison。 ◇ XAPI / XE XAPI即Xen管理API(The Xen management API),它是Citrix XenServer和XCP默认使用的工具栈。目前,其移植向libxenlight的工作正进行中。XAPI是目前功能最通用且功能最完备的Xen工具栈,CloudStack、OpenNebula和OpenStack等云计算解决方案都基于此API管理Xen虚拟机。 补充资料:编译安装Xen 一、配置网络接口 [root@el6 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" HWADDR="00:11:22:33:44:55" NM_CONTROLLED="no" ONBOOT="yes" BOOTPROTO="dhcp" 最重要的是确保NM_CONTROLLED的值为"no",以及ONBOOT的值为"yes"。 另外,要确保网络服务能够开机自动启动: # chkconfig network on 在/etc/hosts文件中为本机的主机名及IP地址建立解析 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.1.7 virtlab.magedu.com virtlab 禁用SELinux。 二、解决依赖关系 # yum install screen vim wget tcpdump ntp ntpdate man smartmontools links lynx ethtool xorg-x11-xauth 修改grub.conf,增加超时时间,并禁用hiddenmenu。 #boot=/dev/sda default=0 timeout=15 splashimage=(hd0,0)/grub/splash.xpm.gz #hiddenmenu title Red Hat Enterprise Linux (2.6.32-279.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_NO_DM KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg0/root rhgb quiet initrd /initramfs-2.6.32-279.el6.x86_64.img 三、安装编译Xen所依赖的工具 # yum groupinstall "Development tools" "Additional Development" "Debugging Tools" "System administration tools" "Compatibility libraries" "Console internet tools" "Desktop Platform Development" # yum install transfig wget texi2html libaio-devel dev86 glibc-devel e2fsprogs-devel gitk mkinitrd iasl xz-devel bzip2-devel pciutils-libs pciutils-devel SDL-devel libX11-devel gtk2-devel bridge-utils PyXML qemu-common qemu-img mercurial texinfo libuuid-devel ocaml ocaml-findlib # yum install glibc-devel.i686 四、Rebuilding and installing Xen src.rpm # cd /usr/local/src # wget http://xenbits.xen.org/people/mayoung/EL6.xen/SRPMS/xen-4.1.2-20.el6.src.rpm # rpm -ivh xen-4.1.2-20.el6.src.rpm # cd /root/rpmbuild/SPECS/ # rpmbuild -bb xen.specs 五、安装qemu(此步非必须) # yum install usbredir-devel spice-protocol spice-server-devel libseccomp-devel systemtap-sdt-devel nss-devel xfsprogs-devel bluez-libs-devel brlapi-devel libcap-devel # wgethttp://mirrors.ustc.edu.cn/fedora/linux/releases/15/Everything/source/SRPMS/qemu-0.14.0-7.fc15.src.rpm # rpm -ivh qemu-1.2.0-23.fc18.src.rpm # cd /root/rpmbuild/SPECS # rpmbuild -bb qemu.spec 六、编译内核 # # # These core options (Processor type and features| Paravirtualized guest support] CONFIG_PARAVIRT=y CONFIG_XEN=y CONFIG_PARAVIRT_GUEST=y CONFIG_PARAVIRT_SPINLOCKS=y # add this item # And Xen pv console device support (Device Drivers|Character devices CONFIG_HVC_DRIVER=y CONFIG_HVC_XEN=y # And Xen disk and network support (Device Drivers|Block devices and Device Drivers|Network device support) CONFIG_XEN_FBDEV_FRONTEND=y CONFIG_XEN_BLKDEV_FRONTEND=y # change the value to y CONFIG_XEN_NETDEV_FRONTEND=y # change the value to y # And the rest (Device Drivers|Xen driver support) CONFIG_XEN_PCIDEV_FRONTEND=y CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y CONFIG_XEN_FBDEV_FRONTEND=y CONFIG_XEN_XENBUS_FRONTEND=y CONFIG_XEN_SAVE_RESTORE=y CONFIG_XEN_GRANT_DEV_ALLOC=m # And for tmem support: CONFIG_XEN_TMEM=y # add the item CONFIG_CLEANCACHE=y # enable the item CONFIG_FRONTSWAP=y # enable the item CONFIG_XEN_SELFBALLOONING=y # add the item # Configure kernel for dom0 support # NOTE: Xen dom0 support depends on ACPI support. Make sure you enable ACPI support or you won't see Dom0 options at all. # In addition to the config options above you also need to enable: CONFIG_X86_IO_APIC=y CONFIG_ACPI=y CONFIG_ACPI_PROCFS=y (optional) CONFIG_XEN_DOM0=y CONFIG_PCI_XEN=y CONFIG_XEN_DEV_EVTCHN=y CONFIG_XENFS=y # change the value to y CONFIG_XEN_COMPAT_XENFS=y CONFIG_XEN_SYS_HYPERVISOR=y CONFIG_XEN_GNTDEV=y CONFIG_XEN_BACKEND=y CONFIG_XEN_NETDEV_BACKEND=m # enable the item CONFIG_XEN_BLKDEV_BACKEND=m # enable the item CONFIG_XEN_PCIDEV_BACKEND=m CONFIG_XEN_PRIVILEGED_GUEST=y CONFIG_XEN_BALLOON=y CONFIG_XEN_SCRUB_PAGES=y # If you're using RHEL5 or CentOS5 as a dom0 (ie. you have old udev version), make sure you enable the following options as well: CONFIG_SYSFS_DEPRECATED=y CONFIG_SYSFS_DEPRECATED_V2=y 七、编辑安装libvirt yum install libblkid-devel augeas sanlock-devel radvd ebtables systemtap-sdt-devel scrub numad # cd /usr/src # wget ftp://ftp.redhat.com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS/libvirt-0.9.10-21.el6_3.7.src.rpm # rpm -ivh libvirt-0.9.10-21.el6_3.7.src.rpm 编辑/root/rpmbuild/SPECS/libvirt.spec文件,启用with_xen选项。 # cd /root/rpmbuild/SPECS # rpmbuild -bb libvirt.spec yum install libnl-devel xhtml1-dtds libudev-devel libpciaccess-devel yajl-devel libpcap-devel avahi-devel parted-devel device-mapper-devel numactl-devel netcf-devel xen-devel dnsmasq iscsi-initiator-utils gtk-vnc-python 先安装gtk-vnc-python包。 编译安装virtinst 编译安装libvirtd 编译安装virt-manager 注意:libvirt-1.0之前的版本不支持xen 4.2。 补充资料:杂项 桥接功能是在内核中实现的,因此,只要提供了正确网络接口的配置文件,Linux系统会自动启用桥接设备。比如,如果想为当前系统定义桥接设备xenbr0,并将eth0设备附加其上,在rhel6平台上,其步骤如下。 假设eth0的原始配置信息如下面所示。 DEVICE="eth0" BOOTPROTO="static" NM_CONTROLLED="no" HWADDR=00:0C:29:B4:48:BB IPADDR=192.168.1.7 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 ONBOOT="yes" TYPE="Ethernet" 为xenbr0创建配置文件/etc/sysconfig/network-scripts/ifcfg-xenbr0,其内容类似下面所示。需要注间的是TYPE属性的值Bridge一定要大写首字母。 DEVICE="xenbr0" BOOTPROTO="static" NM_CONTROLLED="no" IPADDR=192.168.1.7 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 ONBOOT="yes" TYPE=" Bridge" DELAY=0 将eth0的配置文件/etc/sysconfig/network-scripts/ifcfg-eth0的内容修改为: DEVICE="eth0" BOOTPROTO="static" NM_CONTROLLED="no" HWADDR=00:0C:29:B4:48:BB ONBOOT="yes" TYPE="Ethernet" BRIDGE=xenbr0 而后使用/etc/init.d/network脚本重启网络服务即可。 使用brctl命令管理桥接设备 brctl是由bridge-utils软件包提供的命令,使用前请先确保其已经正确安装。brctl有许多的子命令,分别用于实现添加、删除桥接设备,向桥设备附加网络接口等。不带任何参数的brctl命令即可显示其使用帮助,如下列出了其中的一部分。 # brctl Usage: brctl [commands] commands: addbr add bridge delbr delete bridge addif add interface to bridge delif delete interface from bridge show show a list of bridges …… …… 由上面的帮助信息所示,添加一个桥接设备只需使用命令“brctl addbr ”即可,比如,添加xenbr0设备: # brctl addbr xenbr0 刚添加桥接设备时,由于没有为其附加任何网络接口,其尚处于未激活状态。为其附加一个网络接口设备可使用“brctl addif 命令实现,比如,将eth0附加至刚添加的xenbr0: # brctl addif xenbr0 eth0 从桥设备上删除某网络接口,使用命令“brctl delif ”;删除桥接设备则使用“brctl delbr ”,不过需要注意的是,只有在桥设备处于未激活状态时才能将其删除。而要查看桥接设备相关的信息,可以使用“brctl show”命令。 需要注意的是,使用brctl命令配置桥接设备的完整过程需要参考前面讲解的network-bridge start命令的实现步骤进行。 # To create one using the VNC backend and sensible defaults: # # vfb = [ 'type=vnc' ] # # The backend listens on 127.0.0.1 port 5900+N by default, where N is # the domain ID. You can override both address and N: # # vfb = [ 'type=vnc,vnclisten=127.0.0.1,vncdisplay=1' ] # # Or you can bind the first unused port above 5900: # # vfb = [ 'type=vnc,vnclisten=0.0.0.0,vncunused=1' ] # # You can override the password: # # vfb = [ 'type=vnc,vncpasswd=MYPASSWD' ] # # Empty password disables authentication. Defaults to the vncpasswd # configured in xend-config.sxp. vfb = [ 'type=vnc,vncdisplay=10,vncpasswd=s3cr3t' ] 批量部署DomU: 准备一个映像模板; OZ: 脚本: 生成一个配置文件/etc/xen 下载一个磁盘映像 16: disk = ['phy:/dev/sdb,xvda,w'] 使用了bootloader, pygrup示例: #ramdisk="/boot/initramfs-2.6.32-358.el6.x86_64.img" #kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64" name="linux" vcpus=1 memory=128 disk=['file:/xen/vm2/dom2.img,xvda,w',] bootloader="/usr/bin/pygrub" #root="/dev/xvda2 ro" #extra="selinux=0 init=/sbin/init" vif=[ 'bridge=br0' ] on_crash="destroy" on_reboot="restart" 使用Dom0中的kernel和ramdisk引导的示例: ramdisk="/boot/initramfs-2.6.32-358.el6.x86_64.img" kernel="/boot/vmlinuz-2.6.32-358.el6.x86_64" name="test" vcpus=1 memory=128 disk=['file:/xen/vm1/test.img,xvda,w',] root="/dev/xvda ro" extra="selinux=0 init=/sbin/init" 自定义安装,并启用了vnc功能: #ramdisk="/xen/isolinux/initrd.img" #kernel="/xen/isolinux/vmlinuz" name="rhel6" vcpus=2 memory=512 disk=['file:/xen/vm3/rhel6.img,xvda,w',] bootloader="/usr/bin/pygrub" #root="/dev/xvda2 ro" #extra="selinux=0 init=/sbin/init" #extra="ks=http://172.16.0.1/rhel6.x86_64.cfg" vif=[ 'bridge=br0' ] on_crash="destroy" on_reboot="destroy" vfb=[ 'vnc=1,vnclisten=0.0.0.0' ] 补充资料:创建Xen PV模式虚拟机的前提 在PV模式中运行guest系统,需要满足几个基本前提。 ◇ 能运行于Xen DomU的(Xen-enabled)内核:Liunx 2.6.24及以后的内核已经添加了对Xen DomU的支持,因此,只要在内核编译时启用了相应的功能就能满足此要求,目前多数Linux发行版的内核都已经支持此特性;而此前的版本需要内核在编译前手动打补丁方可; ◇ 根文件系统(Root Filesystem):包含了应用程序、系统组件及配置文件等运行DomU的各种所需要文件的文件系统,其不用非得包含内核及对应的ramdisk,后面的这些组件放在Dom0中即可;事实上,用于DomU的内核文件必须要能够允许Dom0访问到,因为其运行时需要与Xen Hypervisor通信,因此,这些内核组件可以位于Dom0能够访问到的任何文件系统上;然而,目前基于pygrub(可用于Dom0跟非特权域磁盘映像中的内核通信),此内核文件也可以直接放置于非特权域的磁盘映像中; ◇ DomU内核所需要的内核模块:内核模块是内核的重要组成部分,它们一般存储于根文件系统; ◇ ramdisk或者ramfs:这个根据实际需要是个可选组件,如果在内核初始化过程中不需要依赖于此来装载额外的驱动程序以访问根文件系统则也可以不用提供; ◇ swap设备:交换分区能够让Linux运行比仅有物理内存时更多的进程,因此,提供此组件是常见的做法;当然,它是可选的; ◇ DomU配置文件:集中在一起指定前述各组件的配置信息,以及定义其它有关PV DomU的基本属性的文件;其通常包含所有用于当前DomU属性配置参数,包括为其指定磁盘映像和内核文件的位置(或pygrub的位置)等,以及其它许多属性如当前DomU可以访问的设备等,这些设备包括网络设备、硬盘、显卡及其它PCI设备;同时,配置文件中也可以指定新创建的非特权域可以使用的物理内存大小及虚拟CPU个数等等; 这里需要提醒的是,如果计划为PV DomU编译内核,需要以与传统方式不同的方式放置内核及其模块。前面也已经提到,内核一般会放在Dom0的某路径下,而内核模块则需要放在DomU的根文件系统上。 PV DomU的根文件系统可以以多种不同的方式进行安置,比如: ◇ 虚拟磁盘映像文件 ◇ Dom0没有使用的额外物理磁盘分区 ◇ Dom0没有使用的逻辑卷 ◇ 块级别网络文件系统,如iSCSI设备 分布式文件系统 ◇ 网络文件系统,如NFS 有许多组织提供了预配置的根文件系统,如FreeOsZoo(www.oszoo.org)、Jailtime.org(www.jailtime.org)等,读者可以根据需要到它们的站点下载。另外,rPath还提供了一个在的根文件系统制作系统rBuilder(www.rpath.com/rbuiler)。 补充资料:基于isolinux的内核和initrd文件在PV DomU模式安装CentOS 6.6 第一步,创建空的虚拟磁盘映像,以之作为新建非特权域的虚拟磁盘文件,此映像文件并不真正占用为其指定的空间,而是随着存储的内容而变化。 # qemu-img create -f qcow2 -o size=120G,preallocation=metadata /xen/images/centos6.img 第二步,获取要安装的CentOS6(x86_64)的isolinux目录中的vmlinuz和initrd.img文件,这里将其存放于/xen/centos6/isolinux目录中。 第三步,为新的非特权域创建配置文件/etc/xen/centos6,内容如下。 kernel = "/xen/rhel6/isolinux/vmlinuz" ramdisk = "/xen/rhel6/isolinux/initrd.img" name = "centos6" memory = "512" disk = [ 'file:/xen/iamges/centos6.img,xvda,w', ] vif = [ 'bridge=xenbr0', ] #bootloader="/usr/bin/pygrub" #extra = "text ks=http://some_server/path/to/kickstart.cfg" vcpus=1 on_reboot = 'destroy' on_crash = 'destroy' 第四步,创建新的非特权域。 # xm create -c centos6 此命令会启动rhel6的安装界面,其运行于Xen的PV模式。根据提示一步步的安装系统即可。 安装完成后,将上述配置文件中的前两行信息注释,并启用bootloader一行,再使用如前面的xm create命令即可正常启动此域。其修改后的配置文件内容如下: name = "centos6" memory = "512" disk = [ 'file:/xen/images/centos6.img,xvda,w', ] vif = [ 'bridge=xenbr0', ] bootloader="/usr/bin/pygrub" vcpus=1 on_reboot = 'restart' on_crash = 'destroy xen实时迁移 基于iscsi来实现。 kernel = "/boot/vmlinuz-3.7.4-1.el6xen.x86_64" ramdisk = "/boot/initramfs-3.7.4-1.el6xen.x86_64.img" name = "test" memory = "128" disk = [ 'phy:/dev/sdb,xvda,w', ] vcpus=2 on_reboot = 'restart' on_crash = 'destroy' root = "/dev/xvda2 ro" extra = "selinux=0 init=/sbin/init" 提供配置文件: /etc/{passwd,shadow,group,fstab,nsswitch.conf} 提供库文件: /lib64/libnss_file.so.* 提供配置文件:/etc/nginx 提供目录:/var/run, /var/log/nginx 网卡驱动:xen-netfront.ko [xen4] name=Xen4 Project baseurl=ftp://172.16.0.1/pub/Sources/6.x86_64/xen4/x86_64/ gpgcheck=0 cost=500 xen实时迁移,xm, 配置文件的使用细节 [et-virt07 ~]# grep xend-relocation /etc/xen/xend-config.sxp |grep -v '#' (xend-relocation-server yes) (xend-relocation-port 8002) (xend-relocation-address '') (xend-relocation-hosts-allow '') [et-virt08 ~]# grep xend-relocation /etc/xen/xend-config.sxp |grep -v '#' (xend-relocation-server yes) (xend-relocation-port 8002) (xend-relocation-address '') (xend-relocation-hosts-allow '')