QEMU KVM Libvirt手册(8): 半虚拟化设备virtio

KVM本身并不提供半虚拟化功能,是通过virtio来实现的

The benefits of virtio drivers are of lower overhead and higher performance.

Memory Ballooning (virtio_balloon)

memory ballooning可以动态调整guest的内存的大小

如果有-m参数,则向更大的内存调整时无效的,但是可以往小的里面调整

我们首先ssh到guest里面

ip netns exec qrouter-26a45e0e-a58a-443b-a972-d62c0c5a1323 ssh -i openstack.pem ubuntu@192.168.0.35

在虚拟机里面看内存的大小

ubuntu@testinject19:~$ free
             total       used       free     shared    buffers     cached
Mem:       2051748     478276    1573472          0      46620     345908
-/+ buffers/cache:      85748    1966000
Swap:            0          0          0

在Monitor上看balloon的大小

root:/home/cliu8# virsh qemu-monitor-command instance-00000024 --hmp "info balloon"
balloon: actual=2048

我们试图往大里调整

root:/home/cliu8# virsh qemu-monitor-command instance-00000024 --hmp "balloon 4096"

发现无效

root:/home/cliu8# virsh qemu-monitor-command instance-00000024 --hmp "info balloon"
balloon: actual=2048

ubuntu@testinject19:~$ free
             total       used       free     shared    buffers     cached
Mem:       2051748     478276    1573472          0      46628     345920
-/+ buffers/cache:      85728    1966020
Swap:            0          0          0

我们往小里调整内存

root:/home/cliu8# virsh qemu-monitor-command instance-00000024 --hmp "balloon 1024"

发现生效了

root:/home/cliu8# virsh qemu-monitor-command instance-00000024 --hmp "info balloon"
balloon: actual=1024

ubuntu@testinject19:~$ free
             total       used       free     shared    buffers     cached
Mem:       1003172     470796     532376          0      46636     345920
-/+ buffers/cache:      78240     924932
Swap:            0          0          0

有了balloon,如果guest需要更多的RAM,则可以给它增加一些内存。如果guest不需要那么多内存,可以通过balloon从中拿出一部分内存。这个过程,不需要启停虚拟机。

balloon driver像是一个特殊的process,运行在guest机器上,它可以扩大自己的内存,使得其他的应用程序的内存减少,也可以缩小内存,使得其他的应用程序内存增加。

balloon-expanded

balloon-shrink

guest中的balloon driver通过virtio channel和host进行交互,接收host发来的命令,比如发来的命令式减少内存,则balloon driver就扩大它的内存占有量。

然后balloon driver将自己占有的内存交回给host,使得host有了更多的内存。

balloon-chunk

对于libvirt而言,有currentMemory和maxMemory两种概念,maxMemory就是-m参数设定的,currentMemory就是balloon设定的。

Para-virtualized network interface cards (virtio_net)

-netdev tap,fd=32,id=hostnet0,vhost=on,vhostfd=37
-device virtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:d1:2d:99,bus=pci.0,addr=0x3

Para-virtualized block devices (virtio_blk)

-drive file=/var/lib/nova/instances/1f8e6f7e-5a70-4780-89c1-464dc0e7f308/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none
-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1

