一、虚拟化技术概览
虚拟化技术起源于20世纪60年代IBM大型机系统,并在70年代System 370系列中普及。它通过一个名为虚拟机监控器(VMM)的程序,在物理硬件上创建多个独立运行的操作系统实例——即虚拟机(VM)。近年来,随着多核系统、云计算的广泛应用,虚拟化技术不仅降低了IT成本,还提高了系统的安全性和可靠性。
虚拟化是一个广义的概念,涵盖了对计算资源的抽象,比如虚拟内存技术,它让应用程序以为自己拥有连续的地址空间,但实际上数据可能被分割并存储在不同的位置,甚至是外部存储设备上。
二、主流虚拟化方案简介
1、虚拟化技术的主要类型
平台虚拟化:涉及计算机和操作系统的虚拟化。
资源虚拟化:专注于特定系统资源如内存、存储、网络的虚拟化。
应用程序虚拟化:包含仿真、模拟等技术,用于隔离应用运行环境。
2、平台虚拟化技术细分
平台虚拟化通常指的是使用一个控制程序(也称为VMM或Hypervisor),来隐藏物理硬件的具体细节,为用户提供统一的计算环境。根据其实现方式的不同,可以进一步细分为:
操作系统级虚拟化:在单一操作系统内核中创建多个隔离的用户环境,例如Solaris Containers、FreeBSD Jails、OpenVZ等。这类虚拟化技术轻便高效,但限制了只能运行相同类型的内核。
部分虚拟化:VMM仅模拟部分硬件功能,要求客户操作系统进行修改才能运行。历史上的例子包括早期的分时系统。
全虚拟化:VMM完全模拟底层硬件,允许未经修改的操作系统在其上运行。如VMware Workstation、QEMU等。
超虚拟化:修改客户操作系统以直接与VMM交互,提高性能,如Xen。
硬件辅助虚拟化:利用硬件支持(如Intel VT-x或AMD-V)实现高效的全虚拟化。
现代虚拟化解决方案常常结合多种技术以优化性能和灵活性。
这里推荐使用api集成管理 api当中的这个块存储(云硬盘) 使用这个云硬盘接口来实现储存功能,这样可以更好的有利于使用
三、KVM虚拟化技术简介
1、KVM架构
2、KVM架构解析
KVM虚拟化技术简介
从RHEL 6开始,红帽公司直接将KVM模块集成到了内核的一部分。相比之下,在RHEL 6之前的版本中,默认内核并不支持Xen,用户需要安装带有Xen功能的特定内核。
KVM(Kernel-based Virtual Machine)是专门为运行在x86硬件上的虚拟化基础设施设计的。它是第一个成为原生Linux内核(2.6.20)一部分的hypervisor,由Avi Kivity开发并维护,目前由Red Hat所有。
KVM的特点
- 支持的硬件平台:KVM不仅支持x86架构,还支持PowerPC和IA64架构,并且提供了对称多处理(SMP)主机的支持以及企业级特性,如活迁移等。
- 实现方式:KVM作为一个内核模块实现,一旦加载该模块,Linux内核便具备了hypervisor的功能。
- 虚拟化支持:对于支持hypervisor指令集的硬件(如Intel VT或AMD-V),KVM提供完全虚拟化。此外,KVM还支持准虚拟化来宾操作系统,如Linux和Windows。
- 组成部件:KVM包含一个内核模块和一个用户空间组件QEMU。内核模块负责管理虚拟化硬件,而QEMU则用于模拟PC平台,并处理来宾操作系统发出的请求。
KVM的工作原理
当一个新的操作系统在KVM上启动时,它会成为一个宿主操作系统上的进程。然而,与传统Linux进程不同的是,来宾操作系统由hypervisor标识为“来宾”模式,独立于内核和用户模式。每个来宾操作系统都通过/dev/KVM
设备映射,拥有自己的虚拟地址空间,该空间映射到主机内核的物理地址空间。
KVM软件安装指南
环境准备
首先,确保CPU支持虚拟化技术(VT-x for Intel or AMD-V for AMD):
shell
深色版本
1[root@qfedu.com ~]# cat /proc/cpuinfo | grep -E 'vmx|svm'
清理旧环境
如果之前已安装过KVM相关组件,建议先卸载:
shell
深色版本
1[root@qfedu.com ~]# yum remove `rpm -qa | egrep 'qemu|virt|KVM'` -y
2[root@qfedu.com ~]# rm -rf /var/lib/libvirt /etc/libvirt/
安装软件
根据不同的CentOS版本,安装所需的软件包:
- CentOS 6 shell
深色版本
1[root@qfedu.com ~]# yum groupinstall "Virtualization" "Virtualization Client" "Virtualization Platform" "Virtualization Tools" -y
- CentOS 7 shell
深色版本
1[root@qfedu.com ~]# yum install qemu-kvm libvirt virt-manager librbd1-devel -y
其中:
qemu-kvm
:主包libvirt
:API接口virt-manager
:图形管理程序
- CentOS 8 若使用组安装遇到版本问题,先升级RPM: shell
深色版本
1[root@qfedu.com ~]# yum upgrade rpm -y
组安装后还需要单独安装
virt-manager
。
启动服务
启动libvirtd服务:
shell
深色版本
1[root@qfedu.com ~]# systemctl start libvirtd
检查KVM模块
确认KVM模块已加载:
shell
深色版本
1[root@qfedu.com ~]# lsmod | grep KVM
Guest OS安装
- 图形模式 shell
深色版本
1[root@qfedu.com ~]# virt-manager
- 文本模式 (适用于现场配置虚拟机规格)
- 命令行模式 (最常用的方式,结合模板镜像+配置文件)
- 通过Cockpit shell
深色版本
1[root@qfedu.com ~]# yum install cockpit -y 2[root@qfedu.com ~]# systemctl start cockpit
访问:浏览器访问
服务器地址:9090
-
文本方式安装虚拟机
注意事项
在极端情况下,服务器本身没有图形界面,客户端也没有图形界面时,可以使用文本方式安装虚拟机。
基础命令
使用
virt-install
命令来安装虚拟机,无需图形界面:shell
深色版本
1# 对于RHEL 6: 2virt-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 3 4# 对于CentOS 7: 5virt-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 6 7# 或者使用本地ISO文件: 8virt-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 /root/下载/CentOS-7-x86_64-DVD-2003.iso -x console=ttyS0 --nographics
安装完成后,可以通过以下命令连接虚拟机:
shell
深色版本
1virsh console VMachinename # 替换VMachinename为实际的虚拟机名称
准备工作
- 上传所需文件
- 上传所需镜像文件或已安装系统的硬盘文件到指定位置。
- 镜像文件建议单独放置在一个目录(如
/ISO
)。 - 硬盘文件则需要放在前面建立的存储池中(如
/home/kvm/images
)。
- 安装VNC
- 为了支持图形化安装,可以安装VNC: shell
深色版本
1yum -y install tigervnc*
- 为了支持图形化安装,可以安装VNC: shell
安装虚拟机
直接使用ISO镜像安装
shell
深色版本
1virt-install --name=fuliwenKylin --vcpus=8 --memory=8G --disk path=/home/kvm/images/XXX.img,format=qcow2,size=50,bus=virtio --cdrom /ISO/XXX.iso --network bridge=br0,model=virtio --autostart --graphics vnc,listen=0.0.0.0 --noautoconsole
使用现有的qcow2或img硬盘文件
shell
深色版本
1virt-install --name=wudapengKylinV10 --vcpus=8 --ram=16384 --disk path=/KVM/images/wudapengKylin.qcow2,format=raw,bus=virtio --network bridge=br0,model=virtio --force --import --graphics vnc,listen=0.0.0.0 --noautoconsole
参数说明
--name
:虚拟机名称--vcpus
:CPU核心数--memory
:内存大小--disk
:指定磁盘文件路径及格式--cdrom
:添加的DVD驱动器--network
:配置网络bridge=br0
:指定之前创建的网桥model=virtio
:定义网卡的接入模式
--autostart
:配置开机自启(按需配置)--graphics vnc
:配置VNClisten=0.0.0.0
:配置VNC监听地址--noautoconsole
:不自动运行控制台(默认是走console口安装)
排错
- 安装过程中,手动配置IP地址,如果提示找不到URL路径,需要返回并重新配置URL为实际的地址(如
ftp://192.168.100.230/rhel6u4
),这里的IP应为网桥br0
的IP地址。 - 给虚拟机分配的内存必须大于2048MB,否则可能会报错。
命令行模式安装
- 虚拟机配置文件 shell
深色版本
1[root@qfedu.com ~]# ls /etc/libvirt/qemu 2networks vm1.xml
- 存储虚拟机的介质 shell
深色版本
1[root@qfedu.com ~]# ls /var/lib/libvirt/images/ 2vm1.img
- 根据配置文件创建虚拟机
- 需要有磁盘镜像文件: shell
深色版本
1[root@qfedu.com ~]# cp vm1.img vm2.img
- 需要有配置文件: shell
深色版本
1[root@qfedu.com ~]# cp vm1.xml vm2.xml
- 修改配置文件必要的内容(如UUID、MAC地址、主机名、磁盘镜像文件名)。
- 需要有磁盘镜像文件: shell
- 创建虚拟机 shell
深色版本
1[root@qfedu.com ~]# virsh define /etc/libvirt/qemu/vm2.xml
- 重启虚拟机 shell
深色版本
1[root@qfedu.com ~]# systemctl restart libvirtd
- 开启主机路由转发 shell
深色版本
1[root@qfedu.com ~]# vim /etc/sysctl.conf 2net.ipv4.ip_forward = 1
保存退出后,执行:
shell
深色版本
1[root@qfedu.com ~]# sysctl -p
实例
使用模板镜像+配置文件方式创建虚拟机:
- 复制模板镜像和配置文件 shell
深色版本
1[root@KVM ~]# cp /var/lib/libvirt/images/vm2.img /var/lib/libvirt/images/vm3.img 2[root@KVM ~]# cp /etc/libvirt/qemu/vm2.xml /etc/libvirt/qemu/vm3.xml
- 修改配置文件 xml
深色版本
1<domain type='kvm'> 2 <name>vm3</name> 3 <uuid>a2f62549-c6b7-4b8f-a8e2-c14edda35a78</uuid> 4 <memory unit='KiB'>2099200</memory> 5 <currentMemory unit='KiB'>2099200</currentMemory> 6 <vcpu placement='static'>2</vcpu> 7 <os> 8 <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type> 9 <boot dev='hd'/> 10 </os> 11 <features> 12 <acpi/> 13 <apic/> 14 </features> 15 <cpu mode='custom' match='exact' check='partial'> 16 <model fallback='allow'>Haswell-noTSX</model> 17 </cpu> 18 <clock offset='utc'> 19 <timer name='rtc' tickpolicy='catchup'/> 20 <timer name='pit' tickpolicy='delay'/> 21 <timer name='hpet' present='no'/> 22 </clock> 23 <devices> 24 <emulator>/usr/libexec/qemu-kvm</emulator> 25 <disk type='file' device='disk'> 26 <driver name='qemu' type='qcow2'/> 27 <source file='/var/lib/libvirt/images/vm3.img'/> 28 <target dev='vda' bus='virtio'/> 29 <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> 30 </disk> 31 </devices> 32</domain>
- 上传所需文件
xml
深色版本
1<disk type='file' device='disk'>
2 <driver name='qemu' type='qcow2'/>
3 <source file='/var/lib/libvirt/images/vm3-1.img'/>
4 <target dev='vda' bus='virtio'/>
5 <address type='pci' domain='0x0000' bus='0x00' slot='0x16' function='0x0'/>
6</disk>
7
8<controller type='u' index='0' model='ich9-ehci1'>
9 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x7'/>
10</controller>
11
12<controller type='u' index='0' model='ich9-uhci1'>
13 <master startport='0'/>
14 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0' multifunction='on'/>
15</controller>
16
17<controller type='u' index='0' model='ich9-uhci2'>
18 <master startport='2'/>
19 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x1'/>
20</controller>
21
22<controller type='u' index='0' model='ich9-uhci3'>
23 <master startport='4'/>
24 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x2'/>
25</controller>
26
27<controller type='pci' index='0' model='pci-root'/>
28
29<controller type='virtio-serial' index='0'>
30 <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0'/>
31</controller>
32
33<interface type='network'>
34 <mac address='52:54:00:f2:28:6f'/>
35 <source network='default'/>
36 <model type='virtio'/>
37 <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
38</interface>
39
40<serial type='pty'>
41 <target type='isa-serial' port='0'>
42 <model name='isa-serial'/>
43 </target>
44</serial>
45
46<console type='pty'>
47 <target type='serial' port='0'/>
48</console>
49
50<channel type='unix'>
51 <target type='virtio' name='org.qemu.guest_agent.0'/>
52 <address type='virtio-serial' controller='0' bus='0' port='1'/>
53</channel>
54
55<input type='mouse' bus='ps2'/>
56
57<input type='keyboard' bus='ps2'/>
58
59<memballoon model='virtio'>
60 <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
61</memballoon>
62
63</devices>
64</domain>
解释
这段配置描述了虚拟机的部分硬件配置:
- 磁盘配置
- 类型为文件(
file
),设备类型为磁盘(disk
)。 - 使用
qcow2
格式。 - 指定了磁盘文件的路径为
/var/lib/libvirt/images/vm3-1.img
。 - 目标设备名为
vda
,总线类型为virtio
。 - PCI地址为
domain='0x0000' bus='0x00' slot='0x16' function='0x0'
。
- 类型为文件(
- U控制器配置
- 包括一个EHCI控制器和三个UHCI控制器。
- PCI地址分别为
slot='0x04'
的不同函数号。
- PCI控制器
- 模型为
pci-root
。
- 模型为
- virtio-serial控制器
- PCI地址为
domain='0x0000' bus='0x00' slot='0x05' function='0x0'
。
- PCI地址为
- 网络接口
- MAC地址为
52:54:00:f2:28:6f
。 - 使用
default
网络源。 - 总线类型为
virtio
。 - PCI地址为
domain='0x0000' bus='0x00' slot='0x03' function='0x0'
。
- MAC地址为
- 串行端口和控制台
- 包括一个串行端口和一个控制台,均指向
isa-serial
类型的端口0。
- 包括一个串行端口和一个控制台,均指向
- QEMU Guest Agent通道
- 用于与QEMU Guest Agent通信。
- 使用
virtio-serial
类型的地址controller='0' bus='0' port='1'
。
- 输入设备
- 包括鼠标和键盘,均连接到PS/2总线上。
- 内存气球设备
- 模型为
virtio
。 - PCI地址为
domain='0x0000' bus='0x00' slot='0x07' function='0x0'
。
- 模型为
确保在实际应用中根据需要调整这些配置项,特别是文件路径、MAC地址、以及其他可能影响虚拟机行为的参数。