KVM - Arch Linux 中文维基

跳至內容

# KVM

出自 Arch Linux 中文维基

相關文章

- Category:Hypervisors
- Libvirt

翻譯狀態：

- 本文（或部分內容）譯自 KVM，最近一次同步於 2024-11-22，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

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

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

有關 KVM 與 Xen、VMware 和 QEMU 的區別，可查看 KVM FAQ。

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

## 檢查 KVM 支持

### 硬體支持

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

    $ LC_ALL=C.UTF-8 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_amd` 和 `kvm_intel` 中的一個）：

    $ zgrep CONFIG_KVM /proc/config.gz

只有當模塊設置為 `y` 或 `m` 時才可用。

- 然後，確認這些內核模塊已自動加載：

    $ 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_intel` 或 `kvm_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 tricks 和 QEMU#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

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

    $ cat /sys/module/kvm_intel/parameters/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

參閱：

- Linux 內核大頁支持情況
- Debian Wiki - Hugepages

### 安全啟動

啟用 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` 按鍵進行確認。

## 參閱

- KVM Howto
- KVM FAQ

分類：​

- 虛擬機管理
- 內核

KVM
新增話題