一、虚拟化技术概述

虚拟化[Virtualization]技术最早出现在20世纪60年代的IBM大型机系统,在70年代的System370系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器[VirtualMachineMonitor,VMM]的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机[VirtualMachine]实例。随着近年多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用,上的优势日益体现,不仅降低了IT成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。
虚拟化是一个广义的术语,对于不同的人来说可能意味着不同的东西,这要取决他们所处的环境。在计算机科学领域中,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。例如对物理内存的抽象,产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间[AddressSpace],而实际上,应用程序的代码和数据可能是被分隔成多个碎片页或段),甚至被交换到磁盘、闪存等外部存储器上,即使物理内存不足,应用程序也能顺利执行。

二、主流虚拟化方案介绍

1、虚拟化技术主要分类

  • 平台虚拟化(PlatformVirtualization)

针对计算机和操作系统的虚拟化。

  • 资源虚拟化(ResourceVirtualization)

针对特定的系统资源的虚拟化,比如内存、存储、网络资源等。

  • 应用程序虚拟化(ApplicationVirtualization)

包括仿真、模拟、解释技术等。

2、平台虚拟化技术分类

我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(ControlProgram,也被称为VirtualMachineMonitor或Hypervisor),隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。虚拟机中运行的操作系统被称为客户机操作系统(GuestOS),运行虚拟机监控器的操作系统被称为主机操作系统(HostOS),当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上(如VMWARE的ESX产品)。运行虚拟机的真实系统我们称之为主机系统。
操作系统级虚拟化(OperatingSystemLevelVirtualization)
在传统操作系统中,所有用户的进程本质上是在同一个操作系统的实例中运行,因此内核或应用程序的缺陷可能影响到其它进程。操作系统级虚拟化是一种在服务器操作系统中使用的轻量级的虚拟化技术,内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。
比较著名的有SolarisContainer,FreeBSDJail和OpenVZ等。
比如OPENVZ:这个平台是最便宜的VPS平台,在各个vps商那里都是价格最低的。OPENVZ本身运行在linux之上,它通过自己的虚拟化技术把一个服务器虚拟化成多个可以分别安装操作系统的实例,这样的每一个实体就是一个YPS,从客户的角度来看这就是一个虚拟的服务器,可以等同看做一台独立的服务器。OPENVZ虚拟化出来的VPS只能安装linux操作系统,不能安装windows系统,比如Centos、Fedora、Gentoo、Debian等。不能安装windows操作系统是openvz的第一个缺点,需要使用windows平台的用户不能使用OPENVZVPS。
OPENVZ的第二个缺点是OPENVZ不是完全的虚拟化,每个YPS账户共用母机内核,不能单独修改内核。好在绝大多少用户根本不需要修改内核,所以这个缺点对多数人可以忽略不计。而这一点也正是qpenvz的优点,这一共用内核特性使得qpenvz的效率最高,超过KVM、Xen、VMware等平台。在不超售的情况下,openvz是最快速效率最高的VPS平台。
部分虚拟化(PartialVirtualization)
VMM只模拟部分底层硬件,因此客户机操作系统不做修改是无法在虚拟机中运行的,其它程序可能也需要进行修改。在历史上,部分虚拟化是通往全虚拟化道路上的重要里程碑,最早出现在第一代的分时系统CTSS和IBMM44/44X实验性的分页系统中。
全虚拟化(FullVirtualization)
全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作,系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。
操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。全虚拟化VMM以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。举例而言,x86体系结构中,对于操作系统切换进程页表的操作,真实硬件通过提供一个特权CR3寄存器来实现该接口,操作系统只需执行”movpgtable,%%cr3”汇编指令即可。
全虚拟化VMM必须完整地模拟该接口执行的全过程。如果硬件不提供虚拟化的特殊支持,那么这个模拟过程将会十分复杂:一般而言,VMM必须运行在最高优先级来完全控制主机系统,而GuestOS需要降级运行,从而不能执行特权操作。当GuestOS执行前面的特权汇编指令时,主机系统产生异常(GeneralProtectionException),执行控制权重新从GuestOS转到VMM手中。VMM事先分配一个变量作为影子CR3寄存器给GuestOS,将pgtable代表的客户机物理地址(GuestPhysicalAddress)填入影子CR3寄存器,然后VMM还需要pgtable翻译成主机物理地址(HostPhysicalAddress)并填入物理CR3寄存器,最后返回到GuestOS中。随后VMM还将处理复杂的GuestOS缺页异常(PageFault)。
比较著名的全虚拟化VMM有MicrosoftVirtualPC、VMwareWorkstation.SunVirtualBox、Parallels 、DesktopforMac和QEMU。
超虚拟化(Paravirtualization)
这是一种修改GuestOS部分访问特权状态的代码以便直接与VMM交互的技术。在超虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过Hypercall(VMM提供给GuestOS的直接调用,与系统调用类似)的方式来提供。例如,GuestOS把切换页表的代码修改为调用Hypercall来直接完成修改影子CR3寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,超虚拟化可以大幅度提高性能,比较著名的VMM有Denali、Xen。
硬件辅助虚拟化(Hardware-AssistedVirtualization)
硬件辅助虚拟化是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例如有了Intel-VT技术的支持,GuestOS和VMM的执行环境自动地完全隔离开来,GuestOS有自己的””套寄存器”,可以直接运行在最高级别。因此在上面的例子中,GuestOS能够执行修改页表的汇编指令。Intel-VT和AMD-V是目前x86体系结构上可用的两种硬件辅助虚拟化技术。
这种分类并不是绝对的,一个优秀的虚拟化软件往往融合了多项技术。例如VMwareWorkstation是一个著名的全虚拟化的VMM,但是它使用了一种被称为动态二进制翻译的技术把对特权状态的访问转换成对影子状态的操作,从而避免了低效的Trap-And-Emulate的处理方式,这与超虚拟化相似,只不过超虚拟化是静态地修改程序代码。对于超虚拟化而言,如果能利用硬件特性,那么虚拟机的管理将会大大简化,同时还能保持较高的性能。

三、KVM技术简介

资源与参考资料Redhat官方文档
https://access.redhat.com/documentation
Virtualization Getting Started Guide
Virtualization Deployment and Administration Guide
Virtualization Tuning and Optimization Guide
Virtualization Security Guide
KVM主页
http://www.linux-kvm.org/
提供了KVM的详细信息,以及大量信息来源和相关站点的链接
libvirt Virtualization API网站
http://www.libvirt.org/
提供了有关该API、所支持的虚拟化抽象及其使用的XML格式的详细信息。

1、KVM架构

image.png

2、kvm架构解析

