# 2. KVM 安装配置

2024年7月16日15分钟阅读

- FormalSciences/ComputerScience
- OperatingSystem/Virtualization
- KVM

## 环境准备

### 硬件要求

#### 检查 CPU 是否支持虚拟化技术（Intel VT-x 或 AMD-V）

在部署 KVM 前，需要确保系统的 CPU 支持硬件虚拟化技术。这些技术包括 Intel 的 VT-x 和 AMD 的 AMD-V。以下是检查方法：

1. Intel CPU：使用命令 `grep -E "vmx" /proc/cpuinfo` 检查 CPU 是否支持 VT-x。
2. AMD CPU：使用命令 `grep -E "svm" /proc/cpuinfo` 检查 CPU 是否支持 AMD-V。

如果命令输出中包含 `vmx` 或 `svm`，则表示 CPU 支持相应的虚拟化技术。

#### 启用 BIOS/UEFI 中的虚拟化支持

**即使 CPU 支持虚拟化技术，也需要在 BIOS/UEFI 中启用相应的功能。**以下是通用的启用步骤，具体步骤可能因主板制造商不同而有所差异：

1. 启动计算机并进入 BIOS/UEFI 设置界面（通常按 `Delete`、`F2`、`F10` 或 `Esc` 键）。
2. 在 BIOS/UEFI 设置中，找到“高级”或“处理器”选项。
3. 启用 “Intel Virtualization Technology” 或 “AMD-V” 选项。
4. 保存更改并退出 BIOS/UEFI 设置。

### 操作系统要求

KVM 作为 Linux 内核的一部分，主要在 Linux 操作系统上运行。以下是一些常用的、支持 KVM 的 Linux 发行版：

- CentOS：企业级发行版，基于 Red Hat Enterprise Linux (RHEL) 的源代码构建，适合服务器环境。
- RHEL：Red Hat Enterprise Linux，提供商业支持和长期维护，广泛应用于企业环境。
- Ubuntu：广泛使用的发行版，提供了良好的社区支持和文档。

## 安装 KVM 和 QEMU

### 在 Ubuntu 上安装

1. 更新软件包列表：

       sudo apt update

2. 安装 KVM、QEMU 和相关工具：

       apt -y install qemu-kvm libvirt-daemon-system libvirt-daemon virtinst libosinfo-bin

3. 启用并启动 libvirtd 服务：

       sudo systemctl enable --now libvirtd

#### 在 CentOS/RHEL 上安装

1. 更新系统：

       sudo dnf update

2. 安装 KVM、QEMU 和相关工具：

       sudo dnf install qemu-kvm libvirt virt-install

3. 启用并启动 libvirtd 服务：

       sudo systemctl enable --now libvirtd

#### 在其他 Linux 发行版上安装

以下是一些其他常见 Linux 发行版的安装方法：

- Debian:

      sudo apt update
      sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils
      sudo systemctl enable --now libvirtd

- Fedora:

      sudo dnf update
      sudo dnf install @virtualization
      sudo systemctl enable --now libvirtd

### 安装虚拟机管理工具

#### 安装 `libvirt`

`libvirt` 是一个开源 API，用于管理平台虚拟化。前面已经在安装 KVM 和 QEMU 时安装了 `libvirt`。确保其已启用并正在运行：

    sudo systemctl enable --now libvirtd

#### 安装 `virt-manager`

`virt-manager` 是一个基于 GUI 的虚拟机管理工具，适用于桌面用户。

- 在 Ubuntu 上安装：

      sudo apt install virt-manager

- 在 CentOS/RHEL 上安装：

      sudo dnf install virt-manager

- 在其他 Linux 发行版上安装：

  - Debian:

        sudo apt install virt-manager

  - Fedora:

        sudo dnf install virt-manager

### 验证安装

#### 检查 KVM 模块是否已加载

1. 检查 KVM 模块是否已加载：

       lsmod | grep kvm

   应该看到类似以下的输出：

       kvm_intel             204800  0
       kvm                   655360  1 kvm_intel

