第二章 虚拟化技术

2.1 虚拟化技术简介

     如果把虚拟化技术比作打通任督二脉,那么打通这个"任督二脉"的方法有很多。在开源软件里面,主要是KVM和XEN。尽管OpenStack对KVM和Xen都支持,但是OpenStack对KVM的支持明显要比Xen做得好。

2.1.1 KVM

    基于内核的虚拟机KVM(Kernel-Based Virtual Machine)是2007年问世的开源虚拟化解决方案。KVM需要两个条件:硬件支持全虚拟化;操作系统为Linux。

    基于内核实现虚拟化,KVM包含了一个加载的内核模块kvm.io。此外,由于KVM对硬件x86架构的依赖,会需要一个处理器规范模块。处理器规范模块与处理器类型相关,如果使用的是Intel的CPU,那么就加载kvm-intel.ko;如果使用的是AMD的CPU,就加在kvm-amd.ko模块。当Linux内核加载KVM模块之后,KVM模块只负责对虚拟化的虚拟CPU、虚拟内存进行管理和调度。

     虚拟机只具备虚拟CPU、虚拟内存还是无法完成很多工作。虚拟机还是需要很多的外设,外设分为以下两种:

     (1)真实硬件设备:虚拟机如果要与这些真实的硬件设备交互,就需要利用Linux系统内核来进行管理。

     (2)虚拟的外部设备:虚拟机要与虚拟机的外设交互时,KVM需要借助另外一个虚拟化项目Qemu。同Qemu,KVM就能很好地与虚拟外设交互。实际上,Qemu中,也利用软件编写了很多虚拟机的外部设备。除非特别需要,很多外设都采用了Qemu的虚拟外设。

      从而可以看出,KVM本身只关注与虚拟机调度、内存管理这两大方面。外设的任务交给Linux内核、Qemu。因此,KVM是一个轻量级的Hypervisor,显得小巧灵活。正是由于KVM轻量级的特性,在很多Linux的发行版中,已将KVM加入的虚拟化解决方案中。

2.1.2 Xen

     Xen是2003年有剑桥大学研发的开源Hypervisor。Xen与KVM不同的是:当硬件不具备虚拟化能力的时候,Xen可以采用半虚拟化(Para-Virtualization)的方式来运行虚拟机。

     Xen的开发要比KVM早,因此从技术上而言,Xen更加成熟。也正是由于Xen的成熟性、稳定性以及消耗资源少的特点,在国内外都得到了大规模的使用。

     Xen设计时,为了提高虚拟化的性能,物理部件都可以直接交付给虚拟机使用(称为passthru)。这种处理,却是以牺牲灵活性为代价的:Xen的安装,需要更新或修改Linux内核。由于Xen的虚拟化实现是直接与宿主机的内核绑定,安全性也会有所降低。

     虽然OpenStack也支持Xen虚拟机,但是支持的功能不能与KVM相比。

2.1.3 Libvirt

     在一个数据中心里面,有可能使用了不同的Hypervisor:早一些的服务器使用了Xen;新一批的服务器使用了KVM;也有可能是购置的商业虚拟化软件。由于时间、地域、部门、企业的关系,使用的Hypervisor都不会相同。能有一个统一的管理工具来管理各种各样的Hypervisor,并且能够提供统一的API来支持上层应用。

    Libvirt就是在这种情况下诞生的。Libvirt为多种Hypervisor提供一种统一的管理方式。Libvirt是一个软件的集合,包括API库、后台运行程序(Libvirtd)和命令行工具(virsh)。他为使用者提供了虚拟机管理和其他虚拟机设备管理。这些虚拟化设备包括:磁盘、虚拟网络、虚拟路由器、虚拟光驱等等。目前,Libvirt支持Xen、QEMU、LXC、OpenVZ和VirtualBox等Hypervisor。


2.2 安装Libvirt虚拟化工具

2.2.1 安装KVM 

    安装KVM顺序如下。

    (1)BIOS开启VT


