DAY 45 企业级虚拟化技术KVM

news2024/12/23 5:25:02

企业级虚拟化技术KVM

1.kvm是什么

kernel virtualization machine 内核虚拟机

qemu的二次开发

软件全拼 qemu-kvm

kvm

virtulbox ovm

vmware vsphere套件(vmawre-esxi)

microsoft hyper-V

2.什么是虚拟化

资源利用

资源隔离

虚拟化管理:

​ 接口

​ 命令

​ 图形化

​ web管理工具 cockpit

vps虚拟专用服务器

3.桌面级虚拟化和企业级虚拟化的区别

4.你都知道哪些虚拟化产品?你熟悉哪个虚拟化?

kvm redhat

xen

vmware vsphere(esxi) vmware

ovm virtualbox oracle

hyper-V microsoft

5.安装kvm

6.kvm常见管理

7.kvm存储池 概念非常重要

8.安装 会用命令安装 用脚本批量管理虚拟机

9.KVM网络模式有几种?有什么区别?

一、虚拟化技术概述

​ 虚拟化[Virtualization]技术最早出现在 20 世纪 60 年代的 IBM 大型机系统,在70年代的 System 370 系列中逐渐流行起来,这些机器通过一种叫虚拟机监控器[Virtual Machine Monitor,VMM]的程序在物理硬件之上生成许多可以运行独立操作系统软件的虚拟机[Virtual Machine]实例。随着近年多核系统、集群、网格甚至云计算的广泛部署,虚拟化技术在商业应用上的优势日益体现,不仅降低了 IT 成本,而且还增强了系统安全性和可靠性,虚拟化的概念也逐渐深入到人们日常的工作与生活中。

​ 虚拟化是一个广义的术语,对于不同的人来说可能意味着不同的东西,这要取决他们所处的环境。在计算机科学领域中,虚拟化代表着对计算资源的抽象,而不仅仅局限于虚拟机的概念。例如对物理内存的抽象,产生了虚拟内存技术,使得应用程序认为其自身拥有连续可用的地址空间[Address Space],而实际上,应用程序的代码和数据可能是被分隔成多个碎片页或段),甚至被交换到磁盘、闪存等外部存储器上,即使物理内存不足,应用程序也能顺利执行。

常见的虚拟化软件

开源

​ kvm

​ xen

​ virtulbox

闭源

​ vmware

​ vmware-workstation

​ vmware vsphere(vmware esxi)套件

​ 管理界面

​ hypervisor(vmm)

​ virt-manager

​ qemu-kvm

​ ovm

​ hyper-V

二、主流虚拟化方案介绍

1、虚拟化技术主要分类

  • 平台虚拟化(Platform Virtualization)
    针对计算机和操作系统的虚拟化。
  • 资源虚拟化(Resource Virtualization)
    针对特定的系统资源的虚拟化,比如内存、存储、网络资源等。
  • 应用程序虚拟化(Application Virtualization)
    包括仿真、模拟、解释技术等。

2、平台虚拟化技术分类

​ 我们通常所说的虚拟化主要是指平台虚拟化技术,通过使用控制程序(Control Program,也被称为 Virtual Machine Monitor 或Hypervisor),隐藏特定计算平台的实际物理特性,为用户提供抽象的、统一的、模拟的计算环境(称为虚拟机)。虚拟机中运行的操作系统被称为客户机操作系统(Guest OS),运行虚拟机监控器的操作系统被称为主机操作系统(Host OS),当然某些虚拟机监控器可以脱离操作系统直接运行在硬件之上(如 VMWARE 的 ESX 产品)。运行虚拟机的真实系统我们称之为主机系统。

操作系统级虚拟化(Operating System Level Virtualization)

​ 在传统操作系统中,所有用户的进程本质上是在同一个操作系统的实例中运行,因此内核或应用程序的缺陷可能影响到其它进程。操作系统级虚拟化是一种在服务器操作系统中使用的轻量级的虚拟化技术,内核通过创建多个虚拟的操作系统实例(内核和库)来隔离不同的进程,不同实例中的进程完全不了解对方的存在。
​ vps
​ 比较著名的有 Solaris Container,FreeBSD Jail 和 OpenVZ 等。

​ 比如OPENVZ:这个平台是最便宜的VPS平台,在各个vps商哪里都是价格最低的。OPENVZ本身运行在linux之上,它通过自己的虚拟化技术把一个服务器虚拟化成多个可以分别安装操作系统的实例,这样的每一个实体就是一个VPS,从客户的角度来看这就是一个虚拟的服务器,可以等同看做一台独立的服务器。

​ OPENVZ虚拟化出来的VPS只能安装linux操作系统,不能安装windows系统,比如Centos、Fedora、Gentoo、Debian等。不能安装windows操作系统是openvz的第一个缺点,需要使用windows平台的用户不能使用OPENVZVPS。

​ OPENVZ的第二个缺点是OPENVZ不是完全的虚拟化,每个VPS账户共用母机内核,不能单独修改内核。好在绝大多少用户根本不需要修改内核,所以这个缺点对多数人可以忽略不计。而这一点也正是openvz的优点,这一共用内核特性使得openvz的效率最高,超过KVM、Xen、VMware等平台。在不超售的情况下,openvz是最快速效率最高的VPS平台。

部分虚拟化(Partial Virtualization)

​ VMM 只模拟部分底层硬件,因此客户机操作系统不做修改是无法在虚拟机中运行的,其它程序可能也需要进行修改。在历史上,部分虚拟化是通往全虚拟化道路上的重要里程碑,最早出现在第一代的分时系统 CTSS 和 IBM M44/44X 实验性的分页系统中。

全虚拟化(Full Virtualization)

​ 全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。

​ 操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。全虚拟化 VMM 以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。举例而言,x86 体系结构中,对于操作系统切换进程页表的操作,真实硬件通过提供一个特权 CR3 寄存器来实现该接口,操作系统只需执行 "mov pgtable,%%cr3"汇编指令即可。

​ 全虚拟化 VMM 必须完整地模拟该接口执行的全过程。如果硬件不提供虚拟化的特殊支持,那么这个模拟过程将会十分复杂:一般而言,VMM 必须运行在最高优先级来完全控制主机系统,而 Guest OS 需要降级运行,从而不能执行特权操作。当 Guest OS 执行前面的特权汇编指令时,主机系统产生异常(General Protection Exception),执行控制权重新从 Guest OS 转到 VMM 手中。VMM 事先分配一个变量作为影子 CR3 寄存器给 Guest OS,将 pgtable 代表的客户机物理地址(Guest Physical Address)填入影子 CR3 寄存器,然后 VMM 还需要 pgtable 翻译成主机物理地址(Host Physical Address)并填入物理 CR3 寄存器,最后返回到 Guest OS中。随后 VMM 还将处理复杂的 Guest OS 缺页异常(Page Fault)。

​ 比较著名的全虚拟化 VMM 有 Microsoft Virtual PC、VMware Workstation、Sun Virtual Box、Parallels Desktop for Mac 和 QEMU。

超虚拟化(Paravirtualization)

这是一种修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 交互的技术。在超虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供。例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。由于不需要产生额外的异常和模拟部分硬件执行流程,超虚拟化可以大幅度提高性能,比较著名的 VMM 有 Denali、Xen。

硬件辅助虚拟化(Hardware-Assisted Virtualization)