2. 如果使用 AMD 处理器，检查 `kvm-amd` 模块：

       lsmod | grep kvm

   应该看到类似以下的输出：

       kvm_amd               204800  0
       kvm                   655360  1 kvm_amd

#### 确认虚拟化功能可用

1. 在 Ubuntu 和 Debian 上使用 `kvm-ok` 工具检查虚拟化功能：

       sudo apt install cpu-checker
       sudo kvm-ok

   输出应显示：

       INFO: /dev/kvm exists
       KVM acceleration can be used

2. 在 CentOS/RHEL 和其他发行版上，使用 `virt-host-validate` 工具检查：

       sudo virt-host-validate

   输出应显示：

       QEMU: Checking for hardware virtualization: PASS
       QEMU: Checking for device /dev/kvm: PASS
       QEMU: Checking for device /dev/vhost-net: PASS
       QEMU: Checking for device /dev/net/tun: PASS
       ……

通过以上步骤，可以确保 KVM 及其相关工具已正确安装并配置好。接下来可以开始创建和管理虚拟机，充分利用 KVM 提供的虚拟化功能。

## 基本配置

### 配置网络桥接

网络桥接允许虚拟机直接与主机网络进行通信，使其像物理机一样访问网络。以下是使用 `nmcli` 创建和配置虚拟网络桥接的详细步骤：

#### 创建虚拟网络桥接（桥接模式）

1. 安装必要的软件包：

   - 在 Ubuntu 上：

         sudo apt update
         sudo apt install network-manager

   - 在 CentOS/RHEL 上：

         sudo dnf install NetworkManager

2. 配置网络桥接：

   - 创建一个新的网桥接口：

         sudo nmcli connection add type bridge ifname br0

   - 将物理接口连接到网桥上，例如假设你正在使用 `eth0` 接口：

         sudo nmcli connection add type bridge-slave ifname eth0 master br0

   - 建议禁用网桥接口 IPv4 和 IPv6，网桥接口仅作为二层设备使用：

         sudo nmcli connection modify br0 ipv4.method disable
         sudo nmcli connection modify br0 ipv6.method disable

   - 激活网桥和物理接口：

         sudo nmcli connection up br0
         sudo nmcli connection up eth0

#### 验证桥接配置

1. 检查网桥接口状态：

       nmcli connection show
       nmcli device status

   应该看到类似以下的输出，表示网桥 `br0` 和物理接口 `eth0` 已经配置并启用：

       NAME                UUID                                  TYPE      DEVICE
       br0                 12345678-1234-1234-1234-123456789abc  bridge    br0
       eth0                87654321-4321-4321-4321-abcdefabcdef  ethernet  eth0

#### 配置 Libvirt 使用桥接网络

1. 编辑或创建网络配置文件：例如 `/etc/libvirt/qemu/networks/bridged.xml`：

       <network>
         <name>bridged</name>
         <forward mode='bridge'/>
         <bridge name='br0'/>
       </network>

2. 定义并启动该网络：

       sudo virsh net-define /etc/libvirt/qemu/networks/bridged.xml
       sudo virsh net-start bridged
       sudo virsh net-autostart bridged

通过这些步骤，您可以在 Ubuntu 和 CentOS 系列系统中使用 `nmcli` 来统一配置和管理网络桥接。这确保了配置的一致性，并简化了网络管理。

### 配置存储池和存储卷

存储池和存储卷管理是 KVM 中虚拟机存储管理的重要组成部分。存储池可以是目录、LVM 或 NFS 等类型，存储卷则是具体的磁盘映像文件。

#### 创建存储池

1. 目录类型存储池：

   - 创建目录：

         sudo mkdir -p /var/lib/libvirt/images

   - 定义存储池：

         sudo virsh pool-define-as --name default --type dir --target /var/lib/libvirt/images

   - 启动并自动启动存储池：

         sudo virsh pool-start default
         sudo virsh pool-autostart default