从rhel6开始使用,红帽公司直接把KVM的模块做成了内核的一部分。
xen用在rhel6之前的企业版中默认内核不支持,需要重新安装带xen功能的内核
KVM针对运行在x86硬件上的、驻留在内核中的虚拟化基础结构。KVM是第一个成为原生Linux内核(2.6.20)的一部分的hypervisor,它是由AviKivity开发和维护的,现在归RedHat所有。
这个hypervisor提供x86虚拟化,同时拥有到PowerPC⑧和IA64的通道。另外,KVM最近还添加了对对称多处理(SMP)主机(和来宾)的支持,并且支持企业级特性,比如活动迁移(允许来宾操作系统在物理服务器之间迁移)。
KVM是作为内核模块实现的,因此Linux只要加载该模块就会成为一个hypervisor。KVM为支持hypervisor指令的硬件平台提供完整的虚拟化(比如Intel⑧VirtualizationTechnology[IntelVT]或AMDVirtualization[AMD-V]产品)。KVM还支持准虚拟化来宾操作系统,包括Linux和Windows@。
这种技术由两个组件实现。第一个是可加载的KVM模块,当在Linux内核安装该模块之后,它就可以管理虚拟化硬件,并通过/proc文件系统公开其功能。第二个组件用于PC平台模拟,它是由修改版QEMU提供的。QEMU作为用户空间进程执行,并且在来宾操作系统请求方面与内核协调。
当新的操作系统在KVM上启动时(通过一个称为KVM的实用程序),它就成为宿主操作系统的一个进程,因此就可以像其他进程一样调度它。但与传统的Linux进程不一样,来宾操作系统被hypervisor标识为处于”来宾”模式(独立于内核和用户模式)。
每个来宾操作系统都是通过/dev/KVM设备映射的,它们拥有自己的虚拟地址空间,该空间映射到主机内核的物理地址空间。如前所述,KVM使用底层硬件的虚拟化支持来提供完整的(原生)虚拟化。1/0请求通过主机内核映射到在主机上(hypervisor)执行的QEMU进程。
KVM在Linux环境中以主机的方式运行,不过只要底层硬件虚拟化支持,它就能够支持大量的来宾操作系统.

四、KVM软件安装

1、环境准备

2、查看CPU是否支持VT技术

  1. # vmx指当前CPU支持intel虚拟化,svm指支持ADM
  2. [root@foo~]# cat /proc/cpuinfo | grep -E 'vmx|svm'

3、清理环境:卸载KVM

  1. [root@foo~]# yum remove `rpm -qa | egrep 'qemu|virt|KVM'` -y
  2. # 存储磁盘镜像目录 /var/lib/libvirt
  3. [root@foo~]# rm -rf /var/1ib/libvirt /etc/1ibvirt/

4、安装软件

Centos6

  1. [root@foo~]# yum group install "Virtualization" "VirtualizationClient" "VirtualizationPlatform" "VirtualizationTools" -y

Centos7

  1. [root@foo~]# uname -r
  2. 3.10.0-1062.e17.x86_64
  3. [root@foo~]# yum install *qemu* *virt* librbdl-devel-y
  4. (在安装虚拟机出错的情况下,一般是操作系统的版本问题)
  5. [root@foo~]# yum upgrade

gemu-KVM:主包
libvirt:API接口
virt-manager:图形管理程序

在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvm
kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备;
qemu是模拟IO设备(网卡,磁盘),kvm加上qemu之后就能实现真正意义上服务器虚拟化。
因为用到了上面两个东西,所以一般都称之为qemu-kvm。
libvirt则是调用kvm虚拟化技术的接口用于管理的,用libvirt管理方便

Centos8
yum 组安装已经可以使用了
问题:在进行组安装的时候会出现关于rpm版本的错误问题
解决:

  1. [root@foo~]# yum upgrade rpm -y
  2. [root@foo~]# yum install virt-manager

组安装成功之后还是要单独安装virt-manager工具

5、启动服务

  1. [root@foo~]# systemct1 start libvirtd

6、查看KVM模块加载

  1. [root@foo~]# lsmod | grep KVM
  2. KVM_intel 53484 3
  3. KVM 316506 1 KVM_intel

五、GuestOS的安装

  • 图形方式(非常重要非常简单)
  • 完全文本模式(现场配置虚拟机的规格)
  • 命令行模式(重中之重最常用模板镜像+配置文件方式配置规格)
  • 通过飞机驾驶舱(web界面的应用)安装和管理虚拟机
    1. [root@foo~]# yum install cockpit -y
    2. [root@foo~]# systemct1 start cockpit

    访问: 浏览器访问 服务器地址:9090

1、图形模式安装GuestOS

  1. [root@foo~]# virt-manager

2、命令行模式安装

极端情况-服务器没有图形客户端也没有图形

  1. virt-install --connectqemu:///system -n vm6 -r 512 --disk path=/virhost/vmware/vm6.img,size=7 --os-type=1inux --os-variant=rhe16 --vcpus=1 --network bridge=br0 --location=http://127.0.0.1/rhe16u4 -x console=ttyS0 --nographics
  2. virt-install --connect qemu:///system -n vm9 -r 2048 --disk path=/var/lib/1ibvirt/images/vm9.img,size=7 --os-type=1inux --os-variant=centos7.0 --vcpus=1 --location=ftp://192.168.100.230/centos7u3 -x console=ttyS0 --nographics

—connectqumu 连接虚拟系统 也就是 hypervisor
-n 虚拟机name
-r 内存 RAM 单位m
—disk path 磁盘镜像路径
size 磁盘大小
—os-type 系统类型
—os-variant 系统版本
—cpus cpu数量
—location 安装服务器 需要将镜像挂载到ftp服务器上
-x 分配一个终端
—nographics 无图形界面

注意:
1.用这种方式安装的操作系统,大小写会胡乱变化,不影响远程操作
2.内存必须2G以上
查看KVM支持的OS版本:

  1. [root@foo~]# man virt-install
  2. [root@foo~]# osinfo-query os | grep centos

排错:
安装过程中:
手动配置IP地址
到url位置找不到路径,要返回去手动选择url,重新配置url为ftp://192.168.100.230/rhel6u4,这里的ip不要写127.0.0.1而是br0的ip
给虚拟机指定的内存必须大于2048M,不然报错如下
dracut-initqueue[552]: /sbin/dmsquash-live-root: line273: printf: write error: No space left on device

逃脱符:
Escape character is ^]

Kickstart安装
Kickstart是一种无人值守的安装方式
如果在安装过程中出现要填写参数的情况,安装程序首先会去查找
Kickstart生成的文件,如果找到合适的参数,就采用所找到的参数;
如果没有找到合适的参数,便需要安装者手工干预了

  1. virt-install\
  2. --name=vm1\
  3. --disk path=/vm/vm1 -disk1.qcow2\
  4. --vcpus=1--ram=1024\
  5. --network network=default\
  6. --graphics vnc,listen=0.0.0.0\
  7. --os-type=linux\
  8. --os-variant=rhel6\
  9. --location /iso/Centos-6.4-i386-bin-DVD1.iso\
  10. --extra-args="ks=http://192.168.1.11/mini.txt"

PXE安装

  1. virt-install --hvm --connect qemu:///system \
  2. --network=bridge:br0--pxe --graphics spice\
  3. --name=rhe16-machine --ram=756 --vcpus=4\
  4. --os-type=linux --os-variant=rhel6\
  5. --disk path=/var/lib/libvirt/images/rhel6-machine.img,size=10

image.png