硬件辅助虚拟化是指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例如有了 Intel-VT 技术的支持,Guest OS 和 VMM 的执行环境自动地完全隔离开来,Guest OS 有自己的"“套寄存器”,可以直接运行在最高级别。因此在上面的例子中,Guest OS 能够执行修改页表的汇编指令。Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术。

这种分类并不是绝对的,一个优秀的虚拟化软件往往融合了多项技术。例如 VMware Workstation 是一个著名的全虚拟化的 VMM,但是它使用了一种被称为动态二进制翻译的技术把对特权状态的访问转换成对影子状态的操作,从而避免了低效的 Trap-And-Emulate 的处理方式,这与超虚拟化相似,只不过超虚拟化是静态地修改程序代码。对于超虚拟化而言,如果能利用硬件特性,那么虚拟机的管理将会大大简化,同时还能保持较高的性能。

三、KVM架构解析

在这里插入图片描述

从rhel6开始使用,红帽公司直接把KVM的模块做成了内核的一部分。

xen用在rhel6之前的企业版中默认内核不支持,需要重新安装带xen功能的内核

KVM 针对运行在 x86 硬件上的、驻留在内核中的虚拟化基础结构。KVM 是第一个成为原生 Linux 内核(2.6.20)的一部分的 hypervisor,它是由 Avi Kivity 开发和维护的,现在归 Red Hat 所有。

这个 hypervisor 提供 x86 虚拟化,同时拥有到 PowerPC® 和 IA64 的通道。另外,KVM 最近还添加了对对称多处理(SMP)主机(和来宾)的支持,并且支持企业级特性,比如活动迁移(允许来宾操作系统在物理服务器之间迁移)。

KVM 是作为内核模块实现的,因此 Linux 只要加载该模块就会成为一个hypervisor。KVM 为支持 hypervisor 指令的硬件平台提供完整的虚拟化(比如 Intel® Virtualization Technology [Intel VT] 或 AMD Virtualization [AMD-V] 产品)。KVM 还支持准虚拟化来宾操作系统,包括 Linux 和 Windows®。

这种技术由两个组件实现。第一个是可加载的 KVM 模块,当在 Linux 内核安装该模块之后,它就可以管理虚拟化硬件,并通过 /proc 文件系统公开其功能。第二个组件用于 PC 平台模拟,它是由修改版 QEMU 提供的。QEMU 作为用户空间进程执行,并且在来宾操作系统请求方面与内核协调。

当新的操作系统在 KVM 上启动时(通过一个称为 KVM 的实用程序),它就成为宿主操作系统的一个进程,因此就可以像其他进程一样调度它。但与传统的 Linux 进程不一样,来宾操作系统被 hypervisor 标识为处于 “来宾” 模式(独立于内核和用户模式)。

每个来宾操作系统都是通过 /dev/KVM 设备映射的,它们拥有自己的虚拟地址空间,该空间映射到主机内核的物理地址空间。如前所述,KVM 使用底层硬件的虚拟化支持来提供完整的(原生)虚拟化。I/O 请求通过主机内核映射到在主机上(hypervisor)执行的 QEMU 进程。

KVM 在 Linux 环境中以主机的方式运行,不过只要底层硬件虚拟化支持,它就能够支持大量的来宾操作系统.

四、KVM软件安装

1、 环境准备

ip固定

1.虚拟化功能打开

2.硬盘不能太小

3.cpu不能太少 2+

4.往里面放一个测试镜像 放一个centos7的小镜像

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

[root@qfedu.com ~]# cat /proc/cpuinfo | grep -E 'vmx|svm'

3、清理环境:卸载KVM

[root@qfedu.com ~]# yum remove `rpm -qa | egrep 'qemu|virt|KVM'` -y
[root@qfedu.com ~]# rm -rf /var/lib/libvirt  /etc/libvirt/

4、安装软件

Centos6

 [root@qfedu.com ~]# yum groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform" "Virtualization Tools" -y

Centos7

[root@qfedu.com ~]# yum -y install qemu-kvm libvirt virt-manager

qemu-kvm: 主包

libvirt:API接口

virt-manager:图形管理程序

Centos9

yum 组安装已经可以使用了,但是组包还是会缺安装包,所以还是建议使用Centos7的方法
问题:在进行组安装的时候可能会出现关于rpm版本的错误问题
解决:
yum upgrade rpm -y
yum grouplist

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

5、启动服务

[root@qfedu.com ~]# systemctl start libvirtd

6、查看KVM模块加载

[root@qfedu.com ~]# lsmod | grep -i kvm
kvm_intel    53484   3 
kvm          316506  1 kvm_intel

五、GuestOS安装

  • 图形方式(非常重要 非常简单)
  • 完全文本模式(现场配置虚拟机的规格) 并不是自动化的 还是交互式的操作
  • 命令行模式(重中之重 最常用 模板镜像+配置文件 方式配置规格)
  • 通过飞机驾驶舱(cockpit)安装和管理虚拟机
# yum install *cockpit* -y
# systemctl start cockpit
# yum install cockpit-machines -y

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

问题:centos-stream9中cockpit安装guestos时不能使用键盘(未知bug)

1、图形模式安装Guest OS

[root@qfedu.com ~]# virt-manager

在这里插入图片描述

centos-stream8 bug

如果进行了批量的软件升级操作,kvm在安装guestos的时候会报如下错误

error: internal error: unknown feature amd-sev-es

解决方案如下(wing已测)

# mkdir -p /etc/qemu/firmware
# touch /etc/qemu/firmware/50-edk2-ovmf-cc.json
# systemctl restart libvirtd

2、完全文本方式安装

注意:不需要讲,了解即可

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

# virt-install --connect qemu:///system -n vm6 -r 512 --disk path=/virhost/vmware/vm6.img,size=7 --os-type=linux --os-variant=rhel6 --vcpus=1 --network bridge=br0 --location=http://127.0.0.1/rhel6u4 -x console=ttyS0 --nographics

#virt-install --connect qemu:///system -n vm9 -r 2048 --disk path=/var/lib/libvirt/images/vm9.img,size=7 --os-type=linux --os-variant=centos7.0 --vcpus=1 --location=ftp://192.168.100.230/centos7u3 -x console=ttyS0 --nographics             

注意:

  1. 用这种方式安装的操作系统,大小写会胡乱变化,不影响远程操作

  2. 内存必须2G以上

查看KVM支持的OS版本:

[root@qfedu.com ~]# man virt-install  
[root@qfedu.com ~]# 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: line 273: printf: write error: No space left on device

逃脱符:

Escape character is ^]

3、命令行模式安装