2. LVM 类型存储池：

   - 创建物理卷和卷组：

         sudo pvcreate /dev/sdX
         sudo vgcreate vg_kvm /dev/sdX

   - 定义存储池：

         sudo virsh pool-define-as --name lvm-pool --type logical --source-name vg_kvm

   - 启动并自动启动存储池：

         sudo virsh pool-start lvm-pool
         sudo virsh pool-autostart lvm-pool

3. NFS 类型存储池：

   - 安装 NFS 客户端：

     - 在 Ubuntu 上：

           sudo apt install nfs-common

     - 在 CentOS/RHEL 上：

           sudo dnf install nfs-utils

   - 定义存储池：

         sudo virsh pool-define-as nfs-pool netfs --source-host nfs-server --source-path /path/to/nfs/export --target /mnt/nfs

   - 启动并自动启动存储池：

         sudo virsh pool-start nfs-pool
         sudo virsh pool-autostart nfs-pool

#### 管理存储卷

1. 创建存储卷：

   - 在默认存储池中创建一个新的存储卷：

         sudo virsh vol-create-as default new-volume 10G

   - 在 LVM 存储池中创建一个新的逻辑卷：

         sudo virsh vol-create-as lvm-pool lv_new-volume 10G

2. 查看存储卷：

       sudo virsh vol-list default
       sudo virsh vol-list lvm-pool

3. 删除存储卷：

       sudo virsh vol-delete new-volume --pool default

通过以上配置步骤，可以成功配置 KVM 的网络桥接、存储池和存储卷，确保虚拟机具备网络连接和存储资源。

## 创建和管理虚拟机

### 使用命令行工具创建虚拟机

#### 使用 `virt-install` 创建虚拟机

`virt-install` 是一个命令行工具，用于创建虚拟机。它支持多种参数，可以灵活配置虚拟机的各种选项。

1. 创建基本虚拟机：

       sudo virt-install \
         --name myvm \
         --ram 2048 \
         --disk path=/var/lib/libvirt/images/myvm.qcow2,size=20 \
         --vcpus 2 \
         --os-type linux \
         --os-variant ubuntu20.04 \
         --network bridge=br0 \
         --graphics vnc \
         --cdrom /path/to/ubuntu-20.04.iso

   以上命令创建了一个名为 `myvm` 的虚拟机，分配 2 GB 内存、20 GB 磁盘空间和 2 个虚拟 CPU，使用桥接网络，并通过 VNC 访问图形界面。

2. 其他常用选项：

   在使用 `virt-install` 创建和安装虚拟机时，以下是一些常用的选项及其功能，列在一个表格中以便参考：

   选项 | 功能
   --- | ---
   `--name` | 虚拟机的名称
   `--memory` | 分配给虚拟机的内存大小（单位：MB）
   `--vcpus` | 分配给虚拟机的虚拟 CPU 数量
   `--disk` | 定义虚拟机的磁盘配置
   `--cdrom` | 使用 CD-ROM 镜像文件作为安装源
   `--location` | 网络安装源的位置（URL 或本地路径）
   `--os-type` | 指定操作系统类型（如 `linux`、`windows`）
   `--os-variant` | 指定操作系统版本
   `--graphics` | 配置图形显示方式
   `--network` | 配置虚拟机的网络接口
   `--extra-args` | 向内核传递额外的启动参数
   `--boot` | 配置引导设备和引导顺序
   `--console` | 配置控制台类型
   `--import` | 从现有磁盘映像文件导入虚拟机
   `--autostart` | 安装后自动启动虚拟机
   `--cpu` | 配置 CPU 相关选项
   `--check` | 启用或禁用安装前的配置检查
   `--virt-type` | 指定虚拟化类型（如 `kvm`、`xen`）
   `--initrd-inject` | 指定需要注入到 initrd 的文件
   `--metadata` | 定义虚拟机的元数据
   `--noautoconsole` | 安装后不自动连接到控制台
   `--wait` | 等待安装完成的时间（单位：分钟）