3、文本模式安装

虚拟机的组成部分
1.虚拟机配置文件

  1. [root@foo~]# ls /etc/1ibvirt/qemu
  2. network svm1.xml

2.储存虚拟机的介质

  1. [root@foo~]# ls /var/lib/1ibvirt/images/
  2. vm1.img

根据配置文件创建虚拟机

  1. 1.拷贝模板镜像和配置文件
  2. [root@foo~]# cp vm1.img vm2.img
  3. [root@foo~]# cp vm1.xm1 vm2.xm1
  4. 2.修改配置文件
  5. vim /etc/1ibvirt/qemu/vm2.xm1
  6. 3.创建虚拟机:
  7. [root@foo~]# virsh define /etc/1ibvirt/qemu/vm2.xm1
  8. 4.重启一下:
  9. [root@foo~]# systemctl restart libvirtd
  10. 5.宿主机开启路由转发:
  11. [root@foo~]# vim /etc/sysct1.conf
  12. net.ipv4.ip_forward=1
  13. 6.sysctl -p 从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
  14. [root@foo~]# sysctl -p # 查看路由转发是否开启,未开启需要开启
  15. net.ipv4.ip_forward =1

4、实例

模板镜像+配置文件方式创建虚拟机

  1. #1.拷贝模板镜像和配置文件
  2. [root@foo~]# cp /var/1ib/1ibvirt/images/vm2.img /var/lib/libvirt/images/vm3.img
  3. [root@foo~]# cp /etc/1ibvirt/qemu/vm2.xm1 /etc/1ibvirt/qemu/vm3.xm1
  4. #2.修改配置文件
  5. [root@foo~]# vim /etc/1ibvirt/qemu/vm3.xm1
  6. <domain type='KVM'>
  7. <name>vm3</name>
  8. /* 修改项 */
  9. <uuid>a2f62549-c6b7-4b8f-a8e2-c14edda35a78</uuid>
  10. <memory unit='KiB'>2099200</memory>
  11. <currentMemory unit='KiB'>2099200</currentMemory>
  12. <vcpu placement='static'>2</vcpu>
  13. <os>
  14. <type arch='x86_64' machine='pc-i440fx-rhe17.0.0'>hvm</type>
  15. <boot dev='hd'/>
  16. </os>
  17. <features>
  18. <acpi/>
  19. <apic/>
  20. </features>
  21. <cpu mode='custom' match='exact' check='partial'>
  22. <model fallback='allow'>Haswe11-noTSX</model>
  23. </cpu>
  24. <clock offset='utc'>
  25. <timer name='rtc' tickpolicy='catchup'/>
  26. <timer name='pit' tickpelicy='delay'/>
  27. <timer name='hpet'present='no'/>
  28. </clock>
  29. <on_poweroff>destroy</on_poweroff>
  30. <on_reboot>restart</on_reboot>
  31. <on_crash>destroy</on_crash>
  32. <pm>
  33. <suspend-to-mem enab1ed='no'/>
  34. <suspend-to-disk enab1ed='no'/>I
  35. </pm>
  36. <devices>
  37. <emulator>/usr/1ibexec/qemu-KVM</emulator>
  38. <disk type='file' device='disk'>
  39. <driver name='qemu' type='qcow2'/>
  40. /* 修改项 虚拟机磁盘镜像文件 */
  41. <source file='/var/1ib/1ibvirt/images/vm3.qcow2'/>
  42. <target dev='vda' bus='virtio'/>
  43. <address type='pci' domain='Ox0000' bus='Oxoo' slot='0x06' function='0x0'/>
  44. </disk>
  45. <disk type='file' device='disk'>
  46. <driver name='qemu' type='qcow2'/>
  47. <source file='/var/1ib/libvirt/images/vm3-1.img'/>
  48. <target dev='vda' bus='virtio'/>
  49. <address type='pci' domain='0x0000' bus='0x00' slot='0x16' function='0x0'/>
  50. </disk>
  51. <controller type='usb' index='0' mode1='ich9-ehcil'>
  52. <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
  53. </controller>
  54. <controller type='usb' index='0' mode1='ich9-uhci1'>
  55. <master startport='0'/>
  56. <address type='pci' domain='Ox0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
  57. </controller>
  58. <controller type='usb' index='0' mode1='ich9-uhci2'>
  59. <master startport='2'/>
  60. <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
  61. </controller>
  62. <controller type='usb' index='0' model='ich9-uhci3'>
  63. <master startport='4'/>
  64. <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
  65. </controller>
  66. <controller type='pci' index='0' model='pci-root'/>
  67. <controller type='virtio-serial' index='0'>
  68. <address type='pci' domain='0x0000' bus='0x00' s1ot='0x05' function='0x0'/>
  69. </controller>
  70. <interface type='network'>
  71. /* 修改项 mac地址值只能修改后3组 */
  72. <mac address='52:54:00:f2:28:6f'/>
  73. <source network='default'/>
  74. <model type='virtio'/>
  75. <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  76. </interface>
  77. <serial type='pty'>
  78. <target type='isa-serial' port='0'>
  79. <model name='isa-serial'/>
  80. </target>
  81. </serial>
  82. <console type='pty'>
  83. <target type='serial' port='0'/>
  84. </console>
  85. <channel type='unix'>
  86. <target type='virtio' name='org.qemu.guest_agent.0'/>
  87. <address type='virtio-serial' controller='0' bus='0' port='1'/>
  88. </channel>
  89. <channel type='spicevmc'>
  90. <target type='virtio' name='com.redhat.spice.0'/>
  91. <address type='virtio-serial' controller='0' bus='0' port='1'/>
  92. </channel>
  93. <channel type='spicevmc'>
  94. <target type='virtio' name='com.redhat.spice.0'/>
  95. <address type='virtio-serial' controller='0' bus='0' port='2'/>
  96. </channel>
  97. <input type='tablet' bus='usb'>
  98. <address type='usb' bus='0' port='1'/>
  99. </input>
  100. <input type='mouse' bus='ps2'/>
  101. <input type='keyboard'bus='ps2'/>
  102. <graphics type='spice' autoport='yes'>
  103. <listen type='address'/>
  104. <image compression='off'/>
  105. </graphics>
  106. <sound model='ich6'>
  107. <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
  108. </sound>
  109. <video>
  110. <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='I' primary='yes'/>
  111. <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function=' 0x0'/>
  112. </video>
  113. <redirdev bus='usb' type='spicevmc'>
  114. <address type='usb' bus='0' port='2'/>
  115. </redirdev>
  116. <redirdev bus='usb' type='spicevmc'>
  117. <address type='usb' bus='0'port='3'/>
  118. </redirdev>
  119. <memballoon model='virtio'>
  120. <address type='pci' domain='0x0000' bus='0x00'slot='0x08'function='0x0'/>
  121. </memballoon>
  122. </devices>
  123. </domain>

5、常见问题解析

问题1:用图形安装guest os的时候卡住不动
解决:升级系统

[root@foo~]#yum upgrade -y