虚拟机的组成部分

  1. 虚拟机配置文件路径:/etc/libvirt/qemu/*.xml
[root@qfedu.com ~]# ls /etc/libvirt/qemu
networks vm1.xml
  1. 虚拟机的磁盘镜像文件路径:/var/lib/libvirt/images/*.img
[root@qfedu.com ~]# ls /var/lib/libvirt/images/
vm1.img

根据配置文件创建虚拟机

1.需要有磁盘镜像文件:
[root@qfedu.com ~]# cp vm1.img vm2.img

2.需要有配置文件
[root@qfedu.com ~]# cp vm1.xml vm2.xml

3.配置文件需要修改必要的内容

4.创建虚拟机:
[root@qfedu.com ~]# virsh define /etc/libvirt/qemu/vm2.xml

: allocate 英[ˈæləkeɪt] 美[ˈæləkeɪt]

​ 拨…(给); 划…(归); 分配…(给);

​ [例句]Tickets are limited and will be allocated to those who apply first

​ 票数有限,先申请者先得。

4、实例

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

1.拷贝模板镜像和配置文件
[root@qfedu.com ~]# cp /var/lib/libvirt/images/vm2.img /var/lib/libvirt/images/vm3.img
[root@qfedu.com ~]# cp /etc/libvirt/qemu/vm2.xml /etc/libvirt/qemu/vm3.xml

2.修改配置文件
[root@qfedu.com ~]# vim /etc/libvirt/qemu/vm3.xml
<domain type='KVM'>
<name>vm3</name>   #虚拟机的名称
 <uuid>a2f62549-c6b7-4b8f-a8e2-c14edda35a78</uuid>  # 虚拟机的uuid
 <memory unit='KiB'>2099200</memory>  # 虚拟机能使用的最大内存
 <currentMemory unit='KiB'>2099200</currentMemory> # 虚拟机使用的当前内存 和上面的内存配置保持一致
 <vcpu placement='static'>2</vcpu> # cpu核心数
 <os>
  <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
  <boot dev='hd'/>
 </os>
 <features>
  <acpi/>
  <apic/>
 </features>
 <cpu mode='custom' match='exact' check='partial'>
  <model fallback='allow'>Haswell-noTSX</model>
 </cpu>
 <clock offset='utc'>
  <timer name='rtc' tickpolicy='catchup'/>
  <timer name='pit' tickpolicy='delay'/>
  <timer name='hpet' present='no'/>
 </clock>
 <on_poweroff>destroy</on_poweroff>
 <on_reboot>restart</on_reboot>
 <on_crash>destroy</on_crash>
 <pm>
  <suspend-to-mem enabled='no'/>
  <suspend-to-disk enabled='no'/>
 </pm>
 <devices>
  <emulator>/usr/libexec/qemu-KVM</emulator>
  
  <disk type='file' device='disk'>
   <driver name='qemu' type='qcow2'/> #磁盘镜像文件类型
   <source file='/var/lib/libvirt/images/vm3.img'/>  #磁盘镜像文件的路径
   <target dev='vda' bus='virtio'/>  # vda是系统内磁盘逻辑名称
   <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
  </disk>  #slot需要修改成0x00
  
  <disk type='file' device='disk'>  #如果需要添加磁盘,只需添加如下配置即可
   <driver name='qemu' type='qcow2'/>
   <source file='/var/lib/libvirt/images/vm3-1.img'/>
   <target dev='vda' bus='virtio'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x16' function='0x0'/>
  </disk>

  <controller type='usb' index='0' model='ich9-ehci1'>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
  </controller>
  <controller type='usb' index='0' model='ich9-uhci1'>
   <master startport='0'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
  </controller>
  <controller type='usb' index='0' model='ich9-uhci2'>
   <master startport='2'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
  </controller>
  <controller type='usb' index='0' model='ich9-uhci3'>
   <master startport='4'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>

  </controller>
  <controller type='pci' index='0' model='pci-root'/>
  <controller type='virtio-serial' index='0'>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
  </controller>

  <interface type='network'>
   <mac address='52:54:00:f2:28:6f'/>  # mac地址,只能修改后3段
   <source network='default'/>  # default为所使用的网络的名字
   <model type='virtio'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  </interface>  # slot需要修改成0x00

  <serial type='pty'>
   <target type='isa-serial' port='0'>
    <model name='isa-serial'/>
   </target>
  </serial>
  <console type='pty'>
  	<target type='serial' port='0'/>
  </console>

  <channel type='unix'>

   <target type='virtio' name='org.qemu.guest_agent.0'/>

   <address type='virtio-serial' controller='0' bus='0' port='1'/>
  </channel>
  <input type='mouse' bus='ps2'/>
  <input type='keyboard' bus='ps2'/>
  <memballoon model='virtio'>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
  </memballoon>
 </devices>
</domain>    

KVM管理

一、GuestOS安装问题解析

问题1:用图形安装guest os的时候卡住不动

解决:升级系统
[root@qfedu.com ~]#  yum upgrade -y

问题2:升级系统后安装guest os的时候还是卡住不动

解决:需要在安装宿主机的时候安装兼容性程序(有的同学就没有安装也可以使用,这可能是bug)

问题3:如果安装了各种兼容程序之后还是不行

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

二、GuestOS升级配置

  1. 修改配置文件(比如添加磁盘,那就添加如下配置)
 <disk type='file' device='disk'>
   <driver name='qemu' type='qcow2'/>
   <source file='/var/lib/libvirt/images/vm3-1.img'/>
   <target dev='vda' bus='virtio'/>
   <address type='pci' domain='0x0000' bus='0x00' slot='0x16' function='0x0'/>
 </disk>  

特别注意:

centos7直接把slot修改成0x00就可以,centos8/9里面硬盘和网卡的添加已经不能修改slot了,要求修改的是bus地址,把bus修改成bus=‘0x00’,kvm会自动修改到合适的值

在这里插入图片描述

  1. 创建新的空磁盘卷
[root@qfedu.com ~]# qemu-img  create  -f  qcow2  vm3-1.qcow2 10G
  1. 重新定义
[root@qfedu.com ~]# virsh define /etc/libvirtd/qemu/vm3.xml

三、KVM存储

概念

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

默认存储池

/var/lib/libvirt/images/

SAN NAS DAS

scsi 光纤交换机 光纤 光纤模块 专业存储

ide sata sas scsi

ipsan iscsi

分布式文件系统

​ 可扩展性强

​ 安全 trunk 128M 64M hdfs

​ glusterfs 简单

​ ceph 私有云 公有云 底层存储

​ hdfs 大数据平台hadoop里面默认的分布式文件系统

1、存储池管理

1.创建基于文件夹的存储池(目录)
[root@qfedu.com ~]# mkdir -p /data/vmfs

2.定义存储池与其目录
[root@qfedu.com ~]# virsh pool-define-as vmdisk --type dir --target /data/vmfs

3.创建已定义的存储池
(1) 创建已定义的存储池
[root@qfedu.com ~]# virsh pool-build vmdisk

(2) 查看已定义的存储池,存储池不激活无法使用。
#virsh pool-list --all

4.激活并自动启动已定义的存储池
    [root@qfedu.com ~]# virsh pool-start vmdisk
    [root@qfedu.com ~]# virsh pool-autostart vmdisk     

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

5.在存储池中创建虚拟机存储卷 2种方法
    # virsh vol-create-as vmdisk oeltest03.qcow2 20G --format qcow2
    # qemu-img create -f qcow2 vm4.qcow2 20G

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

  注2:KVM存储池也要用于虚拟机迁移任务。

6.存储池相关管理命令
    (1)在存储池中删除虚拟机存储卷
      [root@qfedu.com ~]# virsh vol-delete --pool vmdisk oeltest03.qcow2

    (2)取消激活存储池
      [root@qfedu.com ~]# virsh pool-destroy vmdisk

    (3)删除存储池定义的目录/data/vmfs
      [root@qfedu.com ~]# virsh pool-delete vmdisk

    (4)取消定义存储池
      [root@qfedu.com ~]# virsh pool-undefine vmdisk

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

2、生产环境存储池使用

添加lvm和远程存储即可

3、磁盘格式

  1. 磁盘镜像文件格式

raw

原始格式,性能最好

qcow

先去网上了解一下cow(写时拷贝copy on write) ,性能远不能和raw相比,所以很快夭折了,所以出现了qcow2

qcow2

性能上还是不如raw,但是raw不支持快照,qcow2支持快照。

qed

现在默认安装好的用的是raw格式,所有做快照要把他转换成qcow2格式

什么叫写时拷贝?

raw立刻分配空间,不管你有没有用到那么多空间

qcow2只是承诺给你分配空间,但是只有当你需要用空间的时候,才会给你空间。最多只给你承诺空间的大小,避免空间浪费

工作当中用哪个?看你用不用快照。

工作当中虚拟机会有多个备份,一个坏了,再起一个就行了,所有没必要用快照。当然也不一定。数据绝对不会存储到本地。

  1. 创建磁盘文件
建立qcow2格式磁盘文件:
#qemu-img create -f qcow2 test.qcow2 20G 

建立raw格式磁盘文件:
#qemu-img create -f raw test.raw 20G  

查看已经创建的虚拟磁盘文件:
#qemu-img info test.qcow2 

4、挂载磁盘

作为虚拟化环境管理员,你肯定遇到过虚拟机无法启动的情况。实施排错时,你需要对虚拟机的内部进行检查。而Libguestfs Linux工具集可以在这种情况下为你提供帮助。

利用Libguestfs找出损坏的虚拟机文件

Libguestfs允许在虚拟机上挂载任何类型的文件系统,以便修复启动故障。

使用Libguestfs,首先需要使用Libvirt。Libvirt是一个管理接口,可以和KVM、Xen和其他一些基于Liunx的虚拟机相互连接。Libguestfs的功能更加强大,可以打开Windows虚拟机上的文件。但是首先你需要将虚拟机迁移到libguestfs可用的环境当中,也就是Linux环境。

假如你是vmware的ESXI虚拟机,为了将虚拟机迁移到Linux当中,你可以使用SSH连接到ESXi主机,这意味着你首先需要启用ESXi主机上的SSH访问方式。完成之后,在Linux平台上运行下面的scp命令:

查看磁盘镜像分区信息:
[root@qfedu.com ~]# virt-df -h -d vm1
  Filesystem                 Size    Used   Available  Use%
  vm1:/dev/sda1              484M    32M    428M       7%
  vm1:/dev/sdb1              3.5G    3.5G   0          100%
  vm1:/dev/VolGroup/lv_root  6.1G    1.1G   4.7G       18%

[root@qfedu.com ~]# virt-filesystems -d vm1
  /dev/sda1
  /dev/sdb1
  /dev/VolGroup/lv_root

挂载磁盘镜像分区:
[root@qfedu.com ~]# guestmount -d vm1 -m /dev/vda1 --rw /mnt

注:

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

四、KVM管理

1、KVM基本管理

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

查看虚拟机:
[root@qfedu.com ~]# virsh list  //仅列出正在运行(running)状态下的虚拟机    
 Id   名称       状态
-----------------------
 2    rocky9-1   运行

[root@qfedu.com ~]# virsh list --all   
//列出所有的虚拟机,包括运行(running),关闭(shut off)和暂停(paused)状态的虚拟机
 Id   名称       状态
-----------------------
 2    rocky9-1   运行
 -    centos_7   关闭
 -    rocky9     关闭

查看KVM虚拟机配置文件(X)[root@qfedu.com ~]# virsh dumpxml name

将node4虚拟机的配置文件保存至node6.xml(X):
[root@qfedu.com ~]# virsh dumpxml node4 > /etc/libvirt/qemu/node6.xml

修改node6的配置文件(X)[root@qfedu.com ~]# virsh edit node6    
如果直接用vim编辑器修改配置文件的话,需要重启libvirtd服务启动

开启虚拟机:
[root@qfedu.com ~]# virsh start vm1
Domain vm1 started

暂停虚拟机: 
[root@qfedu.com ~]# virsh suspend vm_name  

恢复虚拟机:
[root@qfedu.com ~]# virsh resume vm_name   
关闭:  
方法1:	
[root@qfedu.com ~]# virsh shutdown vm1  
Domain vm1 is being shutdown  

方法2(X)[root@qfedu.com ~]# virsh destroy vm1  
Domain vm1 destroyed

重启虚拟机:  
[root@qfedu.com ~]# virsh reboot vm1  
Domain vm1 is being reboote

重置虚拟机:  
[root@qfedu.com ~]# virsh reset vm1  
Domain vm1 was reset

修改配置文件后,重新读取配置文件:
[root@qfedu.com ~]# virsh define 配置文件路径
若机器处于开机状态,需要先关机(virsh shutdown/destroy),再使用define读取配置文件才能够生效

查看虚拟机的IP地址和MAC地址
[root@KVM ~]# virsh domifaddr rocky9-1 
 名称        MAC 地址              协议          地址
-----------------------------------------------------------------
 vnet1      52:54:00:fe:bc:7d    ipv4         192.168.122.217/24

删除虚拟机:	
[root@qfedu.com ~]# virsh undefine vm2  
Domain vm2 has been undefined
该参数只会删除虚拟机的xml配置文件,并不会删除虚拟机的磁盘镜像文件
所以undefine删除虚拟机后,需要去 /var/lib/libvirt/images 目录下删除对应的img磁盘镜像文件
注意:虚拟机在开启的情况下undefine是无法删除的,应该先destroy关机,再undefine删除掉

虚拟机开机自动启动:	
[root@qfedu.com ~]# virsh autostart vm1	域 vm1标记为自动开始	
[root@qfedu.com ~]# ls /etc/libvirt/qemu/autostart/   //此目录默认不存在,在有开机启动的虚拟机时自动创建vm1.xml		
[root@qfedu.com ~]# virsh autostart --disable vm1	 
域 vm1取消标记为自动开始

查看所有开机自启的guest os:	
[root@qfedu.com ~]# ls /etc/libvirt/qemu/autostart/ 
[root@qfedu.com ~]# virsh list --all --autostart

2、虚拟机克隆

镜像克隆之前需要关闭,克隆使用的原型机(original)

1.图形界面

​ Applications (左上角)-----> System Tools ------>Virtual Machine Manager

关闭要克隆的虚拟机,右键点击虚拟机选择Clone

2.字符终端,命令克隆

virt-clone

[参数]

–auto-clone :允许virt-clone自动为新克隆的虚拟机生成一个名称和存储路径

-o --original :指定克隆来源虚拟机

-f :指定克隆出的虚拟机的磁盘镜像位置

-n :指定克隆出的虚拟机的名字

 [root@qfedu.com ~]# virt-clone -o vm1 --auto-clone
 WARNING  设置图形设备端口为自动端口,以避免相互冲突。    正在分配 'vm1-clone.qcow2'       | 6.0 GB  00:00:05    成功克隆 'vm1-clone'-o    --original  
 
 [root@qfedu.com ~]# virt-clone -o vm1 -n vm2 --auto-clone    
 WARNING  设置图形设备端口为自动端口,以避免相互冲突。    正在分配 'vm2.qcow2'                         | 6.0 GB  00:00:06    成功克隆 'vm2'[root@qfedu.com ~]# virt-clone -o vm1 -n vm2 -f /var/lib/libvirt/images/vm2.img    
 正在克隆    vm1.img        | 8.0 GB   01:03    Clone 'vm2'  created successfully.

3、增量镜像

注意:扩展内容,了解即可

1、概述

通过一个基础镜像(node.img),里面把各个虚拟机都需要的环境都搭建好,然后基于这个镜像建立起一个个增量镜像,每个增量镜像对应一个虚拟机,虚拟机对镜像中所有的改变都记录在增量镜像里面,基础镜像始终保持不变。

功能:

节省磁盘空间,快速复制虚拟机。

环境:

基本镜像文件:node.img 虚拟机ID:node

增量镜像文件:node4.img 虚拟机ID:node4

要求:

以基本镜像文件node.img为基础,创建一个镜像文件node4.img,以此创建一个虚拟机node4,虚拟机node4的改变将存储于node4.img中。

2、创建增量镜像文件

[root@qfedu.com ~]# qemu-img create -b node.img -f qcow2 node4.img
[root@qfedu.com ~]# qemu-img info node4.img image: node4.imgfile format: qcow2virtual size: 20G (21495808000 bytes)disk size: 33Mcluster_size: 65536backing file: node.img (actual path: node.img)

注:该实验只是针对qcow2格式的镜像文件,未测试raw格式的镜像文件是否可行。

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

[root@qfedu.com ~]# cp /etc/libvirt/qemu/node.xml /etc/libvirt/qemu/node4.xml
[root@qfedu.com ~]# vim /etc/libvirt/qemu/node4.xml 
<domain type='KVM'> <name>node4</name>                 #node4的虚拟机名,须修改,否则与基本虚拟机冲突 <uuid>4b7e91eb-6521-c2c6-cc64-c1ba72707fe4</uuid>  #node4的UUID,必须修改,否则与基本虚拟机冲突 <memory>524288</memory> <currentMemory>524288</currentMemory> <vcpu cpuset='0-1'>2</vcpu> <os>  <type arch='x86_64' machine='rhel5.4.0'>hvm</type>  <boot dev='hd'/> </os> <features>  <acpi/>  <apic/>  <pae/> </features> <clock offset='localtime'/> <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='/virhost/KVM_node/node4.img'/>  #将原指向/virhost/KVM_node/node.img改为node4.img   <target dev='vda' bus='virtio'/>   <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>  </disk>  <interface type='bridge'>   <mac address='54:52:00:69:d5:f4'/>       #修改网卡MAC,防止冲突   <source bridge='br0'/>   <model type='virtio'/>   <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>  </interface>  <interface type='bridge'>   <mac address='54:52:00:69:d5:e4'/>      #修改网卡MAC,防止冲突   <source bridge='br0'/>   <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'/>  <graphics type='vnc' port='5904' autoport='no' listen='0.0.0.0' passwd='xiaobai'>   <listen type='address' address='0.0.0.0'/>  </graphics>    <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>

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

[root@qfedu.com ~]#virsh define /etc/libvirt/qemu/node4.xml[root@qfedu.com ~]#virsh start node4 

5、测试

[root@qfedu.com ~]# du -h node.img 6.3G  node.img[root@qfedu.com ~]# du -h node4.img33M   node4.img[root@qfedu.com ~]# dd if=/dev/zero of=test bs=1M count=200  #在虚拟机node4上增量200M大小文件200+0 records in200+0 records out209715200 bytes (210 MB) copied, 1.00361 seconds, 209 MB/s[root@qfedu.com ~]# du -h node.img          #基本镜像文件node.img大小未变6.3G  node.img[root@qfedu.com ~]# du -h node4.img         #增量镜像文件node4.img增加200M了234M  node4.img

4、快照snapshot

为虚拟机vm8创建一个快照

创建快照

virsh snapshot-create-as 虚拟机名 [–name 快照名]

–name:指定快照名字

[root@qfedu.com ~]# virsh snapshot-create-as vm8 
vm8.snaperror: unsupported configuration: 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的加密

查看镜像文件格式:

qemu-img info 磁盘镜像文件路径

在虚拟机关机状态下才能查看,开机状态下查看会显示吸盘文件正在被另一个程序使用

[root@qfedu.com ~]# qemu-img info /var/lib/libvirt/images/vm8.img 
image: /var/lib/libvirt/images/vm8.img
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 10G

格式转换:

qemu-img convert -f 原磁盘镜像文件格式 -O 转换后的磁盘镜像文件格式 原磁盘镜像文件 转换后的磁盘镜像文件

把raw格式转换成qcow2格式

[root@qfedu.com ~]# qemu-img convert -f raw -O qcow2  /var/lib/libvirt/images/vm8.img /var/lib/libvirt/images/vm8_qcow2.img

格式转换原理上是创建一个新的格式的磁盘镜像文件,所以需要修改虚拟机的xml配置文件中的disk指向位置

[root@qfedu.com ~]# ls -l /var/lib/libvirt/images/total28381680 
-rw-------. 1 qemu qemu 10737418240 Aug 16 01:09 vm8.img
-rw-r--r--. 1 root root  3076521984 Aug 16 01:09 vm8_qcow2.img 
[root@qfedu.com ~]# qemu-img info /var/lib/libvirt/images/vm8_qcow2.img image: /var/lib/libvirt/images/vm8_qcow2.imgfile format: qcow2virtual size: 10G (10737418240 bytes)disk size: 2.9Gcluster_size: 65536

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

在虚拟机中创建一个目录,但目录中是空的

[root@qfedu.com ~]# mkdir /test
[root@qfedu.com ~]# ls /test 

给虚拟机vm8创建第一个快照vm8.snap1

[root@qfedu.com ~]# virsh snapshot-create-as vm8 vm8.snap1
[root@qfedu.com ~]# qemu-img info /var/lib/libvirt/images/vm8_qcow2.img 
image: /var/lib/libvirt/images/vm8_qcow2.imgfile format: qcow2virtual size: 10G (10737418240 bytes)disk size: 3.1Gcluster_size: 65536Snapshot list:ID     TAG         VM SIZE         DATE    VM CLOCK1     vm8.snap1     229M 2013-08-16 01:25:39  00:03:58.995

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

[root@qfedu.com ~]# cp install.log anaconda-ks.cfg  /test
[root@qfedu.com ~]# ls /testanaconda-ks.cfg  install.log 

给虚拟机vm8创建第二个快照vm8.snap2

[root@qfedu.com ~]# virsh snapshot-create-as vm8 vm8.snap2
Domain snapshot vm8.snap2 created
[root@qfedu.com ~]# virsh snapshot-list vm8 

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

恢复快照

virsh snapshot-revert 虚拟机名 快照名

[root@qfedu.com ~]# virsh shutdown vm8
[root@qfedu.com ~]# virsh snapshot-revert vm8 vm8.snap1
convert
revert

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

[root@qfedu.com ~]# ls /test

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

[root@qfedu.com ~]# virsh shutdown vm8
[root@qfedu.com ~]# virsh snapshot-revert vm8 vm8.snap2 

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

[root@qfedu.com ~]# ls /testanaconda-ks.cfg  install.log

查看虚拟机快照

virsh snapshot-list 虚拟机名

[root@qfedu.com ~]# virsh snapshot-list vm8 

删除虚拟机快照

virsh snapshot-delete --snapshotname 快照名 虚拟机名

[root@qfedu.com ~]# virsh snapshot-delete --snapshotname vm8.snap2 vm8
[root@qfedu.com ~]# virsh snapshot-list vm8 

KVM网络及脚本管理

一、KVM网络管理

注:centos stream 9(bug)的virbr0经常莫名其妙没ip,重启libvirtd可以解决。重启之前所有虚拟机需要关闭,不然虚拟机也没有ip。

画图工具

https://www.processon.com

分类:

网络:

nat 
isolated 

接口:

bridge

虚拟交换机

​ linux-bridge(linux自带)

​ ovs(open-Vswitch)

NAT网络拓扑

在这里插入图片描述
原理:
在NAT模式下,虚拟机与外部网络通过宿主机进行通信。虚拟机使用宿主机的网络配置,并通过宿主机的IP地址和端口与外部网络通信。这种模式类似于家庭网络中的路由器工作方式,其中虚拟机是内网设备,宿主机是路由器,负责将内部IP地址转换为外部可识别的IP地址。
特点:
虚拟机可以方便地访问外部网络,但外部网络无法直接访问虚拟机。因此,它非常适合测试环境,其中虚拟机需要访问互联网,但不需要从外部直接访问。
实现:
KVM通过iptables规则在宿主机上实现NAT功能,将虚拟机的内部IP地址转换为宿主机的外部IP地址和不同的端口号,以实现与外部网络的通信。

隔离网络拓扑

在这里插入图片描述
原理:
在隔离模式下,虚拟机与外部网络之间是完全隔离的。虚拟机无法主动访问外部网络,外部网络也无法直接访问虚拟机。这种模式通过创建一个私有的、封闭的网络环境来实现虚拟机的安全隔离。
特点:
隔离模式适合需要高度隔离环境的应用场景,可以在保障虚拟机安全的同时实现网络通信。例如,在敏感数据处理或安全测试环境中,可以使用隔离模式来确保虚拟机不会受到外部网络的威胁。
实现:
KVM通过创建一个私有的虚拟网络(如vnet0)来实现隔离模式。虚拟机被连接到这个私有的虚拟网络上,而外部网络无法直接访问这个网络。虚拟机之间的通信也只能在这个私有的虚拟网络内部进行。

桥接网络拓扑

在这里插入图片描述
原理:
在桥接模式下,虚拟机与外部网络直接连接,就好像它们都是同一物理网络上的物理机一样。KVM在宿主机上创建一个虚拟网桥(如br0),将物理网卡和虚拟机的虚拟网卡都连接到这个网桥上。这样,虚拟机就可以像物理机一样与外部网络通信,无需经过宿主机的转发。
特点:
虚拟机可以获得外部网络的直接访问权限,因此适用于需要搭建虚拟网络环境、实现虚拟机之间通信以及与外部网络通信的场景。
实现:
KVM通过Linux的网桥功能实现桥接模式。在创建虚拟机时,将虚拟机的虚拟网卡连接到指定的虚拟网桥上,就可以实现与外部网络的直接通信。

可以通过查看mac地址是否一致来确定是不是一根线上的两个接口

[root@qfedu.com ~]# brctl show
bridge name	  bridge id		        STP enabled	   interfaces
virbr0		  8000.5254003c2ba7	    yes		       virbr0-nic
							                       vnet2
   						                           vnet3
注:centos8需要安装epel才能安装brctl

从交换机上把vnet网卡删除:

[root@qfedu.com ~]# brctl delif  virbr0 vnet0

添加vnet网卡到交换机上:

[root@qfedu.com ~]# brctl addif  virbr0 vnet0

1、配置文件方式配置桥接

注意:centos stream9 上的桥接还没有验证

在宿主机上
1.修改配置文件
  [root@qfedu.com ~]# cat ifcfg-br0 
  TYPE=Bridge
  NAME=br0
  DEVICE=br0
  ONBOOT="yes"
  BOOTPROTO=static
  IPADDR=10.18.44.251
  GATEWAY=10.18.44.1
  NETMASK=255.255.255.0  /NETWORK=255.255.255.0 PREFIX=24
  DNS1=10.18.44.100
  DNS2=8.8.8.8

  [root@qfedu.com ~]# cat ifcfg-enp3s0
  DEVICE="enp3s0"
  ONBOOT="yes"
  BRIDGE=br0

reboot宿主机:
	2.重启libvirtd服务
	3.重启network服务 

删除桥接网卡步骤:
  1.删除br0的配置文件
  2.修改正常网卡的配置文件
  3.重启系统     

2、配置文件方式创建nat网络

[root@qfedu.com ~]# cp /etc/libvirt/qemu/networks/nat2.xml /etc/libvirt/qemu/networks/nat3.xml

[root@qfedu.com ~]# vim /etc/libvirt/qemu/networks/nat3.xml
<network>
 <name>nat3</name>
 <uuid>4d8b9b5c-748f-4e16-a509-848202b9c83b</uuid>
 <forward mode='nat'/>       //和隔离模式的区别
 <bridge name='virbr4' stp='on' delay='0'/>
 <mac address='52:57:00:62:0c:d4'/>
 <domain name='nat3'/>
 <ip address='192.168.104.1' netmask='255.255.255.0'>
  <dhcp>
   <range start='192.168.104.128' end='192.168.104.254'/>
  </dhcp>
 </ip>
</network>

重启服务:
[root@qfedu.com ~]# systemctl  restart libvirtd  

3、配置文件方式创建isolated网络

<network> 
    <name>isolate1</name> 
    <uuid>6341d3a6-7330-4e45-a8fe-164a6a68929a</uuid> 
    <bridge name='virbr2' stp='on' delay='0'/> 
    <mac address='52:54:00:6b:39:0c'/> 
    <domain name='isolate1'/> 
    <ip address='192.168.101.1' netmask='255.255.255.0'>  
    	<dhcp>   
        	<range start='192.168.101.128' end='192.168.101.254'/>  
        </dhcp> 
    </ip>
</network>     
查看所有的网络:
[root@qfedu.com ~]# virsh net-list
启动网络:
[root@qfedu.com ~]# virsh net-start isolated200
开机自启动:
[root@qfedu.com ~]# virsh net-autostart  isolated200   
网络相关基本命令
查看一个guest主机的网络接口信息:
[root@qfedu.com ~]# virsh domiflist vm1
接口      类型      源      型号      MAC
---------------------------------------
vnet0    network   default   virtio    52:54:00:94:a7:a1

Virbr0的DHCP

Virbr0 是 KVM 默认创建的一个 Bridge,其作用是为连接其上的虚机网卡提供 NAT 访问外网的功能。

Virbr0 默认分配了一个IP 192.168.122.1,并为连接其上的其他虚拟网卡提供 DHCP 服务。

Virbr0 使用 dnsmasq 提供 DHCP 服务,可以在宿主机中查看该进程信息
[root@qfedu.com ~]# ps -elf|grep dnsmasq  
5 S libvirt+  2422  1  0  80  0 -  7054 poll_s 11:26 ?  00:00:00 
/usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf

在 /var/lib/libvirt/dnsmasq/ 目录下有一个 virbr0.status 文件,当 VM1 成功获得 DHCP 的 IP 后,可以在该文件中查看到相应的信息

[root@qfedu.com ~]# cat virbr0.status   
[   {    "ip-address": "192.168.122.28",    "mac-address": "52:54:00:94:a7:a1",    "hostname": "vm1",    "expiry-time": 1511626337   }  ]

从外面客户端访问KVM中NAT方式的内网虚拟机:

本机开启路由,开启防火墙,写入如下规则:
[root@qfedu.com ~]# iptables -t nat -A PREROUTING -p tcp --dport 10022 -j DNAT --to-destination 192.168.10.11:22

从其他客户端测试:
[wing@macserver ~]$ ssh root@192.168.22.108 -p 10022

#iptables -A INPUT -p tcp --dport 80 -j DROP

vmware vsphere套件 esxi
xen 
qemu-kvm 红帽官方

nat 

二、脚本管理KVM

1、批量创建虚机脚本

#!/bin/bash
#KVM batch create vm tool
#version: 0.1
#author: wing
#需要事先准备模板镜像和配置文件模板
echo "1.创建自定义配置单个虚拟机
2.批量创建自定义配置虚拟机
3.批量创建默认配置虚拟机
4.删除虚拟机"
#扩展功能:查看现在虚拟机  查看某个虚拟机的配置 升配/降配  添加/删除网络 
read -p "选取你的操作(1/2/3):" 
opbatch_self_define() {    
	KVMname=`openssl rand -hex 5`   
	sourceimage=/var/lib/libvirt/images/vmmodel.img    				      sourcexml=/etc/libvirt/qemu/vmmodel.xml    
	newimg=/var/lib/libvirt/images/${KVMname}.img    
	newxml=/etc/libvirt/qemu/${KVMname}.xml    
	cp $sourceimage  $newimg    
	cp $sourcexml $newxml    
	KVMuuid=`uuidgen`    
	KVMmem=${1}000000    
	KVMcpu=$2    
	KVMimg=$newimg    
	KVMmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`     
	sed -i "s@KVMname@$KVMname@;s@KVMuuid@$KVMuuid@;s@KVMmem@$KVMmem@;s@KVMcpu@$KVMcpu@;s@KVMimg@$KVMimg@;s@KVMmac@$KVMmac@" $newxml    
	virsh define $newxml    
	virsh list --all
}
self_define() {    
	read -p "请输入新虚机名称:" newname    
	read -p "请输入新虚机内存大小(G):" newmem    
	read -p "请输入新虚机cpu个数:" newcpu    
	sourceimage=/var/lib/libvirt/images/vmmodel.img   
	sourcexml=/etc/libvirt/qemu/vmmodel.xml    
	newimg=/var/lib/libvirt/images/${newname}.img    
	newxml=/etc/libvirt/qemu/${newname}.xml     
	cp $sourceimage  $newimg    
	cp $sourcexml $newxml    
	KVMname=$newname    
	KVMuuid=`uuidgen`    
	KVMmem=${newmem}000000    
	KVMcpu=$newcpu    
	KVMimg=$newimg    
	KVMmac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`    
	sed -i "s@KVMname@$KVMname@;s@KVMuuid@$KVMuuid@;s@KVMmem@$KVMmem@;s@KVMcpu@$KVMcpu@;s@KVMimg@$KVMimg@;s@KVMmac@$KVMmac@" $newxml    
	virsh define $newxml    
	virsh list --all
}

case $op in
1)	self_define;;
2)  read -p "请输入要创建的虚拟机的个数:" num    
	read -p "请输入新虚机内存大小(G):" newmem    
	read -p "请输入新虚机cpu个数:" newcpu    
	for((i=1;i<=$num;i++))    
	do        
		batch_self_define $newmem $newcpu    
	done;;
3)  read -p "请输入要创建的虚拟机的个数:" num    
	for((i=1;i<=$num;i++))    
	do        
		batch_self_define 1 1    
	done;;
*)  echo "输入错误,请重新执行脚本"    
	exit;;
esac

2、配置文件模板

[root@qfedu.com ~]# vim /etc/libvirt/qemu/vmmodel.xml<domain type='KVM'> <name>KVMname</name> <uuid>KVMuuid</uuid> <memory unit='KiB'>KVMmem</memory> <currentMemory unit='KiB'>KVMmem</currentMemory> <vcpu placement='static'>KVMcpu</vcpu> <os>  <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>  <boot dev='hd'/> </os> <features>  <acpi/>  <apic/> </features> <cpu mode='custom' match='exact' check='partial'>  <model fallback='allow'>Haswell-noTSX</model> </cpu> <clock offset='utc'>  <timer name='rtc' tickpolicy='catchup'/>  <timer name='pit' tickpolicy='delay'/>  <timer name='hpet' present='no'/> </clock> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>destroy</on_crash> <pm>  <suspend-to-mem enabled='no'/>  <suspend-to-disk enabled='no'/> </pm> <devices>  <emulator>/usr/libexec/qemu-KVM</emulator>  <disk type='file' device='disk'>   <driver name='qemu' type='qcow2'/>   <source file='KVMimg'/>   <target dev='vda' bus='virtio'/>   <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>  </disk>  <controller type='usb' index='0' model='ich9-ehci1'>   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>  </controller>  <controller type='usb' index='0' model='ich9-uhci1'>   <master startport='0'/>   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>  </controller>  <controller type='usb' index='0' model='ich9-uhci2'>   <master startport='2'/>   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>  </controller>  <controller type='usb' index='0' model='ich9-uhci3'>   <master startport='4'/>   <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>  </controller>  <controller type='pci' index='0' model='pci-root'/>  <controller type='virtio-serial' index='0'>   <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>  </controller>  <interface type='network'>   <mac address='52:54:00:KVMmac'/>   <source network='default'/>   <model type='virtio'/>   <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>  </interface>  <serial type='pty'>   <target type='isa-serial' port='0'>    <model name='isa-serial'/>   </target>  </serial>  <console type='pty'>   <target type='serial' port='0'/>  </console>  <channel type='unix'>   <target type='virtio' name='org.qemu.guest_agent.0'/>   <address type='virtio-serial' controller='0' bus='0' port='1'/>  </channel>  <input type='mouse' bus='ps2'/>  <input type='keyboard' bus='ps2'/>  <memballoon model='virtio'>   <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>  </memballoon> </devices></domain>

3、随机生成mac地址

其中5种方式:

[root@qfedu.com ~]# echo $[$RANDOM%9]$[$RANDOM%9]:$[$RANDOM%9]$[$RANDOM%9]:$[$RANDOM%9]$[$RANDOM%9]
65:42:31

[root@qfedu.com ~]# echo `openssl rand -hex 1`:`openssl rand -hex 1`:`openssl rand -hex 1`99:6e:67 
[root@qfedu.com ~]# openssl rand -hex 3 | sed -r 's/(..)/\1:/g'|sed 's/.$//'
e9:b6:12 
[root@qfedu.com ~]# openssl rand -hex 3 | sed -r 's/(..)(..)(..)/\1:\2:\3/g'
94:89:e3
[root@qfedu.com ~]# openssl rand -hex 3 | sed -r 's/..\B/&:/g'
c5:66:90
\B 表示 非单词边界
\b 表示 单词边界
<a  表示以a开头的单词
b>  表示以b结尾的单词

使用UUID:
[root@qfedu.com ~]# uuidgen | sed -r 's/(..)(..)(..)(.*)/\1:\2:\3/'

使用熵池里面的随机数:
[root@qfedu.com ~]# echo -n 00:60:2F; dd bs=1 count=3 if=/dev/random 2>/dev/null | hexdump -v -e '/1 ":%02X"'

三、简历上可写的KVM相关项目

1、迁移

从物理机器迁移到KVM

从KVM迁移到云主机

2、文件管理服务(ftp nfs jira+wiki)

3、日志服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1836232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

立创开源学习篇(一)

1.机壳地 外面包围的一圈是机壳地&#xff0c;和金属外壳相连与电路板的GND不相连&#xff1a;&#xff08;大疆很多产品有此设计&#xff09; 屏蔽和接地&#xff1a;通过在电路板周围打孔&#xff0c;并连接到机壳地&#xff0c;可以形成有效的电磁屏蔽层&#xff08;形成金…

LabVIEW开发为什么沟通需求非常重要

在LabVIEW开发项目中&#xff0c;需求沟通是项目成功的基石。以下是需求沟通的重要性及其原因&#xff1a; 明确项目目标&#xff1a; 定义清晰的目标&#xff1a;通过与用户的沟通&#xff0c;可以明确项目的目标和范围&#xff0c;确保开发团队理解用户的实际需求&#xff0c…

Windows系统部署本地SQL_Server指引

Windows系统部署本地SQL_Server指引 此指引文档环境为Windows10系统&#xff0c;部署SQL_Server 2019为例&#xff0c;同系列系统软件安装步骤类似。 一、部署前准备&#xff1b; 下载好相关镜像文件&#xff1b;设备系统启动后&#xff0c;将不必要的软件停用&#xff0c;避…

4M-21:霸气侧漏高效的20+多模态AI模型

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则…

Python的print,input与注释的使用

1.print的使用 2.input的使用 3.如何注释 1.print的使用 1.1建立俩个变量a&#xff0c;b&#xff0c;直接把变量放在print的括号里面就会打印其的值。 1.2print可以同时打印多个&#xff0c;打印ab的值与字符串‘11’。 1.3先用chr&#xff08;&#xff09;函数去获取对应97…

CIC-DDoS2019-Detection

CIC-DDoS2019 对CIC-DDoS2019数据集进行检测,本文提供了如下内容&#xff1a; 数据清洗与合并机器学习模型深度学习模型PCA,t-SNE分析数据&#xff0c;结果可视化 代码地址&#xff1a;[daetz-coder](https://github.com/daetz-coder/CIC-DDoS2019-Detection) 1、数据集加载…

基于Flask+Mysql+EasyUI的简单用户管理系统

1、系统实现功能 添加用户查看用户修改用户删除用户 完整代码下载地址在最后&#xff0c;若显示链接不存在&#xff0c;可能是资源还没有审核&#xff0c;可私聊我发完整代码。 2、功能实现 2.1 添加用户 构建添加用户的Flask接口add_user() app.route("/add/user&quo…

计算机网络(谢希仁第六版)| 课后习题与答案 | 物理层 | 题目知识点详细分析

计算机网络&#xff08;谢希仁第六版&#xff09;课后习题与答案 物理层 博客只对老师给的重点进行整理&#xff0c;完整的课后习题答案见Gitee下载&#xff1a;《计算机网络教程&#xff08;第6版&#xff09;&#xff08;微课版&#xff09;》习题答案 2-5 请画出数据流1 0 1…

JavaFX 分页

分页控件用于浏览多个页面。 我们典型地使用对网页的分页控制&#xff0c;例如博客。 在博客页面的底部&#xff0c;我们可以看到一个矩形区域&#xff0c;作为一个数字列表来指示页面索引&#xff0c;以及一个下一个/上一个按钮来链接到下一个/上一个页面。 创建分页控件 分…

OpenCV中的圆形标靶检测——findCirclesGrid()(二)

本章我们开始讲解基于层次聚类的标靶检测算法。当我们调用如下API,且flags中包含cv::CALIB_CB_CLUSTERING标志位时,将会执行基于层次聚类的斑点检测算法。算法支持对称标靶和非对称标靶两类,相应的需要将下述flags设为包含CALIB_CB_SYMMETRIC_GRID或CALIB_CB_ASYMMETRIC_GRI…

安卓Context上下文

目录 前言一、Context简介二、Application Context2.1 Application Context的创建过程2.2 Application Context的获取过程 三、Activity的Context创建过程四、Service的Context创建过程 前言 Context也就是上下文对象&#xff0c;是Android较为常用的类&#xff0c;但是对于Co…

MySQL事务、数据库的存储引擎

1. 事务的概念 定义&#xff1a;事务就是一组数据库操作序列&#xff08;包含一个或多个SQL操作命令&#xff09;&#xff0c;事务会把所有操作看作是一个不可分割的整体向数据库系统提交或撤销操作&#xff0c;所有操作要么都执行&#xff0c;要么都不执行。 1.1事务的 ACID …

重学java 74.Lombok的使用

少点心气&#xff0c;多点干劲 —— 24.6.18 一、lombok的安装使用 1.作用: 简化javabean开发 2.使用: a.下插件 ->如果是idea2022不用下载了,自带 b.导lombok的jar包 安装教程&#xff1a; http://t.csdnimg.cn/wq9MM c.修改设置 二、lombok的介绍 Lombok通过增加一…

短路是怎么形成的

1. 短路分为电源短路和用电器短路。 电源短路&#xff1a;电流不经过任何用电器&#xff0c;直接由正极经过导线流向负极&#xff0c;由于电源内阻很小&#xff0c;导致短路电流很大&#xff0c;特别容易烧坏电源。 用电器短路&#xff1a;也叫部分电路短路&#xff0c;即一根…

Java对象头的组成

介绍对象头之前先说一下Java对象内部的组成结构&#xff1a; 1&#xff0c;成员变量&#xff08;Data1...DataN&#xff09; 2, 对象头 Java对象头的组成&#xff08;根据对象头分析对象状态借此优化代码&#xff09; <dependency> <groupId>org.openjdk.jol&l…

Spring注解----------@Deprecated

情景&#xff1a; 在我们开发过程中&#xff0c;有时候会遇到我们需要将几个类中的方法集中到一个类中&#xff0c;但是我们又不希望把我们的原来的类删掉&#xff08;就是单纯的不想删除&#xff0c;都是我写的代码我不想杀死我的结晶&#xff0c;不能说我写的是shi&#xff…

再次递表港交所,慧算账能否把握AI+财税SaaS机遇?

5月以来&#xff0c;港股IPO市场日渐兴旺&#xff0c;多家公司实现上市首日“零破发”&#xff0c;平均收涨约30%&#xff0c;6月更是出现了超2500倍超购新股。市场赚钱效应显现&#xff0c;投资者打新随之热情高涨&#xff0c;越来越多国内企业也开始抓紧赴港上市。 近日&…

[Qt的学习日常]--常用控件3

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、显示类控…

猫头虎分享已解决Bug || 前端领域技术问题解析

原创作者&#xff1a; 猫头虎 作者微信号&#xff1a; Libin9iOak 作者公众号&#xff1a; 猫头虎技术团队 更新日期&#xff1a; 2024年6月6日 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &…

06--jenkins构建CI_CD

前言&#xff1a;上一篇文章整理了git的部署和使用&#xff0c;这章主要复习持续集成软件Jenkins&#xff0c;这个技术现在在云计算方面也是有应用的&#xff0c;同时也是越高级越智能的软件代表。 1、概念简介 1&#xff09;jenkins是什么 Jenkins是一个开源的、可扩展的持…