#### 使用 `virsh` 管理虚拟机

`virsh` 是一个强大的命令行工具，用于管理和控制虚拟机。以下是一些常用的命令及其功能，列在一个表格中以便参考：

命令 | 功能
--- | ---
`virsh list` | 列出当前运行的虚拟机
`virsh list --all` | 列出所有虚拟机，包括停止的
`virsh start <vm_name>` | 启动指定的虚拟机
`virsh shutdown <vm_name>` | 关闭指定的虚拟机
`virsh reboot <vm_name>` | 重启指定的虚拟机
`virsh destroy <vm_name>` | 强制关闭指定的虚拟机
`virsh suspend <vm_name>` | 暂停指定的虚拟机
`virsh resume <vm_name>` | 恢复暂停的虚拟机
`virsh create <xml_file>` | 从 XML 配置文件创建并启动虚拟机
`virsh define <xml_file>` | 定义但不启动虚拟机
`virsh undefine <vm_name>` | 删除虚拟机定义，但不删除磁盘文件
`virsh edit <vm_name>` | 编辑虚拟机的 XML 配置
`virsh dumpxml <vm_name>` | 输出指定虚拟机的 XML 配置
`virsh attach-disk <vm_name> <disk_path> <target_dev>` | 附加磁盘到虚拟机
`virsh detach-disk <vm_name> <target_dev>` | 从虚拟机分离磁盘
`virsh attach-interface <vm_name> <type> <source>` | 附加网络接口到虚拟机
`virsh detach-interface <vm_name> <type> <mac>` | 从虚拟机分离网络接口
`virsh snapshot-create-as <vm_name> <snapshot_name>` | 创建虚拟机快照
`virsh snapshot-list <vm_name>` | 列出虚拟机的所有快照
`virsh snapshot-revert <vm_name> <snapshot_name>` | 恢复到指定快照
`virsh migrate <vm_name> <dest_uri>` | 迁移虚拟机到另一个主机
`virsh console <vm_name>` | 连接到虚拟机的控制台
`virsh dominfo <vm_name>` | 显示虚拟机的详细信息
`virsh domstats <vm_name>` | 显示虚拟机的统计信息

### 使用图形化工具创建虚拟机

#### 安装和使用 `virt-manager`

`virt-manager` 是一个基于图形界面的虚拟机管理工具，适合那些更喜欢图形界面操作的用户。

1. 安装 `virt-manager`：

   - 在 Ubuntu 上：

         sudo apt install virt-manager

   - 在 CentOS/RHEL 上：

         sudo dnf install virt-manager

2. 启动 `virt-manager`：

       virt-manager

#### 通过 `virt-manager` 创建和配置虚拟机

1. 创建新虚拟机：
   - 打开 `virt-manager`，点击左上角的“创建新虚拟机”按钮。
   - 选择安装来源（例如，ISO 映像或 PXE 网络引导），然后点击“转到下一步”。
   - 设置虚拟机名称、内存和 CPU 配置，然后点击“转到下一步”。
   - 配置虚拟机硬盘（例如，创建新磁盘映像或导入现有磁盘），然后点击“转到下一步”。
   - 选择网络配置（例如，使用桥接网络），然后点击“转到下一步”。
   - 检查配置并点击“完成”以创建虚拟机。
2. 配置虚拟机：
   - 右键点击已创建的虚拟机，选择“打开”以启动虚拟机。
   - 在虚拟机启动后，可以通过 VNC 或 SPICE 连接访问虚拟机的图形界面。
   - 可以通过“虚拟机”菜单下的“编辑”选项修改虚拟机配置，如增加内存、添加硬盘或修改网络设置。

通过上述方法，可以使用命令行工具和图形化工具创建和管理 KVM 虚拟机。无论是命令行操作还是图形界面，都提供了丰富的选项和灵活的配置，使得 KVM 虚拟机的管理变得简单高效。