问题2:升级系统后安装guest os的时候还是-卡住不动
解决:需要在安装宿主机的时候安装兼容性程序
问题3:如果安装了各种兼容程序之后还是不行

  1. [root@model network-scripts] # rpm .q qemu-kvm
  2. qemu kvm 1.5.3 160. el7_6.2.x86_64
  3. [root@model network-scripts] # rpm - q qemu-kvm ev
  4. 未安装软件包qemu-kvm-ev
  5. [rootGmodel network-scripts] # rpm -qa | grep kvm
  6. oci- kvm-hook 0.3 1.el7.x86_64
  7. pcp- pmda-kvm 4.1.0-5.el7_6.x86_64
  8. qemu-kvm tools-1.5.3 160. el7_6.2. x86_64
  9. qemu kvm 1.5.3 160. el7_6.2.x86_64
  10. libvirt-daemon-kvm 4.5.0- 10. el7_6.10.x86_64
  11. qemu kvm common 1.5.3 160. el7_6.2. x86_64
  12. new problem: 有的同学安装的主包是:qemu-kvm-ev,但是这个包不能用,必须用qemu-kvm才行如果不解决会出现安装guestos的时候卡住的现象

如果所有问题都排查过后还是安装不上guestos,最后的原因就是在安装宿主机系统的时候各种兼容性软件没
有安装而且Yum也没有自动处理导致的

6、升级配置

1.修改配置文件(比如添加磁盘,那就添加如下配置)

root@test qemu]# vim vm1.xml

复制下面代码 修改之后就可以增加磁盘

  1. <disk type="file" device=" disk">
  2. <driver name="qemu" type=" qcow2"/>
  3. /* 镜像文件路径 */
  4. <source file="/var/lib/1ibvirt/images/vm3-1.qcow2"/>
  5. /* dev 磁盘名 需要修改 */
  6. <target dev="vda" bus="virtio"/>
  7. /* slot 插槽 需要修改*/
  8. <address type="pci" domain=" 0x0000" bus="0x00" s1ot="0x16" function="0x0"/>
  9. </disk>

特别注意:centos8里面硬盘和网-卡的添加已经不能修改slot了,要求修改的是bus地址

root@test qemu]# virsh define vm1.xml 错误:从vm1.xm1定义域失败 错误:XML错误:无效PCI地址0000:04:01.0。slot必须 <= 0

2.创建新的空磁盘卷:

[root@foo~]# qemu-img create -f qcow2 /var/lib/libvirt/images/vm3-1.qcow2 10G

3.重新定义:

[root@foo ~]# virsh define /etc/1ibvirtd/qemu/vm3.xm1

七、KVM存储

存储池管理

KVM必须要配置一个目录当作他存储磁盘镜像(存储卷)的目录,我们称这个目录为存储池
默认存储池

/var/lib/libvirt/imqges/

1.创建基于文件夹的存储池(目录)

[root@foo~]#mkdir-p /data/vmfs

2.定义存储池与其目录

将/data/vmfs 定义为一个存储池 池的名字时vmdisk [root@foo~]#virsh pool-define-as vmdisk —type dir —target /data/vmfs

3.创建已定义的存储池

(1)创建已定义的存储池

[root@foo ~]# virsh pool-build vmdisk

(2)查看已定义的存储池,存储池不激活无法使用。

[root@foo ~]# virsh pool-list —all

4.激活并设置已定义的存储池为开机自动启动

[root@foo ~]# virsh pool-start vmdisk [root@foo~]# virsh pool-autostart vmdisk

这里vmdisk存储池就已经创建好了,可以直接在这个存储池中创建虚拟磁盘文件了。

5.在存储池中创建虚拟机存储卷

[root@foo~]# virsh vol-create-as vmdisk oe1test03.qcow2 20G —format qcow2

  • 注1:KVM存储池主要是体现一种管理方式,可以通过挂载存储目录,1vm逻辑卷的方式创建存储池,虚拟机存储卷创建完成后,剩下的操作与无存储卷的方式无任何区别了
  • 注2:KVM存储池也要用于虚拟机迁移任务。

6.存储池相关管理命令

(1)在存储池中删除虚拟机存储卷

[root@foo ~]# virsh vo1-delete —pool vmdisk oe1test03.qcow2

(2)取消激活存储池

[root@foo ~]# virsh pool-destroy vmdisk

(3)删除存储池定义的目录/data/vmfs

[root@foo ~]# virsh pool-delete vmdisk

(4)取消定义存储池

[root@foo ~]# virsh pool-undefine vmdisk

到此KVM存储池配置与管理操作完毕。

生产环境存储池使用

添加Ivm和远程存储即可

磁盘格式

raw
原始格式,性能最好
qcow
先去网上了解一下cow(写时拷贝copyon write),性能远不能和raw相比, 所以很快天折了,所以出现了qcow2
qcow2
性能上还是不如raw,但是raw不支持快照,qcow2支持快照。
qed
现在默认安装好的用的是raw格式,所有做快照要把他转换成qcow2格式

写时拷贝

raw立刻分配空间,不管你有没有用到那么多空间
qcow2只是承诺给你分配空间,但是只有当你需要用空间的时候,才会给你空间。最多只给你承诺空间的大小,避免空间浪费
工作当中用哪个
看你用不用快照。工作当中虚拟机会有多个备份,一个坏了,再起一个就行了,所有没必要用快照。当然也不一定。数据绝对不会存储到本地。

创建磁盘文件

  1. 建立qcow2格式磁盘文件:
  2. [root@foo ~]# qemu-img create -f qcow2 test.qcow2 20G
  3. 建立raw格式磁盘文件:
  4. [root@foo ~]# qemu-img create -f raw test.raw 20G
  5. 查看已经创建的虚拟磁盘文件:
  6. [root@foo ~]# qemu-img info test.qcow2

挂载磁盘

作为虚拟化环境管理员,你肯定遇到过虚拟机无法启动的情况。实施排错时,你需要对虚拟机的内部进行检查。而Libguestfs Linux工具集可以在这种情况下为你提供帮助。
利用Libguestfs找出损坏的虚拟机文件
Libguestfs允许在虚拟机。上挂载任何类型的文件系统,以便修复启动故障。
使用Libguestfs,首先需要使用Libvirt。 Libvirt是一个管理接口,可以和KVM、Xen和其他一些基于Liunx的虚拟机相互连接。Libguestfs的功能更加强大, 可以打开Windows虚拟机上的文件。但是首先你需要将虚拟机迁移到libguestfs可用的环境当中,也就是Linux环境。
假如你是vmware的ESXI虚拟机,为了将虚拟机迁移到Linux当中,你可以使用SSH连接到ESXi主机,这意味着你首先需要启用ESXi主机上的SSH访问方式。完成之后,在Linux平台上运行下面的scp命令:

  1. # 查看磁盘镜像分区信息:
  2. [root@foo ~]#virt-df-h -dvm1
  3. Filesystem Size Used Available Use%
  4. vm1:/dev/sda1 484M 32M 428M 7%
  5. vm1:/dev/sdb1 3.5G 3.5G o 100%
  6. vm1:/dev/vo1Group/1v_root 6.1G 1.1G 4.7G 18%
  7. [root@foo ~]# virt-filesystems -d vm1
  8. /dev/sda1
  9. /dev/sdb1
  10. /dev/Vo1Group/1v_root
  11. # 挂载磁盘镜像分区:
  12. [root@foo ~]# guestmount -dvm1-m/dev/vda1 --rw/mnt
  13. # 取消挂载
  14. [root@foo ~]# guestunmount /mnt

