kvm虚拟化技术(一)

虚拟化技术基础

李家宜 jenny1228.li@foxmail.com

虚拟化历史

  • 最早起源于分时系统
  • IBM最早实现在一台主机上运行多个操作系统
  • 20世纪90年代Vmware实现了X86平台服务器下的虚拟化,采用全虚拟化模式
  • 2003年,Xen提出了半虚拟化概念,提升整体效率
  • 虚拟化技术逐渐发展成硬件虚拟化阶段
  • 2005年,openVZ出现,在linux平台上的容器化技术实现
  • 2008年,LXC发布
  • 2013年,docker发布

虚拟化技术简介

随着计算机硬件技术不断的发展,资源的容量越来越大,价格也越来越低,资源的浪费变成了一个不可避免的问题。为了充分利用资源,虚拟化技术由此而生。虚拟化实际是为了优化资源而诞生的一种技术,可以有效地动态调配资源,简化管理。为了充分利用物理资源,在计算元件层和物理资源层中引入了一个虚拟化层,对上提供虚拟的系统资源,对下提供真实物理资源的调度方法。

软件级虚拟化和硬件级虚拟化

  • 软件级虚拟化

该方案是用纯软件的方法在现有的物理平台上实现对物理平台资源分配调用。客户机的指令并不直接在物理平台上运行,而是由软件模拟,通过软件进行转译后由真机执行操作。

优势:隔离了宿主机和虚拟机的操作指令集,避免冲突。

劣势:性能较差。

  • 硬件级虚拟化

物理平台本身完成了对特殊指令的转译工作。一旦虚拟机想要去访问物理资源,就会直接被硬件截获,将控制权交给指令转译程序处理。

优势:简化了VMM的设计,提升了整体的性能。

劣势:需要CPU、BIOS、主板芯片等硬件的支持。

半虚拟化及全虚拟化

  • 半虚拟化

软件虚拟化相对来说性能较弱,于是产生了一种解决方案,即改动虚拟机内核,让其知晓自己在虚拟化环境下工作,从而主动与VMM协同工作。半虚拟化弱化了VMM对于指令集的截获,变更为主动通知,但是,半虚拟化必须要修改虚拟机的源代码来实现。

代表产品:XEN,适用于BSD,linux,等开源操作系统,不适用于windows等闭源操作系统。

  • 全虚拟化

全虚拟化模拟了所有的硬件,包括CPU、内存、存储设备、键盘鼠标等等,理论上支持任何操作系统的运行。在没有硬件虚拟化的时代里,全虚拟化性能很弱,但当有了硬件虚拟化技术之后,全虚拟化性能基本可以和半虚拟化性能持平甚至超越半虚拟化。

基于硬件的全虚拟化,由于灵活、简易等特征致使其产品备受好评。

代表产品:Vmware

操作系统级虚拟化、编程语言级虚拟化、程序库级虚拟化

  • 操作系统级虚拟化

基于寄主机操作系统的虚拟化,在操作系统上通过一个虚拟曾来展现给用户多个独立的隔离的机器,客户机和寄主机保持同样的操作系统(寄主为linux,则虚拟机也必须是linux,不限发行商)

代表程序:OpenVZ

  • 编程语言级虚拟化

在应用层上实现新的自定义和指令集,虚拟机完成自定义指令集到本地指令集的转换。

代表程序:JVM

  • 程序库级虚拟化

在应用程序和运行函数库之间引入中间层,虚拟库函数API接口为上层软件提供给不同的API

代表程序:Wine和Cygwin

虚拟机监视器VMM

vmm全称为Virtual Machine Monitor,在x86的平台虚拟化技术中心引入了这个关键词,又可以将vmm称为Hypervisor。

虚拟机运行的环境通常我们会称为客户机,而真实物理服务器我们会称为寄主机。而VMM就是位于主机硬件和操作系之间的一个软件层,主要负责为虚拟机提供一个独立且安全的运行环境,将虚拟机和寄主机的环境进行隔离。