<think>我们正在讨论KVM虚拟化技术,用户要求深入解析其架构、原理和应用前景。根据引用内容,KVM是Linux内核的一个模块,它允许Linux内核充当虚拟机监控器(Hypervisor)。KVM本身不执行任何模拟,而是通过可加载的内核模块(kvm.ko)提供虚拟化功能,将Linux内核转变为一个Hypervisor。架构上,KVM利用Linux内核作为基础,因此它继承了Linux内核的诸多特性,如调度、内存管理等。在KVM架构中,虚拟机作为普通的Linux进程运行,由标准的Linux调度程序进行调度。每个虚拟机的虚拟CPU(vCPU)被映射为一个Linux线程(或进程)。原理方面,KVM需要硬件虚拟化扩展(如IntelVT或AMD-V)的支持。它通过内核模块实现处理器虚拟化,而I/O设备的虚拟化则由用户空间的程序(如QEMU)处理。KVM模块负责创建虚拟机、分配vCPU,并执行虚拟机的指令。当虚拟机执行特权指令时,会触发硬件虚拟化扩展,将控制权交给Hypervisor(即KVM),KVM再根据情况执行或模拟这些指令。应用前景:KVM广泛应用于数据中心、云计算环境(如OpenStack)、开发和测试环境、桌面虚拟化等。由于其开源特性,它被集成到许多商业虚拟化解决方案中。根据以上理解,我们组织回答如下:</think>### KVM虚拟化技术深入解析 #### **一、架构** KVM采用**模块化架构**,核心组件包括: 1. **KVM内核模块** - 作为Linux内核可加载模块(`kvm.ko`),提供处理器虚拟化能力 - 依赖硬件虚拟化扩展(Intel VT-x/AMD-V),将物理CPU划分为多个虚拟CPU(vCPU) - 通过`/dev/kvm`设备文件向用户空间暴露API接口 2. **QEMU设备模拟器** - 负责虚拟设备的模拟(如网卡、磁盘控制器) - 处理I/O请求和内存管理,例如通过`virtio`半虚拟化驱动优化性能 - 与KVM协同实现完整的虚拟机环境[^1] 3. **Libvirt管理框架** - 提供统一的API(支持Python/Java等) - 管理工具链:`virsh`(命令行)、`virt-manager`(图形界面) - 支持虚拟机生命周期管理、网络配置等操作 ```plaintext 架构示意图: 用户空间 ├── QEMU进程(设备模拟) ├── Libvirt(管理接口) └── Guest OS 内核空间 └── KVM模块(CPU/内存虚拟化) 硬件层 └── VT-x/AMD-V(硬件辅助虚拟化) ``` #### **二、工作原理** 1. **CPU虚拟化** - vCPU映射为宿主机的**Linux线程**,由内核调度器管理 - 特权指令通过**VM-Exit**陷入Hypervisor,KVM处理后经**VM-Entry**返回Guest OS - 示例:当Guest执行`CPUID`指令时,触发VM-Exit交由KVM模拟响应[^2] 2. **内存虚拟化** - 采用**影子页表**或**EPT/RVI**技术 - Guest物理地址→宿主物理地址的二级转换 - 公式表示:$$ GPA \xrightarrow{EPT} HPA $$ 3. **I/O虚拟化** - **全虚拟化**:QEMU完全模拟设备(如e1000网卡) - **半虚拟化**:`virtio`机制实现前端(Guest驱动)与后端(QEMU)直接通信 - **设备直通**:VFIO将物理设备(如GPU)直接分配给虚拟机 #### **三、应用前景** 1. **云计算基础设施** - OpenStack、oVirt等平台默认采用KVM作为虚拟化引擎 - 支持**弹性伸缩**和**实时迁移**,满足云数据中心需求 2. **边缘计算与容器化** - Kata Containers等安全容器方案基于KVM构建隔离沙箱 - 轻量化特性适配边缘设备资源约束 3. **桌面虚拟化与开发测试** - 开发者快速创建多版本OS测试环境 - 企业级VDI(虚拟桌面)解决方案基础 4. **安全关键领域** - 利用**sVirt**(SELinux集成)实现强制访问控制 - 金融、政府系统通过硬件隔离提升安全性 #### **四、技术优势** | 特性 | 说明 | |---------------------|-----------------------------| | **开源生态** | 集成于Linux主线内核,社区支持强大 | | **性能接近原生** | 硬件辅助虚拟化开销<5% | | **动态资源调整** | 支持vCPU/内存热添加 | | **跨平台兼容性** | 支持x86/ARM/Power等架构 | > **挑战**:嵌套虚拟化性能优化、GPU虚拟化效率、安全加固仍是重点研究方向[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值