Linux内核中的KVM虚拟化详解

张开发
2026/4/11 23:13:15 15 分钟阅读

分享文章

Linux内核中的KVM虚拟化详解
Linux内核中的KVM虚拟化详解引言KVMKernel-based Virtual Machine是Linux内核中的虚拟化模块它允许Linux内核作为 hypervisor 运行虚拟机。KVM将Linux内核转变为一个功能完整的虚拟化平台支持硬件辅助虚拟化。本文将深入探讨Linux内核中的KVM虚拟化机制包括其原理、架构和应用。KVM的基本概念1. KVM的定义KVM是一种基于硬件辅助虚拟化的虚拟化技术它将Linux内核转变为一个 hypervisor。2. KVM的优势硬件辅助虚拟化利用CPU的虚拟化扩展Intel VT-x/AMD-V性能优异接近原生性能集成度高作为Linux内核模块运行功能丰富支持各种设备模拟和网络配置开源免费基于GPL协议3. KVM的组件kvm.ko核心KVM模块kvm-intel.koIntel CPU支持kvm-amd.koAMD CPU支持QEMU用户空间模拟器KVM的架构1. KVM的层次结构用户空间 ↓ QEMU设备模拟 ↓ KVM模块内核空间 ↓ 硬件虚拟化扩展Intel VT-x/AMD-V ↓ 硬件2. KVM的工作原理VMX/SVMCPU的虚拟化扩展VMCS虚拟机控制结构VMLAUNCH启动虚拟机VMEXIT从虚拟机退出到 hypervisorVMRESUME恢复虚拟机执行3. KVM的核心数据结构struct kvm { spinlock_t mmu_lock; struct mutex slots_lock; struct kvm_memory_slot slots[KVM_MEM_SLOTS]; struct list_head vm_list; struct mm_struct *mm; // 其他字段... }; struct kvm_vcpu { struct kvm *kvm; struct kvm_run *run; struct kvm_vcpu_arch arch; // 其他字段... };KVM的API1. KVM的系统调用#include linux/kvm.h // 创建KVM实例 int kvm_create_vm(unsigned long flags); // 创建vCPU int kvm_create_vcpu(int kvm_fd, unsigned int id); // 设置内存区域 int kvm_set_user_memory_region(int kvm_fd, struct kvm_userspace_memory_region *mem); // 运行vCPU int kvm_run(int vcpu_fd, struct kvm_run *run, struct timespec *timeout); // 获取/设置vCPU寄存器 int kvm_get_regs(int vcpu_fd, struct kvm_regs *regs); int kvm_set_regs(int vcpu_fd, struct kvm_regs *regs);2. KVM的使用示例#include fcntl.h #include sys/ioctl.h #include linux/kvm.h int main() { int kvm_fd, vm_fd, vcpu_fd; struct kvm_run *run; // 打开KVM设备 kvm_fd open(/dev/kvm, O_RDWR); // 创建VM vm_fd ioctl(kvm_fd, KVM_CREATE_VM, 0); // 创建vCPU vcpu_fd ioctl(vm_fd, KVM_CREATE_VCPU, 0); // 分配kvm_run结构 run mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, vcpu_fd, 0); // 运行vCPU while (1) { ioctl(vcpu_fd, KVM_RUN, 0); switch (run-exit_reason) { case KVM_EXIT_HLT: // 处理停机 break; case KVM_EXIT_IO: // 处理IO操作 break; } } return 0; }3. KVM的设备模拟KVM使用QEMU进行设备模拟模拟CPUvCPU模拟内存虚拟机内存模拟设备网卡、磁盘、USB等模拟总线PCI、USB等KVM的配置和使用1. 检查硬件支持# 检查Intel VT-x支持 grep -E vmx|svm /proc/cpuinfo # 检查KVM模块 lsmod | grep kvm # 加载KVM模块 modprobe kvm modprobe kvm_intel # 或 kvm_amd2. 安装KVM# Ubuntu/Debian apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils # CentOS/RHEL yum install qemu-kvm libvirt virt-install bridge-utils # 启动libvirt服务 systemctl start libvirtd systemctl enable libvirtd3. 创建虚拟机# 使用virt-install virt-install \ --name vm1 \ --ram 2048 \ --disk path/var/lib/libvirt/images/vm1.img,size20 \ --vcpus 2 \ --os-type linux \ --os-variant ubuntu20.04 \ --network bridgebr0 \ --graphics none \ --console pty,target_typeserial \ --location http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/ \ --extra-args consolettyS0,115200n8 serial # 使用qemu-system qemu-system-x86_64 \ -name vm1 \ -m 2048 \ -smp 2 \ -hda /var/lib/libvirt/images/vm1.img \ -netdev bridge,brbr0,idnet0 \ -device e1000,netdevnet0 \ -nographic4. 管理虚拟机# 列出虚拟机 virsh list --all # 启动虚拟机 virsh start vm1 # 停止虚拟机 virsh shutdown vm1 # 删除虚拟机 virsh undefine vm1 # 查看虚拟机信息 virsh dominfo vm1KVM的性能优化1. CPU优化CPU亲和性绑定vCPU到物理CPUCPU模式使用host-passthrough模式CPU特性启用嵌套虚拟化# 启用嵌套虚拟化 echo options kvm_intel nested1 /etc/modprobe.d/kvm.conf modprobe -r kvm_intel modprobe kvm_intel # 检查嵌套虚拟化 cat /sys/module/kvm_intel/parameters/nested2. 内存优化内存气球动态调整内存大页内存使用hugetlbfs内存共享KSMKernel Samepage Merging# 启用KSM sysctl -w kernel.ksm_enabled1 # 使用大页内存 mkdir -p /dev/hugepages mount -t hugetlbfs hugetlbfs /dev/hugepages echo 2048 /proc/sys/vm/nr_hugepages3. 存储优化virtio-blk使用virtio块设备qemu-img使用qcow2格式缓存模式使用writeback模式# 创建qcow2镜像 qemu-img create -f qcow2 /var/lib/libvirt/images/vm1.img 20G # 调整缓存模式 virsh edit vm1 # disk typefile devicedisk # driver nameqemu typeqcow2 cachewriteback/ # /disk4. 网络优化virtio-net使用virtio网络设备SR-IOV使用PCI直通macvtap使用macvtap接口# 创建桥接网络 brctl addbr br0 brctl addif br0 eth0 ifconfig br0 up # 使用virtio网络 echo interface typebridge source bridgebr0/ model typevirtio/ /interface vm.xmlKVM的高级特性1. 实时迁移# 准备迁移 tar -czvf /tmp/vm1.tar.gz /var/lib/libvirt/images/vm1.img # 执行迁移 virsh migrate --live vm1 qemussh://remotehost/system # 验证迁移 virsh list --all2. 快照管理# 创建快照 virsh snapshot-create-as vm1 snap1 First snapshot # 列出快照 virsh snapshot-list vm1 # 恢复快照 virsh snapshot-revert vm1 snap1 # 删除快照 virsh snapshot-delete vm1 snap13. PCI设备直通# 检查PCI设备 lspci # 绑定设备到vfio echo 8086 100e /sys/bus/pci/drivers/vfio-pci/new_id # 在虚拟机中使用 echo hostdev modesubsystem typepci managedyes source address domain0x0000 bus0x02 slot0x00 function0x0/ /source /hostdev vm.xml实际案例分析1. 企业级KVM部署# 配置存储池 virsh pool-define-as storage_pool dir --target /var/lib/libvirt/images virsh pool-build storage_pool virsh pool-start storage_pool virsh pool-autostart storage_pool # 配置网络 virsh net-define /etc/libvirt/qemu/networks/default.xml virsh net-start default virsh net-autostart default # 创建虚拟机模板 virt-clone --original vm1 --name vm2 --auto-clone # 管理虚拟机集群 for i in {1..10}; do virt-install \ --name vm$i \ --ram 2048 \ --disk path/var/lib/libvirt/images/vm$i.img,size20 \ --vcpus 2 \ --os-type linux \ --os-variant ubuntu20.04 \ --network networkdefault \ --graphics none \ --import done2. 云平台集成KVM是OpenStack、Proxmox等云平台的基础# OpenStack部署 apt install openstack # Proxmox部署 dpkg -i proxmox-ve_*.deb # 管理云平台 openstack server create --flavor m1.small --image ubuntu --network private vm13. 开发环境# 创建开发环境 qemu-system-x86_64 \ -name dev-env \ -m 4096 \ -smp 4 \ -hda dev-env.img \ -netdev user,idnet0,hostfwdtcp::2222-:22 \ -device e1000,netdevnet0 \ -enable-kvm \ -cpu host \ -nographic # SSH连接 ssh -p 2222 userlocalhost结论KVM是Linux内核中一项强大的虚拟化技术它利用硬件辅助虚拟化提供了接近原生性能的虚拟化能力。通过KVMLinux内核转变为一个功能完整的虚拟化平台支持各种高级特性如实时迁移、快照管理和PCI设备直通。KVM已经成为企业级虚拟化和云平台的基础广泛应用于数据中心、云服务和开发环境。理解KVM的原理和使用方法对于系统管理员和虚拟化工程师来说都有重要意义。

更多文章