vmm有三种运行模式

  • 寄主模式(Hosted-based Model)

在该模式下,对于虚拟机来说,vmm相当于其操作系统的底层硬件,而对于真实物理服务器来说,vmm相当于其一个应用程序,需要与其他的app竞争资源,相对性能较差。

  • 混合模式(Hydrid model)

硬件上层直接是vmm,占用资源较少。

  • 独立监控模式(Stand-alone Hypervisor Model)

由虚拟机来监控虚拟机。Xen采用的是该模式。

虚拟机基本架构

从虚拟机架构上来看,可以分为类型一和类型二两种虚拟机。

类型一

类型一的虚拟机在系统上电之后,优先加载虚拟机监控程序,需要对操作系统内核做优化裁剪,虚拟机监控程序需要能够实现操作系统的初始化,物力资源的调度等操作系统的职能,这一类型的虚拟机架空程序一般会提供一个特殊的虚拟机用来执行管理的操作,提供日常操作和管理所使用的操作系统环境。XEN、VMware ESX/ESXI就属于该类架构。

类型二

类型二的虚拟化在系统上电之后仍然运行一般意义上的操作系统,虚拟机监控程序作为特殊的应用程序实现对于操作系统功能的扩展,实现起来较为简洁,但该类型功能容易受到寄主机的限制。VMware workstation及kvm都属于该类型的虚拟化。

KVM的架构

kvm的全称为Kernel Virtual Machine,基于内核的虚拟机,由以色列Qumranet公司开发,后期该公司被redhat收购,并将kvm产品集成至rhel6的操作系统中,替换了el5中的XEN。

kvm是linux原生态的全虚拟化解决方案,属于类型2的虚拟化解决方案,具有简洁且容易实现的特征,不过kvm在实现虚拟化过程中,将其VMM集成在内核当中,通过加载模块的方式使内核本身变成了一个VMM。

目前KVM支持广泛的操作系统,例如linux,BSD,windows,solaris等。

在KVM中,每个虚拟CPU都会有对应的一个线程来维护该CPU的运算,使kvm能够直接使用linux内核的所有功能。

结构如下图所示,最底层为硬件,内核中集成了KVM的模块,使内核能够成为VMM,直接监控虚拟机的操作,往上为全虚拟化模拟的所有硬件,在虚拟硬件上面跑虚拟操作系统。

这里写图片描述

需要注意的是,kvm本身并不执行任何设备模拟,设备模拟的操作通过用户空间程序QEMU完成。QEMU本身并不是KVM的一部分,本身QEMU就是一个著名的开源虚拟机软件。

KVM在QEMU的基础上进行了修改,虚拟机运行期间,QEMU会通过KVM模块提供的系统调用进入内核,由KVM模块负责将虚拟机置于处理器的特殊模式运行。

可以说,QEMU使用了KVM模块的虚拟化功能,而KVM的输入输出操作,则由QEMU来负责解析和模拟这些设备。

KVM可以选择其他的用户空间程序作为虚拟机的实现,QEMU也可以选择其他虚拟化技术来提升整体性能,而目前来看,QEMU和KVM的结合是最为成熟的一套虚拟化解决方案。

总的而言:kvm就是一套基于硬件的全虚拟化产品。

构建KVM运行环境

硬件配置

我们现在知道,kvm属于一个基于硬件的全虚拟化的方案,首先要求CPU能够支持VT技术,并且需要在BIOS当中将其虚拟化功能打开。在BIOS中,我们可以通过Advanced–>Intel(R) Virtualization Tech参数来打开有硬件虚拟化的支持(不同BIOS设置方式略有不同)。此外,在下图我们还可以看到一个参数:Intel VT-d参数,该参数也建议打开,VT-d是对设备I/O的虚拟化硬件支持。

这里写图片描述

BIOS设置完成之后,保存退出,系统重启后生效。