注:mtab文件在centos7的启动过程中非常有用,删掉会导致不能启动

八、KVM管理

KVM基本管理

查看 启动 关闭 重启 重置 查看

  1. #查看虚拟机:
  2. [root@foo ~]# virsh list
  3. Id Name State
  4. ---------------------------------
  5. 2 vm1 running
  6. [root@foo ~]# virsh list --all
  7. ---------------------------------
  8. Id Name State
  9. 2 vm1 running
  10. #查看KVM虚拟机配置文件(X):
  11. [root@foo ~]# virsh dumpxm7 name
  12. #将node4虚拟机的配置文件保存至node6.xm1(X):
  13. [root@foo ~]# virsh dumpxm1 node4 >/etc/1ibvirt/ qemu/node6.xm1
  14. #修改node6的配置文件(X):
  15. [root@foo ~]# virsh edit node6
  16. 如果直接用vim编辑器修改配置文件的话,需要重启1ibvirtd服务
  17. #启动:
  18. [root@foo ~]# virsh start vm1
  19. Domain vml started
  20. #暂停虚拟机:
  21. [root@foo ~]# virsh suspend vm_name
  22. #恢复虚拟机:
  23. [root@foo ~]#virsh resume vm_name
  24. #关闭:
  25. 方法1:
  26. [root@foo ~]# virsh shutdown vm1
  27. Domain vm1 is being shutdown
  28. 方法2(X):
  29. [root@foo ~]#virsh destroy vm1
  30. Domain vm1 destroyed
  31. #重启:
  32. [root@foo ~]#virsh reboot vm1
  33. Domain vm1 is being reboote
  34. #重置:
  35. [root@foo ~]#virsh reset vm1
  36. Domain vm1 was reset
  37. #删除虚拟机:
  38. [root@foo ~]#virsh undefinevm2
  39. Domain vm2 has been undefined //注意:虚拟机在开启的情况下undefine是无法删除的,但是如果再destroy会直接被删除掉
  40. #虚拟机开机自动启动:
  41. [root@foo ~]#virsh autostart vm1
  42. #域vm1标记为自动开始
  43. [root@foo ~]# 1s /etc/libvirt/qemu/autostart/ //此目录默认不存在,在有开机启动的虚拟机时自动创建
  44. vm1.xm7
  45. [root@foo ~]# virsh autostart --disable vml //域vm1取消标记为自动开始
  46. #查看所有开机自启的guest os:
  47. [root@foo ~]# ls /etc/1ibvirt/qemu/autostart/
  48. [root@foo ~]# virsh list --all --autostart

虚拟机克隆

1.图形界面

Applications(左上角)——->System Tools ——->Virtual Machine Manager
关闭要克隆的虚拟机,右键点击虚拟机选择Clone

2.字符终端,命令克隆

  1. #-o origin
  2. [root@foo ~]# virt-clone -o vm1 --auto-clone
  3. WARNING设置图形设备端口为自动端口,以避免相互冲突。
  4. 正在分配"vm1-c1one.qcow2" |6.0 GB 00:00:05
  5. 成功克隆"vm1-clone"
  6. [root@foo ~]#virt-clone -o vm1 -n vm2 --auto-clone
  7. WARNING设置图形设备端口为自动端口,以避免相互冲突。
  8. 正在分配"vm2.qcow2" |6.0 GB 00:00:06
  9. 成功克隆"vm2"
  10. #-f,--file NEW_DISKFILE: 为新客户机使用新的磁盘镜像文件
  11. [root@qfebu.com~]#virt-clone -o vm1 -n vm2 -f
  12. /var/lib/1ibvirt/images/vm2.img
  13. 正在克隆"vm1.img" |8.0 GB 01:03
  14. clone"vm2" created successfully.

增量镜像

1、概述
实验目的:
通过一个基础镜像(node.img),里面把各个虚拟机都需要的环境都搭建好,然后基于这个镜像建立起一个个增量镜像,每个增量镜像对应一个虚拟机,虚拟机对镜像中所有的改变都记录在增量镜像里面,基础镜像始终保持不变。
功能:
节省磁盘空间,快速复制虚拟机。
环境:
基本镜像文件:node.img虚拟机D:node
增量镜像文件:node4.img虚拟机ID: node4
要求:
以基本镜像文件node.img为基础,创建一 个镜像文件node4.img,以此创建一 个虚拟机
node4,虚拟机node4的改变将存储于node4.img中。

2、创建增量镜像文件

  1. [root@foo~]#qemu-img create -b node.img -f qcow2 node4.img
  2. [root@foo~]#qemu-img info node4.img
  3. image:node4.img
  4. file format:qcow2
  5. virtual size:20G (21495808000 bytes)
  6. disk size:33M
  7. cluster_size: 65536
  8. backing file:node.img (actual path:node.img)
  9. #注:该实验只是针对qcow2格式的镜像文件,未测试raw格式的镜像文件是否可行。

3、创建虚拟机node4的XML配置文件

  1. [root@foo~]# cp /etc/1ibvirt/qemu/node.xm1 /etc/1ibvirt/qemu/node4.xm1
  2. [root@foo~]# vim /etc/1ibvirt/qemu/node4.xm1
  1. <domain type="KVM">
  2. <--#node4的虚拟机名,须修改,否则与基本虚拟机冲突-->
  3. <name>node4</name>
  4. <--#node4的UUID,必须修改,否则与基本虚拟机冲突-->
  5. <uuid>4b7e91eb-6521-c2c6-cc64-c1ba72707fe4</uuid>
  6. <memory>524288</memory>
  7. <currentMemory>524288</currentMemory>
  8. <vcpu cpuset="0-1">2</vcpu>
  9. <os>
  10. <type arch="x86_64" machine="rhe15.4.0">hvm</type>
  11. <boot dev="hd"/>
  12. </os>
  13. <features>
  14. <acpi/>
  15. <apic/>
  16. <pae/>
  17. </features>
  18. <clock offset="localtime"/>
  19. <on_poweroff>destroy</on_poweroff>
  20. <on_reboot>restart</on_reboot>
  21. <on_crash>restart</on_crash>
  22. <devices>
  23. <emulator>/usr/1ibexec/qemu-KVM</emulator>
  24. <disk type="file" device="disk">
  25. <driver name="qemu"
  26. type="qcow2"/>
  27. <--#将原指向/virhost/KVM_node/node.img改为node4.img-->
  28. <source file="/virhost/KVM_ node/node4.img"/>
  29. <target dev="vda" bus="virtio"/>
  30. <address type="pci" domain="Ox0000" bus="Ox00" s1ot="Ox04" function="0x0"/>
  31. </disk>
  32. <interface type="bridge">
  33. <--#修改网卡MAC,防止冲突-->
  34. <mac address="54:52:00:69:d5:f4"/>
  35. <source bridge="br0"/>
  36. <model type="virtio"/>
  37. <devices>