注意:除了此项需要设置之外,如果发现VT-d Tech选型,也应该将此项开启。VT-d技术表述表示CPU支持直接I/O访问的虚拟化技术。如果在BIOS中,没有发现Virtualization字样,应该查询相应的CPU型号,已确认使用的CPU是否支持虚拟化。如果BIOS中虚拟化并没有开启,安装KVM之后,KVM模块仍然不能使用。

    (2)检测VT

     在BIOS中设置完毕之后,重新进入ubuntu系统,利用如下命令确认CPU是否支持虚拟化:


注意:如果输出为vmx或svm,就说明CPU支持虚拟化技术。其中vmx说明此CPU是Intel系列,采用了Intel-VT技术;svm则表示CPU是AMD系列,采用了AMD-V技术。

(3)安装KVM

[plain]  view plain  copy
  1. apt-get install qemu-kvm ubuntu-vm-builder bridge-utils  

安装完成之后,启用KVM内核模块:

[plain]  view plain  copy
  1. modprobe kvm  
  2. modprobe kvm_intel  
  3. modprobe kvm_amd  

注意:正常情况下,这些命令并不会有任何输出。如果有报错的情况,那么应该检查----BIOS中是否开启VT;CPU型号是否支持VT;某些系统安装完KVM之后,则表明重启才能正常使用。

安装完成之后,可以通过如下命令检查KVM是否安装成功。如果得到相应输出,则表明KVM已经安装成功。


当KVM模块安装完成之后,添加用户root到kvm组。


2.2.2 安装Libvirt

    安装Libvirt有两种方法:一种是通过源码编译安装(不是很建议采用这种方式);一种是通过apt-get安装。

1.源码安装Libvirt

源码安装Libvirt,首先需要安装好依赖环境。安装依赖环境命令如下:

依赖包安装完成之后,在下载Libvirt的源代码。在下载源码时,注意源码更新的时候,尽量选择较新的版本,当前所使用的版本为libvirt-0.10.2.tar.gz。当下载完成之后,可以采用如下方式进行安装。


安装完成之后,运行如下命令启动Libvirt后台进程:


注意:-d表示后天运行,会将日志输出到/var/log/libvirt/libvirtd.log;如果不带-d参数,那么会直接输出到终端。

Libvirt源码位于https://libvirt.org/sources/.

2.apt-get安装Libvirt

    与源码安装相比,apt-get安装就显得简单快捷。apt-get安装的好处在于会自动解决依赖关系,并且做好相应配置。只需要运行如下命令:

[plain]  view plain  copy
  1. root@ubuntu-virtual-machine:~# apt-get install libvirt-bin qemu virt-manager  
安装完成之后,可以通过以下步骤来检测安装是否成功。

(1)启动服务

首先启动Libvirtd服务:


(2)管理界面

也可以通过virt-manager管理界面来检测。打开终端,运行如下命令:


2.3 虚拟机配置文件详解

2.3.1 xml描述Hypervisor

Libvirt的xml分为以下几个重要部分。首先看整体结构:

[plain]  view plain  copy
  1. <domain type='kvm'>  
  2.   虚拟机整体信息  
  3.   系统信息  
  4.   硬件资源特性  
  5.   突发事件处理  
  6.   虚拟磁盘(单个或多个)  
  7.   虚拟光盘(可选)  
  8.   虚拟网络(单个或者多个)  
  9.   vnc/spice配置  
  10. </domain>  

    在Libvirt官方文档里面,将虚拟机定义为domain,而不是vm(virtual machine)。Xen中Domain 0表示宿主机系统。而在KVM中,domain完全指虚拟机系统。

    type一项指明了使用的那种虚拟化技术。如果使用的是KVM,那么值为kvm。如果使用的是Xen。当然,如果使用的是其他的hypervisor,值也不尽相同。首先看一下xml文件示例:

https://github.com/JiYou/openstack/blob/master/chap03/cloud/_base/back

[html]  view plain  copy
  1. <domain type='kvm'>             # 描述hypervisor  
  2.   <name>%VM_NAME%</name>        # 定义虚拟机整体信息  
  3.   <uuid>%UUID%</uuid>  
  4.   <memory>1048576</memory>  
  5.   <currentMemory>1048576</currentMemory>  
  6.   <vcpu>1</vcpu>  
  7.   <os>                          # 系统信息  
  8.     <type arch='x86_64' machine='pc-0.14'>hvm</type>  
  9.     <boot dev='cdrom'/>         # 默认从cdrom启动,安装系统时需要,不用则删除此行  
  10.     <boot dev='hd'/>  
  11.     <bootmenu enable='yes'/>  
  12.   </os>  
  13.   <cpu match='exact'>  
  14.    <model>core2duo</model>  
  15.    <feature policy='require' name='vmx'/>  
  16.   </cpu>  
  17.   <features>                    # 硬件资源特性  
  18.     <acpi/>  
  19.     <apic/>  
  20.     <pae/>  
  21.   </features>  
  22.   <clock offset='localtime'/>      
  23.   <on_poweroff>destroy</on_poweroff>     # 突发事件处理  
  24.   <on_reboot>restart</on_reboot>  
  25.   <on_crash>restart</on_crash>  
  26.   <devices>                              # 外设资源  
  27.     <emulator>/usr/bin/kvm</emulator>  
  28.     <disk type='file' device='disk'>     # 描述虚拟磁盘image  
  29.       <driver name='qemu' type='qcow2' cache='none'/>  
  30.       <source file='%IMAGE_PATH%'/>  
  31.       <target dev='vda' bus='virtio'/>  
  32.       <alias name='virtio-disk0'/>  
  33.     </disk>  
  34.   
  35.     <disk type='file' device='cdrom'>               # 添加虚拟光盘  
  36.       <driver name='qemu' type='raw'/>  
  37.       <source file='%ISO_PATH%'/>  
  38.       <target dev='hdb' bus='ide'/>  
  39.       <readonly/>  
  40.       <address type='drive' controller='0' bus='1' unit='0'/>  
  41.     </disk>  
  42.   
  43.     # 从硬盘启动时需要,可删除  
  44.     <disk type='file' device='disk'>  
  45.       <driver name='qemu' type='raw' cache='none'/>  
  46.       <source file='%RAW_DISK_PATH%'/>  
  47.       <target dev='vdb' bus='virtio'/>  
  48.       <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>  
  49.     </disk>  
  50.   
  51.   
  52.     <controller type='ide' index='0'>  
  53.       <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>  
  54.     </controller>  
  55.     <controller type='fdc' index='0'/>  
  56.     # 虚拟网络配置,基于网桥  
  57.     <interface type='bridge'>  
  58.       <mac address='%MAC%'/>  
  59.       <source bridge='br100'/>  
  60.       <target dev='vnet0'/>  
  61.       <alias name='net0'/>  
  62.       <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>  
  63.     </interface>  
  64.     # 虚拟网络,基于虚拟局域网配置  
  65.     <interface type='network'>  
  66.       <mac address='%MAC2%'/> <!-- 192.168.222.%IP1% -->  
  67.       <source network='default'/>  
  68.       <target dev='vnet1'/>  
  69.       <alias name='net1'/>  
  70.       <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>  
  71.     </interface>  
  72.     
  73.     <interface type='network'>  
  74.       <mac address='%MAC3%'/> <!-- 192.168.111.%IP2% -->  
  75.       <source network='default'/>  
  76.       <target dev='vnet2'/>  
  77.       <alias name='net2'/>  
  78.       <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>  
  79.     </interface>  
  80.   
  81.     # 串口信息可以不用更改  
  82.     <serial type='pty'>  
  83.       <target port='0'/>  
  84.     </serial>  
  85.     <console type='pty'>  
  86.       <target type='serial' port='0'/>  
  87.     </console>  
  88.     <input type='tablet' bus='usb'/>  
  89.     <input type='mouse' bus='ps2'/>        # 注意更改vnc端口如下  
  90.     <graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0' keymap='en-us'>  
  91.       <listen type='address' address='0.0.0.0'/>  
  92.     </graphics>  
  93.     <sound model='ich6'>     # 从此往下的内容可以不用更改  
  94.       <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>  
  95.     </sound>  
  96.     <video>  
  97.       <model type='vga' vram='9216' heads='1'/>  
  98.       <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>  
  99.     </video>  
  100.     <memballoon model='virtio'>  
  101.       <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>  
  102.     </memballoon>  
  103.   </devices>  
  104. </domain>  