系统启动完成之后,也可以来看一下当前宿主机是否支持硬件虚拟化

[root@workstation0 ~]# cat /proc/cpuinfo
processor   : 0
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
stepping    : 3
microcode   : 0x1
cpu MHz     : 3600.040
cache size  : 4096 KB
physical id : 0
siblings    : 1
core id     : 0
cpu cores   : 1
apicid      : 0
initial apicid  : 0
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon rep_good nopl eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm tpr_shadow vnmi ept fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt
bogomips    : 7200.08
clflush size    : 64
cache_alignment : 64
address sizes   : 42 bits physical, 48 bits virtual
power management:

processor   : 1
vendor_id   : GenuineIntel
cpu family  : 6
model       : 60
model name  : Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
stepping    : 3
microcode   : 0x1
cpu MHz     : 3600.040
cache size  : 4096 KB
physical id : 1
siblings    : 1
core id     : 0
cpu cores   : 1
apicid      : 1
initial apicid  : 1
fpu     : yes
fpu_exception   : yes
cpuid level : 13
wp      : yes
flags       : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon rep_good nopl eagerfpu pni pclmulqdq vmx ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm tpr_shadow vnmi ept fsgsbase tsc_adjust bmi1 avx2 smep bmi2 invpcid xsaveopt
bogomips    : 7200.08
clflush size    : 64
cache_alignment : 64
address sizes   : 42 bits physical, 48 bits virtual
power management:

如果说看到“vmx”或者“svm”的标志,则意味着当前CPU支持虚拟化。Intel的标志为vmx,而AMD系列CPU的标志则为svm。

kvm模块加载

KVM是基于内核的虚拟化技术,我们如果要运行kvm,必须检查当前内核是否支持KVM。

可以通过以下两种方案来进行查看。

1)查看内核配置文件中是否有KVM相关参数。

[root@workstation0 boot]# grep KVM /boot/config-3.10.0-327.el7.x86_64 
CONFIG_KVM_GUEST=y
# CONFIG_KVM_DEBUG_FS is not set
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_IRQFD=y
CONFIG_HAVE_KVM_IRQ_ROUTING=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_HAVE_KVM_MSI=y
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
CONFIG_KVM_VFIO=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM=m
CONFIG_KVM_INTEL=m
CONFIG_KVM_AMD=m
CONFIG_KVM_MMU_AUDIT=y
# CONFIG_KVM_DEVICE_ASSIGNMENT is not set

2)查看kvm内核模块是否加载

[root@workstation0 boot]# lsmod | grep kvm
kvm_intel             162153  0 
kvm                   525259  1 kvm_intel

如看到以上参数情况,则代表kvm基础环境已构建完成。

QEMU的运行工具

qemu安装的软件工具如下,qemu-img主要提供I/O设备的虚拟化,qemu-kvm提供了qemu和kvm的集成。

[root@workstation0 ~]# rpm -qa | grep qemu
ipxe-roms-qemu-20130517-7.gitc4bce43.el7.noarch
qemu-img-1.5.3-105.el7.x86_64
qemu-kvm-common-1.5.3-105.el7.x86_64
libvirt-daemon-driver-qemu-1.2.17-13.el7.x86_64
qemu-guest-agent-2.3.0-4.el7.x86_64
qemu-kvm-1.5.3-105.el7.x86_64

KVM管理工具libvirt

在简单了解了相关虚拟化技术之后,我们就可以着手开始操作kvm的虚拟机。在管理KVM虚拟化的工具中,最为出名的就是libvirt工具,libvirt工具会提供一些应用程序接口、守护进程以及管理工具。

libvirt最初是为XEN而设计的一套API,然而目前已经能够支持多种虚拟化方案,包括QEMU、Xen、KVM、VMware等,尤其是对于QEMU/kvm的支持是非常成熟且稳定的。libvirt也是一个跨平台的工具,支持微软的hyper-V虚拟化,在windows上也可以安装libvirt。

