一、虚拟化技术简介
应用程序 |
函数库 |
操作系统 |
硬件 |
计算机系统层次结构
现在计算机系统是一个庞大的整体, 整个系统非常复杂,因此计算机系统被自下而上分为多个层次,每一个层次都像上一个层次呈现一个抽象,并且每一层只需要知道下层抽象的接口,而并不需要了解其内部机制。虚拟化技术就是下层的软件模块,根据上层软件模块的需求,抽象出一个虚拟的软件或者硬件接口,使上一层软件可以运行在与自己所期待的运行环境完全一致的虚拟环境上。
虚拟化可以发生在上表的各个层次,但对于openstack这样的云计算服务而言,更关心的是硬件抽象层上面的虚拟化。因为只有把物理计算机系统虚拟化为多台虚拟计算机系统,通过网络将这些虚拟计算机系统互联,才能形成现代意义的服务云计算系统。硬件抽象层上面的虚拟化是指通过虚拟硬件抽象层来实现虚拟机,为客户机操作系统呈现出与物理硬件相同或者相似的硬件抽象层。由于客户机操作系统索尼呢个看到的只是硬件抽象层,因此客户操作系统的行为和其在物理平台上没有什么区别。
应用程序 | 应用程序 | 应用程序 |
函数库 | 函数库 | 函数库 |
操作系统1 | 操作系统2 | 操作系统3 |
虚拟化层 | ||
硬件 |
加入虚拟化层
硬件抽象层的虚拟化又被称为系统虚拟化,指将一台物理计算机系统虚拟化为一台或者多台虚拟计算机系统,每个虚拟机都具有都拥有自己的虚拟硬件,如CPU、内存和设备等,并提供一个独立的虚拟机执行环境。通过虚拟监控器(Virtual Machine Monitor,也称为Hypervisor)的模拟,虚拟机中的操作系统认为自己仍然独占一个系统在运行。在一台物理机上运行的每个虚拟机中的操作系统可以完全不同,并且他们的执行环境完全独立。KVM和Xen就是这样的两种Hypervisor。由于openstack主要采用了KVM作为虚拟化技术,故只介绍KVM。
基于内核的虚拟机(Kernel-Based Virtual Machine)需要两个条件:硬件支持全虚拟化;操作系统为linux。KVM是基于Intel VT等技术的硬件虚拟化,本身关注虚拟机调度、内存管理两大方面,并利用Qemu等来提供设备虚拟化。
而在一个数据中心里面,有可能使用了不同的hypervisor,管理起来可能并不是那么容易,Libvirt就是一个统一的管理工具,用来管理各种各样的hypervisor,并且能够提供统一的API支持上层应用。Libvirt是一个软件集合,包含了:1.一个库文件,实现管理接口;2.一个守护进程(libvirtd);3.一个命令行工具(virsh)。
二、镜像制作,以创建centos7镜像为例
1.首先需要一个镜像文件用于安装操作系统,格式为iso,其次建立一个虚拟磁盘:
qemu-img create -f qcow2 -o size=5G centos7.qcow2
2.编写xml文件,vim centos7.xml 样例参见附件
3.安装操作系统
virsh define centos7.xml
virsh start centos7
virsh vncdisplay 产生一个端口号,在物理机用这个端口号使用图形界面安装操作系统
6.安装完毕后需要修改启动方式
virsh destroy centos7
virsh undefine centos7
修改xml文件boot那行,由cdrom改为hd
virsh define centos7.xml
virsh start centos7
完成!
xml文件样例:
<domain type=‘kvm‘>
<name>centos7</name> 镜像名称,修改
<memory unit=‘GiB‘>8</memory> 内存容量,根据需要修改
<vcpu placement=‘static‘>4</vcpu> CPU个数,根据需要修改
<os> 定义系统
<type arch=‘x86_64‘ machine=‘rhel6.5.0‘>hvm</type> 系统架构和使用的机器类型
<boot dev=‘cdrom‘/> 启动方式,从iso文件启动就设置cdrom
</os>
<features> 定义硬件特性信息
<acpi/> Advanced Configuration and Power Interface
<apic/> Advanced Programmable Interrupt Controller
<pae/> Physical Address Extension
</features>
<clock offset=‘utc‘/> 时钟,使用utc时间
<on_poweroff>destroy</on_poweroff> 定义突发事件处理,关机则采用destroy的处理方式
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices> 定义虚拟外设
<emulator>/usr/libexec/qemu-kvm</emulator> 定义Hypervisor,这里为KVM
<disk type=‘file‘ device=‘cdrom‘> 指定虚拟光盘
<driver name=‘qemu‘ type=‘raw‘/> iso格式属于raw格式的一种
<source file=‘/home/iso/ubuntu-14.04.3-server-amd64.iso‘/>
<target dev=‘hdc‘ bus=‘ide‘/>
<readonly/>
<address type=‘drive‘ controller=‘0‘ bus=‘1‘ target=‘0‘ unit=‘0‘/>
</disk> 定义磁盘
<disk type=‘file‘ device=‘disk‘>
<driver name=‘qemu‘ type=‘raw‘ cache=‘none‘/>
<source file=‘/home/centos.img‘/> 若创建的磁盘是qcow2格式,则要把type改为qcow2
<target dev=‘vda‘ bus=‘virtio‘/>
</disk>
<controller type=‘usb‘ index=‘0‘>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x01‘ function=‘0x2‘/>
</controller>
<controller type=‘ide‘ index=‘0‘>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x01‘ function=‘0x1‘/>
</controller>
<interface type=‘bridge‘> 配置桥接网络
<mac address=‘52:54:00:C0:6F:ED‘/>
<source bridge=‘br0‘/>
<model type=‘virtio‘/>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x03‘ function=‘0x0‘/>
</interface>
<serial type=‘pty‘>
<target port=‘0‘/>
</serial>
<console type=‘pty‘>
<target type=‘serial‘ port=‘0‘/>
</console>
<input type=‘mouse‘ bus=‘ps2‘/>
<graphics type=‘vnc‘ port=‘5900‘ autoport=‘yes‘ listen=‘0.0.0.0‘>
<listen type=‘address‘ address=‘0.0.0.0‘/>
</graphics>
<sound model=‘ich6‘>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x04‘ function=‘0x0‘/>
</sound>
<video>
<model type=‘cirrus‘ vram=‘9216‘ heads=‘1‘/>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x02‘ function=‘0x0‘/>
</video>
<memballoon model=‘virtio‘>
<address type=‘pci‘ domain=‘0x0000‘ bus=‘0x00‘ slot=‘0x06‘ function=‘0x0‘/>
</memballoon>
</devices>
</domain>