4、根据xml配置定义虚拟机node4

  1. [root@foo~]#virsh define /etc/1ibvirt/qemu/node4.xm1
  2. [root@foo~]#virsh start node4

5、测试

  1. [root@foo~]#du -h node.img
  2. 6.3G node.img
  3. [root@foo~]#du-h node4.img
  4. 33M node4.img
  5. [root@foo~]#dd if=/dev/zero of=test bs=1M count=200 #在虚拟机node4上增量200M大小文件
  6. 200+0 records in
  7. 200+0 records out
  8. 209715200 bytes (210 MB) copied, 1.00361 seconds209 MB/s
  9. [root@foo~]#du -h node.img #基本镜像文件node.img大小未变
  10. 6.3G node.img
  11. [root@foo~]#du-h node4.img #增量镜像文件node4.img增加200M了
  12. 234M node4.img

快照

为虚拟机vm8创建一个快照

  1. [root@foo~]#virsh snapshot-create-as vm8 vm8.snap
  2. error: unsupported confi guration: internal snapshot for disk vda unsupported for storage type raw

raw
使用文件来模拟实际的硬盘(当然也可以使用一 块真实的硬盘或一个分区)。由于原生的裸格式,不支持snapshot也是很正常的。但如果你使用LVM的裸设备,那就另当别论。说到LVM还是十分的犀利的目前来LVM的snapshot、性能、可扩展性方面都还是有相当的效果的。目前来看的话,备份的话也问题不大。就是在虚拟机迁移方面还是有很大的限制。但目前虚拟化的现状来看,真正需要热迁移的情况目前需求还不是是否的强烈。虽然使用LVM做虚拟机镜像的相关公开资料比较少,但目前来看牺牲一点灵活性,换取性能和便于管理还是不错的选择。
qcow2
现在比较主流的一种虚拟化镜像格式,经过一代的优化,目前qcow2的性能上接近raw裸格式的性能,这个也算是redhat的官方渠道了
对于qcow2的格式,几点还是比较突出的,qcow2的snapshot,可以在镜像上做N多个快照:

  • 更小的存储空间
  • Copy-on-write support
  • 支持多个snapshot,对历史snapshot进行管理
  • 支持zlib的磁盘压缩
  • 支持AES的加密

实战

  1. #为虚拟机vm2创建一个快照(磁盘格式必须为qcow2)
  2. [root@foo~]#virsh snapshot-create-as vm2 vm2.snap
  3. #查看磁盘文件格式
  4. [root@foo~]# qemu-img info /var/1ib/1ibvirt/images/vm2.qcow2
  5. image:/var/lib/1ibvirt/images /vm2.qcow2
  6. file format: qcow2
  7. virtual size:5.0G (5368709120 bytes)
  8. disk size:5.0G
  9. cluster_size: 65536
  10. Snapshot list:
  11. ID TAG VM SIZE DATE VM CLOCK
  12. 1 vm2.snap 0 2020-04-15 13:01:42 00:00:00.000
  13. Format specific information:
  14. compat: 1.1
  15. lazy refcounts: true
  16. [root@foo~]# virsh snapshot-list vm2
  17. Name Creation Time State
  18. ---------------------------------------------------
  19. vm2.snap 2020-04-15 13:01:42 +0800 shutoff
  20. #创建一快磁盘
  21. [root@foo~]# qemu-img create -f raw /var/lib/libvirt/images/vm2-1.raw 2G
  22. Formatting "/var/lib/libvirt/ images/vm2-1.raw",fmt=raw size=2147483648
  23. # 通过修改配置文件将其添加到vm2虚拟机上
  24. [root@foo~]# cd /etc/libvirt/qemu/
  25. [root@foo~]# vim vim2.xml
  1. <devices>
  2. <emulator>/usr/libexec/qemu- kvm</emulator>
  3. <--添加磁盘,复制########中间内容-->
  4. <--#####################################################-->
  5. <disk type="file" device="disk">
  6. <driver name="qemu" type="qcow2"/>
  7. <source file="/var/lib/libvirt/images/vm2.img"/>
  8. <target dev="vda" bus="virtio"/>
  9. <address type="pci" domain="0x0000" bus="0x00" slot="0x07" function="0x0"/>
  10. </disk>
  11. <--#####################################################-->
  12. <--#####################################################-->
  13. <disk type="file" device="disk">
  14. <--qcow2修改成raw-->
  15. <driver name="qemu" type="raw"/>
  16. <--vm2-1.img修改成vm2-1.raw-->
  17. <source file="/var/lib/libvirt/images/vm2-1.raw"/>
  18. <--vda修改成vdb-->
  19. <target dev="vda" bus="virtio"/>
  20. <address type="pci" domain="0x0000" bus="0x00" slot="0x07" function="0x0"/>
  21. </disk>
  22. <--#####################################################-->
  1. [root@foo~]# virsh define /etc/1ibvirt/qemu/vm2.xm7
  2. [root@foo~]#virsh startvm2
  3. [root@foo~]# virsh snapshot-create-as vm2 vm2.snap1
  4. 错误:不支持的配置:存储类型vdb不支持磁盘raw的内部快照,这里只是为了演示后续的格式转换操作,真实环境中可以直接配置qcow2格式

格式转换:

把raw格式转换成qcow2格式

  1. [root@foo~]#qemu-img convert -o qcow2 /var/1ib/1ibvirt/images/vm2-1.raw /var/lib/libvirt/images/vm2-1.qcow2
  2. [root@foo~]# cd /var/lib/libvirt/images/
  3. [root@foo~]# ll -h
  4. -rw-r--r-- 1 root root 193K 1025 16:44 vm2-1.qcow2
  5. -rw-r--r--1 root root 2.0G 1025 16:25 vm2-1.raw
  6. #查看格式
  7. [root@foo~]# qemu-img info /var/lib/libvirt/images/vm2-1. qcow2
  8. image: /var/1ib/1ibvirt/images/vm2-1.qcow2
  9. file format:qcow2
  10. virtual size:2.0G (2147483648 bytes)
  11. disk size:196K
  12. cluster_size: 65536
  13. Format specific information:
  14. compat: 1.1
  15. lazy refcounts: false

将虚拟机的硬盘指向转换后的qcow2.img

  1. [root@foo~]#virsh shutdown vm2
  2. # 修改配置文件之前先关闭虚拟机
  3. [root@fooimages]# vim /etc/1ibvirt/qemu/vm2.xm1
  4. # 将之前修改的.raw格式改成qcow2
  5. [root@fooimages]# vim /etc/1ibvirt/qemu/vm2.xm1
  6. [root@foo images]#virsh define /etc/1ibvirt/qemu/vm2.xm1
  7. #创建快照
  8. [root@foo qemu]# virsh snapshot-create-as vm2 vm2.snap2
  9. #己生成域快照vm2.snap2

