qemu 和 kvm 的关系

324 阅读3分钟

qemu 和 kvm 的关系, 使用 qemu 创建的虚拟机是否是直接使用 kvm?

QEMU和KVM之间的关系可以简单描述如下:

  1. QEMU:这是一个开源的虚拟机仿真器,可以模拟多种硬件平台。它负责设备仿真和虚拟机的运行管理。
  2. KVM (Kernel-based Virtual Machine) :这是Linux内核的一个模块,主要用于提供虚拟化支持。KVM将Linux内核转变为一个hypervisor,使得Linux可以直接执行虚拟机的指令。

在使用 QEMU 创建的虚拟机中,如果启用了 KVM,QEMU 会利用 KVM 来加速虚拟机的性能。具体来说,运行qemu-system-x86_64时,如果主机的 CPU 支持虚拟化(如 Intel 的 VT-x 或 AMD 的 AMD-V),并且 KVM 模块已加载,那么 QEMU 将会直接调用 KVM 来提高虚拟机的效率。

grep flag /proc/cpuinfo | uniq | grep -E "vmx|svm"

  • AMD 有支持 AMD-V技术的 cpu 应该会看到一个 svm 的 flag

  • Intel 的 VT-x 是 vmx

  • 其他例如 ARM, PowerPC 可参考:


▶  lscpu | grep Virtualization
Virtualization:                       VT-x

▶ lsmod | grep kvm                                   
kvm_intel             380928  0
kvm                  1146880  1 kvm_intel
irqbypass              16384  1 kvm

个人环境问题



root@debian:~                                                                                                                                                                                                                 
▶ virt-host-validate   
  QEMU: Checking for hardware virtualization                                 : PASS
  QEMU: Checking if device /dev/kvm exists                                   : PASS
  QEMU: Checking if device /dev/kvm is accessible                            : PASS
  QEMU: Checking if device /dev/vhost-net exists                             : PASS
  QEMU: Checking if device /dev/net/tun exists                               : PASS
  QEMU: Checking for cgroup 'cpu' controller support                         : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
  QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
  QEMU: Checking for cgroup 'memory' controller support                      : PASS
  QEMU: Checking for cgroup 'devices' controller support                     : PASS
  QEMU: Checking for cgroup 'blkio' controller support                       : PASS
  QEMU: Checking for device assignment IOMMU support                         : WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)
  QEMU: Checking for secure guest support                                    : WARN (Unknown if this platform has Secure Guest support)
   LXC: Checking for Linux >= 2.6.26                                         : PASS
   LXC: Checking for namespace ipc                                           : PASS
   LXC: Checking for namespace mnt                                           : PASS
   LXC: Checking for namespace pid                                           : PASS
   LXC: Checking for namespace uts                                           : PASS
   LXC: Checking for namespace net                                           : PASS
   LXC: Checking for namespace user                                          : PASS
   LXC: Checking for cgroup 'cpu' controller support                         : PASS
   LXC: Checking for cgroup 'cpuacct' controller support                     : PASS
   LXC: Checking for cgroup 'cpuset' controller support                      : PASS
   LXC: Checking for cgroup 'memory' controller support                      : PASS
   LXC: Checking for cgroup 'devices' controller support                     : PASS
   LXC: Checking for cgroup 'freezer' controller support                     : FAIL (Enable 'freezer' in kernel Kconfig file or mount/enable cgroup controller in your system)
   LXC: Checking for cgroup 'blkio' controller support                       : PASS
   LXC: Checking if device /sys/fs/fuse/connections exists                   : PASS


root@debian:~                                                                                                                                                                                                                 
▶ dmesg | grep -i 'iommu'  
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-6.1.0-32-amd64 root=UUID=19fe1d7e-c113-4cd7-86f8-c72adabcc9bd ro cgroup_enable=devices cgroup_enable=freezer cgroup_enable=memory cgroup_enable=cpuset intel_iommu=on
[    0.017017] Kernel command line: BOOT_IMAGE=/boot/vmlinuz-6.1.0-32-amd64 root=UUID=19fe1d7e-c113-4cd7-86f8-c72adabcc9bd ro cgroup_enable=devices cgroup_enable=freezer cgroup_enable=memory cgroup_enable=cpuset intel_iomm=on
[    0.017057] DMAR: IOMMU enabled
[    0.269046] pci 0000:00:02.0: DMAR: Skip IOMMU disabling for graphics
[    0.284386] iommu: Default domain type: Translated 
[    0.284386] iommu: DMA domain TLB invalidation policy: lazy mode 
[    0.646895] AMD-Vi: AMD IOMMUv2 functionality not available on this system - This is not a bug.
(v.v) 
root@debian:~ 

dmesg 显示 iommu 可用,但是我的硬件好像不支持,而且 BIOS 没有看到 VT-d 相关的选项

由于内核确认启用了 IOMMU,而且 virt-host-validate 中的 WARN 警告提示可能是由于 “No ACPI DMAR table found” 问题,这通常是与具体硬件或 BIOS 配置相关。尽管 IOMMU 已经启用,但 BIOS 或硬件可能仍有其他因素影响该功能的检测。

如果在虚拟化或特定功能使用中依然遇到问题,建议检查 BIOS 设置确保与虚拟化相关的选项(如 VT-d)是正确配置的,并验证是否有相关的固件更新可用。

总结

  • QEMU 是一个仿真器,可以独立运行,但通常与KVM结合使用以提高性能。
  • 使用 QEMU 创建的虚拟机 可以利用 KVM,如果条件允许的话,这样就能实现高效的虚拟化。