KVM

出自 Arch Linux 中文维基

KVM基於內核的虛擬機,是內置於 Linux 內核的 hypervisor。在功能上類似於 Xen,但運行起來更簡便。與使用模擬的原生 QEMU 不同的是,KVM 是 QEMU 的一種特殊的運行模式,這種模式通過內核模塊使用 CPU 擴展(HVM)進行虛擬化。

通過 KVM,可以運行多台未修改的 GNU/Linux、Windows 或任何其他作業系統的虛擬機(詳情請參閱客戶機支持狀態)。每台虛擬機都有獨享的虛擬硬體:網卡、硬碟、顯卡等。

有關 KVM 與 XenVMware 和 QEMU 的區別,可查看 KVM FAQ

本頁面不包含使用KVM作為後端的其他虛擬機的通用功能。對於這些信息,你應查看相關的文檔。

檢查 KVM 支持[編輯 | 編輯原始碼]

硬體支持[編輯 | 編輯原始碼]

KVM 需要虛擬機宿主的處理器支持虛擬化(對於 Intel 處理器來說是 VT-x,對於 AMD 處理器來說是 AMD-V)。你可通過以下命令來檢查你的處理器是否支持硬體虛擬化:

$ LC_ALL=C lscpu | grep Virtualization

或者:

$ grep -E --color=auto 'vmx|svm|0xc0f' /proc/cpuinfo

如果運行後沒有顯示,那麼你的處理器支持硬體虛擬化,你不能使用KVM。

注意: 你可能需要在 BIOS 中啟用虛擬化支持。10 年內所有由 AMD 和 Intel 生產的 x86_64 處理器都支持虛擬化。如果你的處理器看上去不支持虛擬化,幾乎可以確定是因為這項功能在 BIOS 中未啟用。

內核支持[編輯 | 編輯原始碼]

Arch Linux 內核提供了相應的內核模塊來支持KVM。

  • 你可以通過以下命令來檢查內核中是否已包含必要的模塊(kvm 以及 kvm_amdkvm_intel 中的一個):
$ zgrep CONFIG_KVM /proc/config.gz

只有當模塊設置為 ym 時才可用。

  • 然後,確認這些內核模塊已自動加載:
$ lsmod | grep kvm
kvm_intel             245760  0
kvmgt                  28672  0
mdev                   20480  2 kvmgt,vfio_mdev
vfio                   32768  3 kvmgt,vfio_mdev,vfio_iommu_type1
kvm                   737280  2 kvmgt,kvm_intel
irqbypass              16384  1 kvm

如果運行後沒有顯示,那麼需要手動加載這些模塊。

提示:如果 modprobe kvm_intelkvm_amd 失敗,但 modprobe kvm 成功,並且 lscpu 聲稱支持硬體加速,檢查 BIOS 設置。某些廠商,特別是筆記本電腦廠商,默認禁用這些處理器擴展。modprobe 失敗後,dmesg 的輸出可以告訴你這些擴展是硬體不支持還是在 BIOS 中禁用。

Virtio 准虛擬化[編輯 | 編輯原始碼]

准虛擬化為客戶機提供了一種使用主機上設備的快速有效的通信方式。KVM 使用 Virtio API 作為虛擬機管理程序和客戶機之間的連接層,為虛擬機提供准虛擬化設備。

所有 Virtio 設備都包括兩部分:主機設備和客戶機驅動程序。

內核支持[編輯 | 編輯原始碼]

用以下命令檢查虛擬機中內核的 VIRTIO 模塊是否可用:

$ zgrep VIRTIO /proc/config.gz

然後,檢查這些內核模塊是否已自動加載:

$ lsmod | grep virtio

如果運行後沒有顯示,那麼需要手動加載這些模塊。

准虛擬化設備列表[編輯 | 編輯原始碼]

  • 網絡設備 (virtio-net)
  • 塊設備 (virtio-blk)
  • 控制器設備 (virtio-scsi)
  • 串口設備 (virtio-serial)
  • 氣球設備 (virtio-balloon)

如何使用 KVM[編輯 | 編輯原始碼]

請參考QEMU

小貼士與小技巧[編輯 | 編輯原始碼]

注意: 請參考 QEMU#Tips and tricksQEMU#Troubleshooting 獲取通用技巧。

嵌套虛擬化[編輯 | 編輯原始碼]

嵌套虛擬化使現有虛擬機能夠在第三方虛擬機管理程序和其他虛擬化雲平台上運行,而無需對原始虛擬機或其網絡進行任何修改。

在宿主機上,啟用 kvm_intel 模塊的嵌套虛擬化功能:

注意: AMD 操作也類似,只需在必要時將 intel 替換為 amd
# modprobe -r kvm_intel
# modprobe kvm_intel nested=1