libvirt的安装

在这里我们可以通过yum的方式安装libvirt所需要的软件包。在当前环境下,我们总共安装了以下的软件包。

[root@workstation0 ~]# rpm -qa | grep libvirt
libvirt-client-1.2.17-13.el7.x86_64
libvirt-glib-0.1.9-1.el7.x86_64
libvirt-daemon-kvm-1.2.17-13.el7.x86_64
libvirt-daemon-driver-interface-1.2.17-13.el7.x86_64
libvirt-daemon-driver-network-1.2.17-13.el7.x86_64
libvirt-daemon-driver-nodedev-1.2.17-13.el7.x86_64
libvirt-daemon-config-nwfilter-1.2.17-13.el7.x86_64
libvirt-daemon-driver-qemu-1.2.17-13.el7.x86_64
libvirt-gconfig-0.1.9-1.el7.x86_64
libvirt-daemon-driver-nwfilter-1.2.17-13.el7.x86_64
libvirt-daemon-driver-secret-1.2.17-13.el7.x86_64
libvirt-daemon-driver-lxc-1.2.17-13.el7.x86_64
libvirt-daemon-driver-storage-1.2.17-13.el7.x86_64
libvirt-1.2.17-13.el7.x86_64
libvirt-daemon-config-network-1.2.17-13.el7.x86_64
libvirt-python-1.2.17-2.el7.x86_64
libvirt-daemon-1.2.17-13.el7.x86_64
libvirt-gobject-0.1.9-1.el7.x86_64

libvirt的使用

要使用libvirt工具进行管理,首先先要将libvirtd服务起来。

libvirt常用工具如下:

工具 作用
virsh 用以管理配置虚拟化环境中guestOS的命令行工具
virt-manager 用于管理配置虚拟化环境中guestOS的图形化界面工具
virt-install 用以安装虚拟机的命令行工具
virt-top 用以展示虚拟化客户机运行状态的工具
virt-viewer 用以打开guestOS的控制台。

一. 安装虚拟机

可以通过virt-install命令行工具或者virt-manager工具来进行安装

二. virsh指令

virsh指令使用libvirt API实现了很多功能来管理hypervisor、guestOS,实现了多数对于qemu的调配,可以通过man virsh来查看virsh能够使用的参数。

下表列举了virsh指令常用的一些参数:

命令 功能描述
list 获取当前节点上所有虚拟机的列表
dominfo 查看某虚拟机的状态信息
vcpuinfo 查看某虚拟机vcpu状态信息
setvcpu 设定一个虚拟机的vcpu个数
suspend 暂停一个虚拟机
resume 恢复一个虚拟机
shutdown 正常关闭虚拟机
reboot 重启虚拟机
reset 强制重启虚拟机(类似于按下物理机电源上的reset按键)
destroy 给虚拟机断电
save 保存虚拟机状态至一个文件中
restore 从文件中恢复虚拟机的运行状态
net-list 列出libvirt管理的虚拟网络
net-create 根据xml文件创建一个网络
net-edit 编辑一个虚拟网络的xml配置文件
net-destroy 销毁一个虚拟网络
define 根据xml文件定义一个虚拟机配置
undefine 销毁一个虚拟机配置
dumpxml 以xml格式转存一个虚拟机的信息至标准输出
pool-list 查询libvirt管理的存储池
pool-info 查询存储池信息
pool-create 创建一个存储池
pool-destroy 关闭一个存储池
pool-delete 删除一个存储池
vol-list 查询一个存储池中存储卷的列表。
vol-create 根据xml配置创建一个存储卷
vol-clone 克隆一个存储卷
vol-delete 删除一个存储卷
migrate 迁移虚拟机
help 查看帮助信息

三. 使用libvirt配置虚拟机

在我们上述使用virsh指令过程中,就可以看到,很对地方的配置都是通过xml方式来完成的,包括虚拟机的定义配置文件,包括网络、存储、等等都是通过xml来进行配置。那么到底该如何定义我们的xml配置文件呢?