2.3.2 虚拟机整体信息

    描述完hypervisor信息之后,开始从整体上描述虚拟机所需资源。描述格式如下:

[html]  view plain  copy
  1. <name>%VM_NAME%</name>  
  2.   <uuid>%UUID%</uuid>  
  3.   <memory>1048576</memory>  
  4.   <currentMemory>1048576</currentMemory>  
  5. <vcpu>1</vcpu>  

    注意:描述的先后顺序.%XX%表示此处是一个用户自定义字符串,可以自行更改,比如将%NAME%更改为"redhatvm"。

    其中,第01行定义了虚拟机的名字。Libvirt可以通过虚拟机的名字对虚拟机进行管理。在同一个物理机上,虚拟机的名字必须要保证是唯一的。如果存在重名的情况,添加和创建虚拟机时,会失败。

    第02行定义的虚拟机的UUID。在同一台物理机上,UUID值也必须是唯一的,否则会出现冲突,进而导致创建虚拟机失败。UUID是一长串单调的字符串,用户也可以自行定义,不过更加妥善的办法是利用uuidgen命令生成:

[html]  view plain  copy
  1. root@openstack-virtual-machine:~# uuidgen  
  2. f864754e-6509-4f66-99ce-cbaa5e216852  

    第03-04行描述了虚拟机内存信息,通常以KB为单位。一般而言,为了方便内存的管理与分配,都将memory和currentMemory的值设置为同一值。

    第05行指明了分配的虚拟CPU的个数。单个虚拟机,最多可分配的虚拟CPU个数,可以通过如下命令确定:

[html]  view plain  copy
  1. root@openstack-virtual-machine:~# cat /proc/cpuinfo | grep processor | wc -l  
  2. 1  

    注意:不用的物理机输出值应该不相同,这里1表明最多可以有1个虚拟CPU供分配。在宿主机上,所有虚拟机的虚拟机CPU总和可以大于虚拟CPU数目。此时会导致虚拟机运算性能下降。

2.3.3 系统信息

    接下来则是对系统进行描述:

[html]  view plain  copy
  1. <os>  
  2.     <type arch='x86_64' machine='pc-0.14'>hvm</type>  
  3.     <boot dev='hd'/>  
  4.     <bootmenu enable='yes'/>  
  5. </os>  

    第02行描述了类型,arch='x86_64'首先指明了系统结构,在示例中采用的是64为x86架构。machine='pc-0.14'则指明了使用的机器类型。可以通过如下命令来查看本机支持的机器类型:

[html]  view plain  copy
  1. root@openstack-virtual-machine:~# qemu-system-x86_64 -M ?  
  2. Supported machines are:  
  3. pc-1.0-precise Ubuntu 12.04 Standard PC (alias of pc-1.0-qemu-kvm)  
  4. pc-1.0-qemu-kvm Ubuntu 12.04 Standard PC (default)  
  5. pc         Standard PC (alias of pc-1.0)  
  6. pc-1.0     Standard PC  
  7. pc-0.14    Standard PC  
  8. pc-0.13    Standard PC  
  9. pc-0.12    Standard PC  
  10. pc-0.11    Standard PC, qemu 0.11  
  11. pc-0.10    Standard PC, qemu 0.10  
  12. isapc      ISA-only PC  

    通常设置的值都是采用default所指向的值。接下来的hvm所代表的含义是hardware virtual machine,也就是基于硬件的虚拟化。实际上,第02行简写为<type>hvm</type>就可以了,其他选项的值,Libvirt会自动使用默认值。

    第03行表示了启动介质选项。<boot dev='hd'/>表示首先选择hard disk作为启动介质。第一启动介质也可以设置为其他选项,比如cdrom,floppy等可启动介质。

    第04行则表示是否开启启动选项菜单。<bootmenu enable='yes'/>表示开启启动项菜单。当虚拟机启动之后,按F12键可以进入启动菜单选项。如果要关闭,可以设置值为<bootmenu enable='no'/>。

2.3.4 硬件资源特型

[html]  view plain  copy
  1. <features>  
  2.    <acpi/>  
  3.    <apic/>  
  4.    <pae/>  
  5.  </features>  
  6. lt;clock offset='localtime'/>  

    第02-04行描述了硬件特性信息。其中acpi是指Advanced Configuration and Power Interface(高级配置与电源接口)。pae是指Physical Address Extension(pae),表示物理地址扩展。

    第06行描述了时钟设置,在这里直接使用本地本机时间。

2.3.5 突发事件处理

[html]  view plain  copy
  1.  <on_poweroff>destroy</on_poweroff>  
  2.   <on_reboot>restart</on_reboot>  
  3. <on_crash>restart</on_crash>  

    第01-03行定义了对3中不同的虚拟机突发事件的处理方式,当发生poweroff时,直接destroy虚拟机。当虚拟机reboot,crash的时候,会自动采用重启操作。用户也可以根据自己的需要,定制事件处理操作,比如<on_crash>destroy</on_crash>。

2.3.6 raw格式image

    在虚拟机技术或者云计算中,都使用image一词来表示虚拟磁盘。接下来是定义虚拟机需要使用的虚拟外设。可以说,这些虚拟外设是整个虚拟机配置文件的重点。所有的虚拟外设都包括在<devices></devices>中,格式如下:


    第02行emulator设置的值为/usr/bin/kvm,也就是使用KVM hypervisor。在Xen中,设置的值为<emulator>/usr/lib/xen/bin/qemu-dm</emulator>。

    添加虚拟机磁盘之前,需要知道如何制作一个image。通常用到的image格式有两种:raw和qcow2.这里先介绍raw格式image的制作与添加方法。

    制作一个raw格式的image命令如下:


    image格式不同时,xml描述格式也不相同。因此,在添加image时,应该用如下命令辨认image的格式:


    注意:file format:raw指明了此磁盘格式为raw格式。

    为虚拟机添加raw格式的image的时候,需要按照如下格式:


    注意:<disk type=type='file' device='disk'></disk>是一个整体,定义一个完整的虚拟磁盘。无论是KVM或Xen,写法都固定,唯一不同的是内部参数并不相同。

    第02行,指明了使用的image驱动为qemu,并且image格式为raw格式。

    第03行,指明了所使用的image路径。xml配置文件并不支持相对路径,路径需要使用全路径,如/var/lib/xen/images/win03.img。

    第04行,dev指明了添加的image作为第几个硬盘。第1个硬盘记为vda,第2个硬盘记为vdb,以此类推。bus代表了所使用的磁盘驱动类型,在这里使用的是virtio。virtio是一种高效的image数据传输方式,在条件允许的情况下,应该尽量选择这种设置方式。

    第05行,描述了image所使用的pci地址,此行省略亦可。如果一定要添加此行,注意在同一个配置文件中,两个设备不能有相同的slot编号。比如,示例中硬盘就独占了为0x06的编号。

2.3.7 qcow2格式image

    image除了使用raw格式之外,经常使用到的还有qcow2格式。创建一个qcow2格式image可以采用如下命令:


注意: 这里采用的是backing file方式来创建qcow2格式image。这里的40G并不会真正占用40G,只是限制了ubuntu-nova.qcow2文件最大的大小(这里的文件大小与image内部数据、分区大小都没有关联)。此外,当raw格式文件中安装的系统是Windows系列的时候,创建qcow2格式最后文件大小需要比raw格式大2-3倍。例如一个大小为30G的win7.raw格式文件,创建qcow2格式磁盘命令如下:qemu-img create -f qcow2 -o cluster_size=2M,backing_file=win7.raw windows-7.qcow2 60G。

    这里的ubuntu-nova.qcow2文件并不是一个独立的image。在使用时,需要与ubuntu-12.10.raw磁盘一起使用(需要保持backing_file绝对路径不变,qcow2文件可以移动)。利用qcow2格式image创建虚拟机如图2.4所示。


    虚拟机是直接与qcow2格式image交互。raw格式image作为backing file,对虚拟机而言,是完全透明的。实际上,qcow2文件采用的是写时复制策略。qcow2格式image只是保存了所有的更改数据,raw格式image中的数据不会发生丝毫变动。

注意:对backing_file的读操作可以进行,而写操作必须禁止。因此,一个backing_file可以被多个虚拟机采用qcow2的方式进行共享,因为此时虚拟机不会直接对backing_file进行写操作。

    那么虚拟机对虚拟磁盘的操作需要分成以下两部分:

  • 读操作:如果虚拟机并未更改数据,那么虚拟机会直接读取raw格式磁盘。如果对raw格式磁盘数据有所更改,那么虚拟机会读取qcow2磁盘上的数据。
  • 写操作:写操作时如果与raw虚拟磁盘上的数据并不相同,则将此部分数据保存至qcow2格式磁盘。

    可以看出无论是读或者写,都会有差异性的判断。因此,qcow2格式磁盘与直接使用raw格式磁盘相比,读写性能会略有下降。可以放心的是,这种性能上的损失并不明显,完全可以接受。

    采用qcow2格式image,好处有两点: 

    第一点:并不会像raw格式image一样,创建的同时,就会占用掉大量空间。比如创建一个20G的raw格式image,那么这个raw格式image会立马占用掉20G的空间。而qcow2格式文件则是采用动态增长策略。也就意味着,如果创建20G的qcow2格式image,如果没有数据写入,几乎不会占用空间。其空间的大小总是随着写入数据的多少而变化。

    再将第2个好处之前,先考虑一个问题:如何快速创建同样的10台ubuntu-12.10的虚拟机。假设已经具备一个ubuntu-12.10.raw格式的image(20G),这个image中已经安装好了ubuntu-12.10系统。

    第一种简单粗暴的办法是:复制ubuntu-12.10.raw文件10份,分别利用备份文件创建虚拟机。时间主要花费在复制image,复制的数据总量为200G。如图2.5所示。


    第2中简单优雅的办法是:利用ubuntu-12.10.raw文件作为backing file,创建10份qcow2格式image。再分别利用这些qcow2文件创建虚拟机。时间花费非常少,创建qcow2文件速度与运行ls命令一样快。利用这10份qcow2文件创建虚拟机,如图2.6所示。


    采用这种方式创建虚拟机,创建速度快得惊人。并且创建速度与raw格式磁盘大小没有关系。而简单得复制image的方法,则会随着raw格式image的大小,呈线性上升。在实际环境中,经常会遇到raw格式文件大小为100G-200G的情况,采用复制操作,浪费大量时间的同时,也占用了少空间。

    (1)qcow2格式image也可以不使用backing file。此时与raw格式image唯一的区别就是:qcow2格式image的大小可以动态增长。其他与raw格式并无太大区别。此时创建image命令如下:



    (2)qcow2格式的backing file强烈建议采用raw格式。

    将qcow2文件添加到虚拟机配置文件xml中。首先需要使用如下命令来判断一个虚拟磁盘是否是qcow2格式:


注意:有的qcow2格式磁盘并没有backing file这一项。

    如果使用的是qcow2格式的磁盘,那么虚拟机xml文件应该按照如下格式填写:


2.3.8 格式的选择



    总体来说,最后两项对应用的影响较大。有的应用需要使用快照,那么此时必然选择qcow2格式image。但是,如果是大规模数据存储的情况,使用qcow2格式image就不太适合。除去性能的比较之外,还有一个考虑则是数据删除之后的影响,即qcow2由于文件删除之后,数据仍然保留,会出现占用额外空间的情况。

2.3.9 多个image

    当要添加多个image的时候,需要注意两点:

    (1)确认要添加image的格式,属于raw或qcow2.

    (2)要添加image的次序。

    查看image格式可以使用qemu-img命令。这里作为示例,创建两个image:


    这里将main-disk.raw作为主盘,add-disk.raw作为从盘。那么xml文件应该描述如下:


2.3.10 虚拟光盘

    在虚拟机配置文件xml中,可以指定要使用的虚拟光盘。尽管虚拟机也可以使用真实的物理光驱,但是由于读取速度较慢,多个虚拟机难以共享等原因,尽量采用iso文件。iso文件读取速度快、易共享、易管理、环保又不易损坏。在Linux系统上,如果有光盘,制作一个iso极其简单,只需要运行如下命令:


    此外,很多网站都提供了Linux发行版系统,可以直接下载其iso文件,以供系统安装使用。当准备好iso文件之后,便可以添加iso至xml描述文件中。描述格式如下:


注意:iso文件属于raw格式的一种,除此之外,需要使用ide驱动读写。最后注意加上只读标志<readonly/>。

    虚拟光盘并不是虚拟机必须的,在下面两种情况需要用到:

    (1)安装操作系统(如果是采用pxe安装操作系统,那么可以不用虚拟光盘)。

    (2)向虚拟机传输数据,将数据打包成iso,再添加给虚拟机。

2.3.11 虚拟网络

1.桥接网络

    桥接网络主要是通过网桥,从而虚拟出多个"真实网卡"以提供给虚拟机使用,如图2.7所示。


    可以看出,通过网桥,每个虚拟机可以拥有"自己的网卡"。但是虚拟机的网卡的配置,却是受到真实网卡所在网络限制的。这也意味着,真实网卡处于哪个网络环境,虚拟网卡也处于什么样的网络环境。

    搭建网桥。新建网桥时,需要根据物理机所在网络环境做出配置。物理机所在网络环境,一般而言有两种:DHCP或静态IP。无论是采用DHCP或者静态IP地址,都应该更改/etc/network/interfaces网络配置文件。

2.DHCP网桥

    DHCP环境下,网络bridge配置如下(以单网卡为例):


    第01-02行都是配置loopback,不需要进行更改。第04-05行在配置真实网卡eth0。第07-12行都是在配置网桥br100.在配置网桥的时候,第07-08行的格式与第04-05行并没有什么不同,区别在于第09-12行指出br100是一个建立在eth0上的网桥。其中第09-12行,格式较为固定,添加在br100之后就可以了。

3.静态IP网桥

在Ubuntu中创建网桥https://blog.csdn.net/swimming_in_it_/article/details/5314299