要使嵌套虛擬化永久生效(請參考 Kernel modules#Setting module options):

/etc/modprobe.d/kvm_intel.conf
options kvm_intel nested=1

確認嵌套虛擬化功能是否已激活:

$ systool -m kvm_intel -v | grep nested
nested              = "Y"

啟用主機直通模式以將CPU的所有功能轉發給客戶作業系統:

  1. 如果正在使用QEMU, 可以使用以下命令運行客戶作業系統: qemu-system-x86_64 -enable-kvm -cpu host.
  2. 如果使用virt-manager,請將CPU模式更改為 host-passthrough
  3. 如果使用virsh, 使用virsh edit vm-name命令並更改 CPU 行為 <cpu mode='host-passthrough' check='partial'/>

現在,啟動虛擬機並檢查VMX標誌是否存在

$ grep -E --color=auto 'vmx|svm' /proc/cpuinfo

開啟內存大頁[編輯 | 編輯原始碼]

可以啟用大頁 (Huge Pages) 以提高虛擬機的性能。如果您正在使用最新版本的 Arch Linux 並且正在運行 KVM,那麼這基本是開箱即用的。請檢查是否存在目錄 /dev/hugepages。如果不存在,請先創建它。現在,我們需要配置正確的權限。默認目錄權限是 root 的 uid 和 gid 及 0755,但我們希望 kvm 組中的任何人都可以訪問 hugepages。

/etc/fstab添加下列內容:

/etc/fstab
hugetlbfs       /dev/hugepages  hugetlbfs       mode=01770,gid=kvm        0 0

相較於通過 gid=kvm 直接指定組名,你也可以使用數字作為 gid,但數字 ID 必須要與 kvm 組相一致。1770 模式允許所有組成員創建文件,但成員間無法互相取消連結或重命名文件。確保 /dev/hugepages 已正確掛載:

# umount /dev/hugepages
# mount /dev/hugepages
$ mount | grep huge
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,mode=1770,gid=78)

現在可以計算需要多少大頁內存了。查看一個大頁的大小:

$ grep Hugepagesize /proc/meminfo

通常會是 2048 kB ≙ 2 MB,加入虛擬機的內存是 1024 MB. 1024 / 2 = 512. 額外增加一點,就變成 550。將此數值寫入設置:

# echo 550 > /proc/sys/vm/nr_hugepages

如果剩餘內存足夠:

$ grep HugePages_Total /proc/meminfo
HugesPages_Total:  550

如果數值沒有這麼大,請關閉其他軟體,或減少虛擬機的內存使用(number_of_pages x 2):

$ qemu-system-x86_64 -enable-kvm -m 1024 -mem-path /dev/hugepages -hda <disk_image> [...]

注意 -mem-path 參數,這將啟用大頁。 虛擬機運行時,通過下面命令查看使用了多少個頁:

$ grep HugePages /proc/meminfo
HugePages_Total:     550
HugePages_Free:       48
HugePages_Rsvd:        6
HugePages_Surp:        0

如果一切正常,可以默認啟動大頁了,將下面內容加入 /etc/sysctl.d/40-hugepage.conf:

/etc/sysctl.d/40-hugepage.conf
vm.nr_hugepages = 550

參閱:

安全啟動[編輯 | 編輯原始碼]

啟用 KVM 安全啟動前需要滿足一下幾點:

  1. 必須使用編譯了安全啟動的 UEFI.
  2. UEFI 中必須包含加密密鑰.
注意: Arch Linux 目前沒有像 Fedora 等其他發行版一樣提供安全啟動密鑰,如果要安全啟動 Arch Linux,需要創建自己的簽名密鑰並在執行下面命令後用密鑰簽名內核。更多信息請參考 Unified Extensible Firmware Interface/Secure Boot

要啟用 UEFI 安全啟動支持,請安裝 edk2-ovmf 並將虛擬機設置為使用啟用安全啟動的 UEFI。如果是使用 libvirt,可以將如下內容加入虛擬機 XML 配置文件:

<os firmware="efi">
  <loader readonly="yes" secure="yes" type="pflash">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
</os>

下一步需要加入一些密鑰,這裡我們使用 Microsoft 和 Redhat 的安全啟動密鑰。安裝 virt-firmware 並執行下面命令,將 vm_name 替換為虛擬機名稱。

$ virt-fw-vars --input /var/lib/libvirt/qemu/nvram/vm_name_VARS.fd --output /var/lib/libvirt/qemu/nvram/vm_name_SECURE_VARS.fd --secure-boot --enroll-redhat

編輯 libvirt XML 配置,將其指向新的 VARS 文件。

<os firmware="efi">
  <loader readonly="yes" secure="yes" type="pflash">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
  <nvram template="/usr/share/edk2/x64/OVMF_VARS.4m.fd">/var/lib/libvirt/qemu/nvram/{vm-name}_SECURE_VARS.fd</nvram>
</os>

這樣安全啟動應該就會自動啟用了,可以通過虛擬機 UEFI 啟動時按 F2 按鍵進行確認。

參閱[編輯 | 編輯原始碼]