我们先来查看一个虚拟机的配置文件:在这个配置文件中,”\“的符号都为注释字符,我们下面会一一来分析每一个字段的作用。

<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
  virsh edit workstationa
or other application using the libvirt API.
-->

<domain type='kvm'>
  <name>workstationa</name>
  <uuid>e4725575-cc0d-4063-beae-f6286a6f8868</uuid>
  <memory unit='KiB'>3145728</memory>
  <currentMemory unit='KiB'>3145728</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
    <boot dev='cdrom'/>
    <bootmenu enable='no'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='host-passthrough'/>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/up320-workstationa-vda.ovl'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/up320-workstationa-vdb.ovl'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
    <controller type='usb' index='0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
    </controller>
    <controller type='pci' index='0' model='pci-root'/>
    <interface type='bridge'>
      <mac address='52:54:00:00:00:0a'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
    <interface type='bridge'>
      <mac address='52:54:00:01:00:0a'/>
      <source bridge='virbr1'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='spice' autoport='yes' listen='127.0.0.1'>
      <listen type='address' address='127.0.0.1'/>
    </graphics>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' 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='0x07' function='0x0'/>
    </memballoon>
  </devices>
</domain>
1. 基础虚拟机信息的配置
<domain>
    ....
  <name>workstationa</name>  <!-- 虚拟机的名字 -->
  <uuid>e4725575-cc0d-4063-beae-f6286a6f8868</uuid> <!-- 虚拟机唯一的uuid,16进制的标识符号 -->
    ....
</domain>
2. cpu的配置
<domain>
  ....
  <vcpu placement='static'>2</vcpu>  <!--表示vcpu的个数-->
  <features>    <!-- 表示打开硬件的部分特性,这里代表打开了acpi,apic,pae等特性-->
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <cpu mode='host-passthrough'/>  <!--该参数代表直接将物理CPU暴露给虚拟机去使用,如果要实现嵌套虚拟化,需设置此参数 -->
  ....
</domain>
1) vcpu的设定:

在上述配置字段中,vcpu的个数设定为2个,对于vcpu的设定,其实可以有更细化的配置参数

<vcpu placement='static' cpuset"1-3,^2,5" current="1">2</vcpu>

这句话代表着vcpu允许到哪些物理cpu上执行,这代表vcpu允许被调度到1,3,5号cpu上运行,current代表启动客户机只给一个cpu,最多可以增加使用到两个。

2)cpu的模式:

也可以有多种,上述配置中我们设置的为host-passthrough,代表将物理CPU直接暴露给虚拟机。

cpu配置的模式可以有以下几种:

① custom 自定义cpu参数

② host-model 根据物理CPU的特性,选择一个最靠近标准的CPU,默认采用的是该策略。

③ host-passthrough 暴露物理CPU给虚拟机去使用。

3. 内存的配置

在xml文件中,内存配置字段如下

<memory unit='KiB'>3145728</memory>
<currentMemory unit='KiB'>3145728</currentMemory>

单位为K。可以看到,我们现在内存设置的大小为3145728,约3G左右,memory表示最大可用内存,而currentmemory标签中是启动时分配给虚拟机的内存大小,一般这两者的值会设置成一致。

4. 存储的配置

存储的xml定义字段如下:

 <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/up320-workstationa-vda.ovl'/>  <!--指定文件类型及路径-->
      <target dev='vda' bus='virtio'/>    <!--指定模拟方式,采用virtio-->
      <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>  <!--定义接口情况-->
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/var/lib/libvirt/images/up320-workstationa-vdb.ovl'/>
      <target dev='vdb' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

在kvm存储环境中,我们是以文件的方式来模拟硬盘,分配给虚拟机相应的使用空间,常用的文件格式主要有两种,一种是raw格式,另外一种是qcow2格式。

1)raw格式