[html]  view plain  copy
  1. root@ubuntu-virtual-machine:~# vim /etc/network/interfaces  
  2. root@ubuntu-virtual-machine:~# cat /etc/network/interfaces  
  3. # interfaces(5) file used by ifup(8) and ifdown(8)  
  4. auto lo  
  5. iface lo inet loopback  
  6. auto eth0  
  7. iface eth0 inet static  
  8.     address 192.168.240.137  
  9.     netmask 255.255.255.0  
  10.     broadcase 192.168.240.255  
  11.     gateway 192.168.240.2  
  12.     dns-nameserver 223.5.5.5  
  13. auto br100  
  14. iface br100 inet static  
  15.   bridge_ports eth0  
  16.   bridge_stp off  
  17.   bridge_maxwait 0  
  18.   bridge_fd 0  
  19.   address 192.168.240.137  
  20.   netmask 255.255.255.0  
  21.   broadcast 192.168.240.255  
  22.   gateway 192.168.240.2  
  23. root@ubuntu-virtual-machine:~# /etc/init.d/networking restart  
  24. stop: Job failed while stopping  
  25. start: Job is already running: networking  

    静态IP情况下的网桥配置,与动态IP情况下的基本一样。需要修改的有两处:

    (1)需要把dhcp改为static。

    (2)在真实网卡eth0和网桥br100下方添加网络信息。

4.基于网桥的虚拟网卡

    建立网桥之后,需要查看一下br100是否生效。可以通过如下命令查看:

[html]  view plain  copy
  1. root@ubuntu-virtual-machine:~# ifconfig br100  
  2. br100     Link encap:以太网  硬件地址 00:0c:29:ff:f9:91    
  3.           inet 地址:192.168.240.137  广播:192.168.240.255  掩码:255.255.255.0  
  4.           inet6 地址: fe80::20c:29ff:feff:f991/64 Scope:Link  
  5.           UP BROADCAST RUNNING MULTICAST  MTU:1500  跃点数:1  
  6.           接收数据包:10 错误:0 丢弃:0 过载:0 帧数:0  
  7.           发送数据包:62 错误:0 丢弃:0 过载:0 载波:0  
  8.           碰撞:0 发送队列长度:1000   
  9.           接收字节:1472 (1.4 KB)  发送字节:10119 (10.1 KB)  

    建立好br100之后,可以在xml中添加如下基于br100虚拟网卡信息:


    %MAC%变量可以通过如下命令生成,输出值即是%MAC%地址。


注意:字符串fa:92不可随意更改,否则网桥不易识别。一般利用网桥方式建立的网卡的MAC地址,多以fa:92开头。

5.基于虚拟局域网的虚拟网卡

    除了基于网桥的虚拟网卡之外,还可以建立基于虚拟局域网的虚拟网卡。此处的虚拟局域网可以使得位于同一台物理机的虚拟机再组成一个局域网。添加格式如下:


    %MAC2%的值,需要利用如下命令生成并替换:


注意:MAC地址开头字符串52:54不可随意更改,基于内部局域网的MAC地址多以52:54开头。

2.3.12 vnc配置

    一般而言,通过virt-manager生成的vnc配置都容易导致外部无法访问。其实只需要按照如下配置vnc:


2.4 制作image

    制作一个带操作系统的image大致有两种方法:virt-manager和virsh。virt-manager需要通过桌面环境才可以使用,而virsh可以直接在命令行中完成操作。这两种方式各有优缺点。下面将介绍如何新建一个虚拟机并且为这个虚拟机安装操作系统。

    这里制作的image用于作为qcow2磁盘的backing file,以供批量虚拟机使用。因此,创建image成功之后,需要将相应虚拟机删除(仅保留制作好的image),并且尽量不要去修改此image。除了不要直接利用此image创建虚拟机之外,也不要有其他人为读写进程对此image进行操作,比如挂载。

2.4.1 virt-manager创建image

1.创建虚拟机

(1)安装并启动virt-manager可以使用如下命令:

[html]  view plain  copy
  1. apt-get install virt-manager  
  2. virt-manager  

(2)在virt-manager开始运行之后,单击new按钮,创建一个新的虚拟机。


(3)单击Forward按钮之后


(4)安装虚拟机时,由于读取速度及共享的原因,强烈建议采用iso作为安装介质。


(5)设置好安装介质之后,单击Forward按钮,进入设置vcpu和内存的界面.


(6)单击Forward按钮,进入虚拟磁盘创建界面。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值