在虚拟机中创建一个空目录

  1. [root@foo ~]# mkdir test
  2. [root@foo~]# ls /test

给虚拟机vm2创建第三个快照vm2.snap3

  1. [root@foo~]#virsh snapshot-create-as vm2 vm2.snap3

在虚拟机中,给test中复制2个文件

  1. [root@foo~]#cp install.log anaconda-ks.cfg /test
  2. [root@foo~]# ls /test
  3. anaconda-ks.cfg install.log

给虚拟机vm2创建第四个快照vm2.snap4

  1. [root@foo~]#virsh snapshot-create-as vm2 vm2.snap4
  2. Domain snapshot vm2.snap2 created

查看虚拟机快照

  1. [root@foo~]#virsh snapshot-1ist vm2

关闭虚拟机,恢复到第三个快照

  1. [root@foo~]#virsh shutdown vm2
  2. [root@foo~]# virsh snapshot-revert vm2 vm2.snap3

在虚拟机中,发现/test目录为空

  1. [root@foo~]# Is /test

关闭虚拟机,恢复到第四个快照

  1. [root@foo~]#virsh shutdown vm2
  2. [root@foo~]#virsh snapshot-revert vm2 vm2.snap4

在虚拟机中,发现/test有拷贝的2个文件

  1. [root@foo~]# Is /test
  2. anaconda-ks.cfg install.log

查看虚拟机快照

  1. [root@foo~]# virsh snapshot-list vm2

删除虚拟机快照

  1. [root@foo~]# virsh snapshot-delete --snapshotname vm2.snap3 vm2
  2. [root@foo~]#v irsh snapshot-1ist vm2

九、KVM网络

分类
nat 同virtualbox的nat
isolated 同virtualbox的hostonly

接口
bridge 桥接口
在虚拟机上做了个桥接口,在把五理解的网卡和桥接口邦在一起

交换机
linux-bridge(linux自带)
ovs(open-Yswitch)

NAT网络拓扑
image.png

isolated隔离网路拓扑图
image.png

桥接网络拓扑图

image.png

配置文件的方式配置birdge桥接网络

  1. 在宿主机上
  2. 1.修改配置文件
  3. [root@foo~]# cat ifcfg-br0
  4. TYPE=Bridge
  5. NAME=br0
  6. DEVICE=br0
  7. ONBOOT="yes" # 系统启动是是否激活网卡
  8. BOOTPROTO=static # 设置IP为静态
  9. IPADDR=10.18.44.251
  10. GATEWAY=10.18.44.1
  11. NETMASK=255.255.255.0
  12. DNS1=10.18.44.100
  13. DNS2=8.8.8.8
  14. [root@foo~]# cat ifcfg-enp3s0
  15. DEVICE="enp3s0"
  16. ONBOOT="yes"
  17. BRIDGE=br0
  18. 2.重启libvirtd服务
  19. 3.重启network服务
  20. 删除桥接网卡步骤:
  21. 1.删除bro的配置文件
  22. 2.修改正常网卡的配置文件
  23. 3.重启系统

Virbro的DHCP

VirbrQ是KVM默认创建的一个Bridge,其作用是为连接其上的虚机网卡提供NAT访问外网的功能。
Virbr0默认分配了一个IP 192.168.122.1, 并为连接其上的其他虚拟网卡提供DHCP服务。
Virbro使用dnsmasq提供DHCP服务,可以在宿主机中查看该进程信息

  1. [root@foo~]#ps-e1f Igrep dnsmasq
  2. 5 s 1ibvirt+2422 1080 0 - 7054 poll_s 11:26 ? 00: 00:00
  3. /usr/sbin/dnsmasq --conf-file=/var/1ib/1ibvirt/dnsmasq/defau1t.conf
  4. # 在/var/1ib/libvirt/dnsmasq/ 目录下有一个virbr0.status 文件,当VM1成功获得DHCP的IP后,可以在该文件中查看到相应的信息
  5. [root@foo~]# cat virbr0.status
  6. [
  7. {
  8. "ip-address": "192.168.122.28"
  9. "mac-address": "52:54:00:94:a7:al",
  10. "hostname": "vm1",
  11. "expiry-time": 1511626337
  12. }
  13. ]

配置文件方式创建nat网络

  1. [root@foo~]# cp /etc/libvirt/qemu/networks/default.xml /etc/1ibvirt/qemu/networks/nat1.xml
  2. [root@foo~]# vim /etc/libvirt/qemu/networks/nat1.xml
  3. <network>
  4. <name>nat1</name>
  5. <uuid>4d8b9b5c-748f -4e16-a509-848202b9c83b</uuid>
  6. <forward mode="nat"/>
  7. #和隔离模式的区别
  8. <bridge name="virbr4" stp="on" de1ay="0"/>
  9. <mac address="52:57:00:62:0c:d4"/>
  10. <domain name="nat1"/>
  11. <ip address="192.168.104.1" netmask="255.255.255.0">
  12. <dhcp>
  13. <range start="192.168.104.128" end="192.168.104.254"/>
  14. </dhcp>
  15. </ip>
  16. </network>
  17. #重启服务:
  18. [root@foo~]# systemctl restart libvirtd

配置文件方式创建isotated网络

  1. [root@foo networks]# cp defau1t.xm1 iso1ated200.xm1
  2. [root@foo networks]# vim iso1ated200.xm7
  3. <network>
  4. <name>isolated200</name>
  5. <uuid>6341d3a6-7330-4e45-a8fe-164a6a68929a</uuid>
  6. <bridge name="virbr2" stp=" on"delay="0"/>
  7. <mac address="52:54:00:6b:39:0c"/>
  8. <domain name="isolatel"/>
  9. <ip address="192.168.101.1" netmask="255.255.255.0">
  10. <dhcp>
  11. <range start="192.168.101.128" end="192.168.101.254"/>
  12. </dhcp>
  13. </ip>
  14. </network>
  15. [root@foo networks]# systemct1 restart libvirtd
  1. 查看所有的网络:
  2. [root@foo ~]# virsh net-list
  3. 启动网络:
  4. [root@foo ~]# virsh net-start isolated200
  5. 开机自启动:
  6. [root@foo ~]# virsh net-autostart isolated200
  7. 网络相关基本命令
  8. 查看一个guest主机的网络接口信息:
  9. [root@foo ~]#virsh domiflist vm2
  10. 接口 类型 型号 MAC
  11. vneto network default virtio 52:54:00:94:a7:al

十、脚本管理KVM

批量创建虚机脚本