raw格式我们又可以将其称为原始镜像格式,在可移植性上有一定优势。默认的qemu-img命令(之后详解)创建的raw格式文件其实属于非预占模式的文件格式,也就是说使用多少空间,才会占用多少空间。当然,raw格式的文件也可以由dd命令来创建,只是用dd命令创建的raw格式文件属于预占模式的文件。

创建raw格式磁盘文件的指令如下

[root@workstation0 images]# qemu-img create -f raw test.raw 1G
Formatting 'test.raw', fmt=raw size=1073741824 
[root@workstation0 images]# qemu-img info test.raw
image: test.raw
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0

或者通过dd命令来创建:

[root@workstation0 images]# dd if=/dev/zero of=./test1.raw bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 8.60973 s, 125 MB/s
[root@workstation0 images]# qemu-img info test1.raw
image: test1.raw
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G

调整raw格式文件大小,通过qemu-img resize指令即可完成

[root@workstation0 images]# qemu-img resize test.raw +1G
Image resized.
[root@workstation0 images]# qemu-img info test.raw
image: test.raw
file format: raw
virtual size: 2.0G (2147483648 bytes)
disk size: 0
[root@workstation0 images]# qemu-img resize test.raw -1G
Image resized.
[root@workstation0 images]# qemu-img info test.raw
image: test.raw
file format: raw
virtual size: 1.0G (1073741824 bytes)
disk size: 0
2)qcow2格式

qcow2是目前推荐的一种文件格式,能够支持较多的功能,比如快照、压缩等等,并且支持非预占模式,以节省空间。

创建方式如下:

[root@workstation0 images]# qemu-img create -f qcow2  test2.qcow2 1G
Formatting 'test2.qcow2', fmt=qcow2 size=1073741824 encryption=off cluster_size=65536 lazy_refcounts=off 
[root@workstation0 images]# qemu-img info test2.qcow2 
image: test2.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 196K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false

调整qcow2文件大小,注意,qcow2格式支持扩大,但并不支持缩小。

[root@workstation0 images]# qemu-img resize test2.qcow2 +1G
Image resized.
[root@workstation0 images]# qemu-img info test2.qcow2 
image: test2.qcow2
file format: qcow2
virtual size: 2.0G (2147483648 bytes)
disk size: 260K
cluster_size: 65536
Format specific information:
    compat: 1.1
    lazy refcounts: false
[root@workstation0 images]# qemu-img resize test2.qcow2 -1G
qemu-img: qcow2 doesn't support shrinking images yet
qemu-img: This image does not support resize
5.kvm的网络配置

kvm的网络配置方案有三种,分别是Bridge、NAT以及HOST模式。其中bridge和NAT较为常用,HOST模式在这里不做详解。

1)NAT模式

使用NAT模式,能够让guestOS借助hostOS的NAT(网络地址转换)功能,通过宿主机器所在的网络来访问外部环境,也就是说,使用NAT模式可以实现在虚拟系统里访问互联网。

2)Bridge模式

使用bridge模式,即虚拟网桥的网络连接方式,可以使虚拟机成为网络中具有独立IP的主机。这种方式最简单,直接将虚拟网卡桥接到一个物理网卡上面,和linux下一个网卡绑定两个不同地址类似,实际上是将网卡设置为混杂模式,从而达到侦听多个IP的能力。

6.剩余配置项概览

剩余配置项自行阅读,不做重点

  <input type='mouse' bus='ps2'/>  <!--输入设备-->
  <input type='keyboard' bus='ps2'/> 
   <graphics type='spice' autoport='yes'>  <!--图形-->
      <image compression='off'/>
    </graphics>
    <sound model='ich6'>  <!--声卡-->
      <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </sound>
    <video>   <!--显卡-->
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </video>
    <serial type='pty'>  <!--串口和控制台-->
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
   <controller type='usb' index='0' model='ich9-uhci1'>  <!--pci控制器-->
      <master startport='0'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0' multifunction='on'/>
    </controller>
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