KVM 虚拟化技术
1.1 前言
1.1.1 什么是虚拟化?
在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。
virtual machines(虚拟机) virtualization server(虚拟化服务器) physical server(物理服务器) shared storage(共享存储)
由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。
一般所指的虚拟化资源包括计算能力和数据存储。
由于目前信息技术领域的很多企业都曾在宣传中将该企业的某种技术称为虚拟化技术,这些技术涵盖的范围可以从Java虚拟机技术到系统管理软件,这就使得准确的界定虚拟技术变得困难。因此各种相关学术论文在谈到虚拟技术时常常提到的便是如前面所提到的那个不严格的定义。
1.1.2 为什么要用虚拟化
🏆同一台物理机运行多个不同版本应用软件
🏆硬件依赖性较低和便于数据迁移
图 - 虚拟化前后对比
1.1.3 虚拟化技术的优势
1.降低运营成本
服务器虚拟化降低了IT基础设施的运营成本,令系统管理员摆脱了繁重的物理服务器、OS、中间件及兼容性的管理工作,减少人工干预频率,使管理更加强大、便捷。
2.提高应用兼容性
服务器虚拟化提供的封装性和隔离性使大量应用独立运行于各种环境中,管理人员不需频繁根据底层环境调整应用,只需构建一个应用版本并将其发布到虚拟化后的不同类型平台上即可。
3.加速应用部署
采用服务器虚拟化技术只需输入激活配置参数、拷贝虚拟机、启动虚拟机、激活虚拟机即可完成部署,大大缩短了部署时间,免除人工干预,降低了部署成本。
4.提高服务可用性
用户可以方便地备份虚拟机,在进行虚拟机动态迁移后,可以方便的恢复备份,或者在其他物理机上运行备份,大大提高了服务的可用性。
5.提升资源利用率
通过服务器虚拟化的整合,提高了CPU、内存、存储、网络等设备的利用率,同时保证原有服务的可用性,使其安全性及性能不受影响。
6.动态调度资源
在服务器虚拟化技术中,数据中心从传统的单一服务器变成了统一的资源池,用户可以即时地调整虚拟机资源,同时数据中心管理程序和数据中心管理员可以灵活根据虚拟机内部资源使用情况灵活分配调整给虚拟机的资源。
7.降低能源消耗
通过减少运行的物理服务器数量,减少CPU以外各单元的耗电量,达到节能减排的目的。
1.1.4 KVM简介
KVM,基于内核的虚拟机(英语:Kernel-based Virtual Machine,缩写为 KVM),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。
KVM在具备Intel VT或AMD-V功能的x86平台上运行。它也被移植到S/390,PowerPC与IA-64平台上。在Linux内核3.9版中,加入ARM架构的支持。
KVM目前由Red Hat等厂商开发,对CentOS/Fedora/RHEL等Red Hat系发行版支持极佳。
1.1.5 关于KVM
KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。 是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。 它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。 KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。 KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)同时KVM还能够使用ksm技术帮助宿主服务器节约内存。 在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。
1.1.6 关于Virtual Machine Manager
在电脑运算中,红帽公司的Virtual Machine Manager是一个虚拟机管理员,可以让用户管理多个虚拟机。
基于内核的虚拟机libvirt与Virtual Machine Manager。
Virtual Machine Manager可以让用户:
🎃 创建、编辑、引导或停止虚拟机。
🎃 查看并控制每个虚拟机的控制台。
🎃 查看每部虚拟机的性能以及使用率。
🎃 查看每部正在运行中的虚拟机以及主控端的即时性能及使用率信息。
🎃 不论是在本机或远程,皆可使用KVM、Xen、QEMU。
1.1.7 其他虚拟化软件
🍪 Xen
Xen是一个开放源代码虚拟机监视器,由XenProject开发。它打算在单个计算机上运行多达128个有完全功能的操作系统。
在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性)。这使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。
🍪 QEMU
QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。经由KVM(早期为kqemu加速器,现在kqemu已被KVM取代)这个开源的加速器,QEMU能模拟至接近真实电脑的速度。QEMU有两种主要运作模式:
User mode模拟模式,亦即是用户模式。
QEMU能引导那些为不同中央处理器编译的Linux程序。而Wine及Dosemu是其主要目标。
System mode模拟模式,亦即是系统模式。
QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。它使得为系统源代码进行测试及除错工作变得容易。其亦能用来在一部主机上模拟数部不同虚拟电脑。
1.2 KVM部署与使用
系统环境说明
[root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) [root@localhost ~]# uname -r 3.10.0-693.el7.x86_64 [root@localhost ~]# sestatus SELinux status: disabled [root@localhost ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1)
查看自己的cpu是否支持KVM:
[root@localhost ~]# egrep '(vmx|svm)' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm epb tpr_shadow vnmi ept vpid tsc_adjust dtherm ida arat pln pts flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm epb tpr_shadow vnmi ept vpid tsc_adjust dtherm ida arat pln pts
如果结果中有vmx(Intel)或svm(AMD)字样,就说明CPU支持KVM。这里可以看到vmx(红色),说明该cpu支持。
1.2.1 安装KVM虚拟化软件
安装依赖包(可以使用本地yum源)
[root@localhost ~]# yum install qemu-kvm libvirt virt-install bridge-utils -y
安装软件说明内容:
libvirt # 虚拟机管理
virt # 虚拟机安装克隆
qemu-kvm # 管理虚拟机磁盘
验证安装是否成功:
[root@localhost ~]# lsmod | grep kvm kvm_intel 170086 0 kvm 566340 1 kvm_intel irqbypass 13503 1 kvm
启动服务
[root@localhost ~]# systemctl start libvirtd.service [root@localhost ~]# systemctl status libvirtd.service ● libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled) Active: active (running) since 六 2019-12-14 05:14:02 CST; 29s ago Docs: man:libvirtd(8) https://libvirt.org Main PID: 13546 (libvirtd) Tasks: 19 (limit: 32768) CGroup: /system.slice/libvirtd.service ├─13546 /usr/sbin/libvirtd ├─13643 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper └─13645 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper 12月 14 05:14:05 localhost.localdomain dnsmasq[13643]: started, version 2.76 cachesize 150 12月 14 05:14:05 localhost.localdomain dnsmasq[13643]: compile time options: IPv6 GNU-getopt DBus no-i18n IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset a...t inotify 12月 14 05:14:05 localhost.localdomain dnsmasq-dhcp[13643]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h 12月 14 05:14:05 localhost.localdomain dnsmasq-dhcp[13643]: DHCP, sockets bound exclusively to interface virbr0 12月 14 05:14:05 localhost.localdomain dnsmasq[13643]: reading /etc/resolv.conf 12月 14 05:14:05 localhost.localdomain dnsmasq[13643]: using nameserver 114.114.114.114#53 12月 14 05:14:05 localhost.localdomain dnsmasq[13643]: using nameserver fe80::1%ens33#53 12月 14 05:14:05 localhost.localdomain dnsmasq[13643]: read /etc/hosts - 2 addresses 12月 14 05:14:05 localhost.localdomain dnsmasq[13643]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 addresses 12月 14 05:14:05 localhost.localdomain dnsmasq-dhcp[13643]: read /var/lib/libvirt/dnsmasq/default.hostsfile Hint: Some lines were ellipsized, use -l to show in full.
接下来配置网卡
1.这里使用网桥模式,增加一个桥接网卡:
[root@localhost ~]# cd /etc/sysconfig/network-scripts/ [root@localhost network-scripts]# cat ifcfg-ens33 BOOTPROTO=none DEVICE=ens33 NM_CONTROLLED=no ONBOOT=yes BRIDGE=br0
2.新建一个文件—ifcfg-br0,并编辑,编辑的内容如下:
[root@localhost network-scripts]# vi ifcfg-br0 BOOTPROTO=static DEVICE=br0 TYPE=Bridge NM_CONTROLLED=no IPADDR=192.168.1.220 GATEWAY=192.168.1.1 DNS1=114.114.114.114 DNS2=8.8.8.8
3.重启网络服务:
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.1.220 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 fe80::20c:29ff:fec5:1999 prefixlen 64 scopeid 0x20<link> inet6 2409:8a0c:13:390:20c:29ff:fec5:1999 prefixlen 64 scopeid 0x0<global> ether 00:0c:29:c5:19:99 txqueuelen 1000 (Ethernet) RX packets 53 bytes 5708 (5.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 29 bytes 2357 (2.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::20c:29ff:fec5:1999 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:c5:19:99 txqueuelen 1000 (Ethernet) RX packets 893 bytes 83845 (81.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 648 bytes 78250 (76.4 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (Local Loopback) RX packets 68 bytes 5912 (5.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 68 bytes 5912 (5.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:d7:57:2b txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到原来ens33网卡的ip道br0网卡上了,这样网卡就配置完成了。
最后,安装及配置虚拟机
检查服务进程:
[root@localhost network-scripts]# ps aux |grep libvirtd root 978 0.1 0.4 1000784 16464 ? Ssl 19:38 0:00 /usr/sbin/libvirtd root 2099 0.0 0.0 112728 988 pts/0 S+ 19:48 0:00 grep --color=auto libvirtd
获取操作系统安装镜像文件,把该文件放到 /home/iso 目录下:
[root@localhost ~]# mkdir -p /home/iso [root@localhost ~]# cd /home/iso
创建虚拟机文件存放的目录:
[root@localhost iso]# mkdir -p /home/kvm-bak
使用 virt-install 创建虚拟机
[root@localhost home]# virt-install --name=test2 --virt-type=kvm --memory 512,maxmemory=1024 --location=/home/iso/CentOS-7-x86_64-DVD-1708.iso --disk path=/home/kvm-bak2/test2.img,size=10 --bridge=br0 --vnc --vncport=15950 --vnclisten=0.0.0.0 --noautoconsole --autostart
[root@localhost home]# virt-install --name=test2 --virt-type=kvm --memory 512,maxmemory=1024 --location=/home/iso/CentOS-7-x86_64-DVD-1708.iso --disk path=/home/kvm-bak2/test2.img,size=10 --bridge=br0 --vnc --vncport=15950 --vnclisten=0.0.0.0 --noautoconsole --autostart 开始安装...... 搜索文件 .treeinfo...... | 354 B 00:00:00 搜索文件 vmlinuz...... | 5.6 MB 00:00:00 搜索文件 initrd.img...... | 46 MB 00:00:00 正在分配 'test2.img' | 10 GB 00:00:00 域安装仍在进行。您可以重新连接 到控制台以便完成安装进程。
VNC连接开始安装虚拟机。
安装完重新开启虚拟机。才能使用VNC连接
[root@localhost home]# virsh start test2
使用参数说明
参数 |
参数说明 |
--virt-type HV_TYPE |
要使用的管理程序名称 (kvm, qemu, xen, ...) |
--os-type |
系统类型 |
--os-variant DISTRO_VARIANT |
在客户机上安装的操作系统,例如:'fedora18'、'rhel6'、'winxp' 等。 |
-n NAME, --name NAME |
客户机实例名称 |
--memory MEMORY |
配置客户机虚拟内存大小 |
--vcpus VCPUS |
配置客户机虚拟 CPU(vcpu) 数量。 |
--disk DISK |
指定存储的各种选项。 |
-cdrom CDROM |
光驱安装介质 |
-w NETWORK, --network NETWORK |
配置客户机网络接口。 |
--graphics GRAPHICS |
配置客户机显示设置。 |
虚拟化平台选项: |
|
-v, --hvm |
这个客户机应该是一个全虚拟化客户机 |
-p, --paravirt |
这个客户机应该是一个半虚拟化客户机 |
--container |
这个客户机应该是一个容器客户机 |
--virt-type HV_TYPE |
要使用的管理程序名称 (kvm, qemu, xen, ...) |
--arch ARCH |
模拟 CPU 架构 |
--machine MACHINE |
机器类型为仿真类型 |
其它选项: |
|
--noautoconsole |
不要自动尝试连接到客户端控制台 |
--autostart |
主机启动时自动启动域。 |
--noreboot |
安装完成后不启动客户机。 |
以上信息通过 " virt-install --help " 获得。 |
KVM虚拟机管理操作
virsh命令常用参数总结
参数 |
参数说明 |
基础操作 |
|
list |
查看虚拟机列表,列出域 |
start |
启动虚拟机,开始一个(以前定义的)非活跃的域 |
shutdown |
关闭虚拟机,关闭一个域 |
destroy(危险) |
强制关闭虚拟机,销毁(停止)域 |
vncdisplay |
查询虚拟机vnc端口号 |
配置管理操作 |
|
dumpxml |
导出主机配置信息 |
undefine |
删除主机 |
define |
导入主机配置 |
domrename |
对虚拟机进行重命名 |
挂起与恢复 |
|
suspend |
挂起虚拟机 |
resume |
恢复虚拟机 |
自启动管理 |
|
autostart |
虚拟机开机启动 |
autostart --disable |
取消虚拟机开机启动 |
以上参数通过 “virsh --help” 获得。 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?