扩展功能:
查看现在虚拟机
查看某个虚拟机的配置
升配/降配
添加/删除网络

  1. #!/bin/bash
  2. #KVM batch create vm tool
  3. #version: 0.1
  4. #author: wing
  5. #需要事先准备模板镜像和配置文件模板
  6. echo "1.创建自定义配置单个虚拟机
  7. 2.批量创建自定义配置虚拟机
  8. 3.批量创建默认配置虚拟机
  9. 4.删除虚拟机"
  10. read -p "选取你的操作(1/2/3):" op
  11. batch_self_define(){
  12. KVMname=`openssl rand -hex 5`
  13. sourceimage=/var/1ib/1ibvirt/images/vmmodel.img
  14. sourcexml=/etc/libvirt/qemu/vmmodel.xml
  15. newimg=/var/1ib/1ibvirt/images/${KVMname}. img
  16. newxm1=/etc/1ibvirt/qemu/${KVMname}.xml
  17. cp $sourceimage $newimg
  18. cp $sourcexml $newxml
  19. KVMuuid=`uuidgen`
  20. KVMmem=${1}000000
  21. KVMcpu=$2
  22. KVMimg=$newimg
  23. KVMmac=`openss1 rand -hex 3 | sed -r "s/..\B/&:/g"`
  24. sed -i "s@KVMname@ $KVMname@;s@KVMuuid@$KVMuuid@;s@KVMmem@ $KVMmem@;s@KVMcpu@$KVMcpu@;s@KVMimg@$KVMimg@;s@KVMmac@$KVMmac@" $newxml
  25. virsh define $newxml
  26. virsh list --all
  27. }
  28. case $op in
  29. 1)self_define;;
  30. 2)
  31. read -p "请输入要创建的虚拟机的个数:" num
  32. read -p "请输入新虚机内存大小(G):"newmem
  33. read -p "请输入新虚机cpu个数:" newcpu
  34. for((i=1;i<=$num;i++))
  35. do
  36. batch_self_define $newmem $newcpu
  37. done;;
  38. 3)
  39. read-p"请输入要创建的虚拟机的个数:" num
  40. for((i=1;i<=$num;i++))
  41. do
  42. batch_self_define 1 1
  43. done;;
  44. *)
  45. echo "输入错误,请重新执行脚本"
  46. exit;;
  47. esac

配置文件模板

  1. [root@foo ~]#vim /etc/1ibvirt/qemu/vmmodel.xml
  2. <domain type="KVM">
  3. <name>KVMname</name>
  4. <uuid>KVMuuid</uuid>
  5. <memory unit="KiB">KVMmem</memory>
  6. <currentMemory unit="KiB ">KVMmem</currentMemory>
  7. <vcpu placement="static ">KVMcpu</vcpu>
  8. <os>
  9. <type arch="x86_64" machine="pc-i440fx-rhe17.0.0">hvm</type>
  10. <boot dev="hd"/>
  11. </os>
  12. <features>
  13. <acpi/>
  14. <apic/>
  15. </features>
  16. <cpu mode="custom" match=" exact"check="partial">
  17. <model fallback=" a11ow">Haswe11-noTSX</model>
  18. </cpu>
  19. <clock ottset="utc">
  20. <timer name="rtc" tickpo1icy="catchup"/>
  21. <timer name="pit" tickpolicy=" delay"/>
  22. <timer name="hpet" present="no"/>
  23. </clock>
  24. <on_poweroff>destroy</on_poweroff>
  25. <on_reboot>restart</on_reboot>
  26. <on_crash>destroy</on_crash>
  27. <pm>
  28. <suspend-to-mem enab1ed="no"/>
  29. <suspend-to-disk enab1ed="no"/>
  30. </pm>
  31. <devices>
  32. <emulator>. /usr/1ibexec/qemu-KVM</emulator>
  33. <disk type="file" device="disk">
  34. <driver name="qemu" type=" qcow2"/>
  35. <source file="KVMimg"/>
  36. <target deve"vda" bus="virtio"/>
  37. </disk>
  38. <controller type="usb" index="0" mode1="ich9-ehci1">
  39. <address type=" pci"domain="0x0000" bus="0x00" s1ot="0x04" function="0x7"/>
  40. </controller>
  41. <controller type="usb" index="0" mode1="ich9-uhci1">
  42. <master startport="0"/>
  43. <address type="pci" domain="0x0000" bus="0x00" slot="0x04" function="Ox0"
  44. nultifunction="on"/>
  45. </controller>
  46. <controller type="usb" index="0" model=" ich9-uhci2">
  47. <master startport="2"/>
  48. <address type="pci" domain="0x0000" bus="0x00" slot=" 0x04" function="0x1"/>
  49. </controller>
  50. <controller type="usb" index= "0"mode1="ich9-uhci3">
  51. <master startport="4"/>
  52. <address type=" pci" domain="0x0000" bus="0x00" s1ot="0x04" function="0x2"/>
  53. </controller>
  54. <controller type="pci" index= "0" model="pci-root"/>
  55. <controller type="virtio-serial" index="0">
  56. <address type="pci"domain="0x0000" bus="0x00" slot="0x05" function=" 0x0"/>
  57. </controller>
  58. <interface type="network">
  59. <mac address="52:54:00:KVMmac"/>
  60. <source network="default"/>
  61. <model type="virtio"/>
  62. <address type="pci" domain="Ox0000" bus="0x00" slot=" 0x03" function="0x0"/>
  63. </interface>
  64. <serial type="pty">
  65. <target type="isa-serial" port="0">
  66. <model name="isa-serial"/>
  67. </target>
  68. </serial>
  69. <console type="pty">
  70. <target type="serial" port="0"/>
  71. </console>
  72. <channel type="unix">
  73. <target type="virtio" name="org.qemu.guest_agent.0"/>
  74. <address type="virtio-serial" controller="0" bus="0" port="1"/>
  75. </channel>
  76. <input type="mouse" bus="ps2"/>
  77. <input type="keyboard" bus="ps2"/>
  78. <memballoon model="virtio">
  79. <address type="pci"domain="0x0000" bus="0x00" s1ot="0x07" function= "0x0"/>
  80. </memballoon>
  81. </devices>
  82. </domain>

随机生成 mac地址

  1. [root@foo ~]#echo $[$RANDOM%9]$[$RANDOM%9]:$[$RANDOM%9]$[$RANDOM%9]:$[$RANDOM%9]$[$RANDOM%9]
  2. 65:42:31
  3. [root@foo ~]#echo `openssl rand -hex 1`:`openssl rand -hex 1`:`openssl rand -hex 1`
  4. 99:6e:67
  5. [root@foo ~]# openssl rand -hex 3 | sed -r "s/(..)/\1:/g" | sed "s/.$//"
  6. e9:b6:12
  7. [root@foo ~]# openssl rand -hex 3 | sed -r "s/(..)(..)(..)/\1:\2:\3/g"
  8. 94:89:e3
  9. [root@foo ~]# openssl rand -hex 3 | sed -r "s/..\B/&:/g"
  10. c5:66:90
  11. \B 表示非单词边界
  12. \b 表示单词边界
  13. <a 表示以a开头的单词
  14. b> 表示以b结尾的单词
  15. 使用UUID:
  16. [root@foo ~]# uuidgen | sed -r "s/(..)(..)(..)(.*)/\1:\2:\3/"
  17. 使用熵池里的随机数
  18. [root@foo ~]# cat /dev/urandom | head -1 | md5sum | head -c 6

简历上可写的KVM相关项目
1、迁移
从物理机器迁移到KVM
从KVM迁移到云主机
2、文件管理服务(ftp nfs jira+wiki)
3、日志服务