使用 Virt-Manager 管理 KVM 部署

作者:Michael J. Hammel

KVM 是基于内核的虚拟机,自 2.6.20 版本以来一直是主线内核功能,用于在主机系统之上运行虚拟化访客系统。用不太专业的术语来说,这意味着您可以将其他操作系统作为桌面上的另一个窗口运行。但是,在您可以进入桌面之前,您需要熟悉如何使用虚拟机管理器工具套件创建和管理虚拟机。

每个虚拟机实例(称为 VM)都有其自己的虚拟化硬件。这包括一块内存以及一个或多个可用的 CPU、网络和图形硬件、虚拟磁盘和鼠标。虚拟机管理器工具(通常统称为主要 GUI 应用程序 virt-manager 的名称)使得可以快速启动虚拟硬件,并将虚拟 CD-ROM 设备“连接到”ISO 文件,以便安装操作系统。在工作中,我们运行各种 Linux 发行版和几个 Windows 版本。每个操作系统实例都安装了适用于该实例所有副本的基本配置。这被称为基本镜像。我们从中制作副本(称为克隆),并在其中安装特定的应用程序。克隆和自定义应用程序配置的结果就是云计算世界所称的虚拟设备。

KVM 是运行虚拟机的多种选择之一。Xen、VirtualBox 和 VMware 是替代方案,它们对设置和使用有不同的要求。由于在 Fedora 系统(工作中的标准 Linux 开发平台)上设置简单,并且易于跨内部网络创建和使用虚拟机,因此我们办公室选择了 KVM。此处讨论的过程专门适用于使用基于 KVM 的虚拟机。

由于 KVM 是内核的一部分,因此大多数现代 Linux 发行版都提供 KVM 内核。但是,利用 KVM 的用户级工具(例如 virt-manager 和 libvirt)才是大多数用户感兴趣的。检查您的发行版以获取可安装的软件包,或从本文末尾提供的 URL 获取源代码包。

入门:主机硬件设置

在虚拟化术语中,主机系统是真实的硬件及其操作系统,它将成为您运行访客系统的平台。每个访客系统都是基于 KVM 的虚拟硬件以及安装在其上的操作系统。在主机系统上使用启用 KVM 的内核之前,您需要确保您的硬件支持虚拟化。要检查处理器是否支持虚拟化,请搜索以下 CPU 标志

egrep "vmx|svm" /proc/cpuinfo

具有 VM 支持的 Intel 处理器将在此命令的输出中包含 vmx 标志。支持虚拟机的 AMD 处理器使用 svm 标志。此命令将为每个具有 VM 支持的 CPU 核心打印一行。

下一步是配置主机操作系统。首先要做的是安装与 virt-manager 关联的用户空间工具

sudo yum install kvm qemu libvirt \
                 libvirt-python python-virtinst \
                 bridge-utils virt-manager

这可能会安装其他软件包,但这些软件包对于使用 KVM 和 virt-manager 至关重要。这些软件包名称特定于 Fedora。检查您的发行版以获取正确的软件包名称。

安装所需的软件后,需要在主机系统上添加桥接网络设备。使用桥接设备允许 VM 像网络上的任何其他系统一样运行,使用自己的 IP 地址。在主机系统上,桥接器将被分配一个 IP 地址,默认的“eth”设备将连接到该桥接器。如果您禁用 NetworkManager,则使用桥接网络会更容易一些

# chkconfig NetworkManager off
# chkconfig network on
# service NetworkManager stop
# service network start

NetworkManager 非常适合移动平台,但截至 Fedora 12,它不适合与共享网络(例如主机和访客虚拟化系统使用的网络)一起使用。尽管您可以在移动系统上运行 KVM,但本文假设使用不太可能经常需要更改网络配置的桌面或服务器。

请注意,上述命令必须以 root 用户身份运行。在 Fedora 上,每个网络设备的配置文件都位于 /etc/sysconfig/network-scripts 下。假设您的系统至少有一张网卡,则该目录中将有一个名为 ifcfg-eth0 的配置文件。打开它并添加以下行

BRIDGE=br0

然后,通过在每行前面加上 # 符号来注释掉以下行

#BOOTPROTO=none
#DNS1=...
#GATEWAY=...
#IPADDR=...
#NETMASK=...

要添加桥接设备,请在该目录中创建一个名为 ifcfg-br0 的文件,并将以下行添加到其中

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
DNS1=...
GATEWAY=...
IPADDR=...
NETMASK=...
ONBOOT=yes

带有 ... 的行在大多数情况下可以是您从 ifcfg-eth0 中注释掉的行。请注意,TYPE 条目区分大小写。

请务必为 DNS、GATEWAY、IPADDR 和 NETMASK 分配正确的值。此示例假设使用静态 IP 地址,但如果设备将使用 DHCP,请更改 BOOTPROTO 并省略这些条目

DEVICE=br0
TYPE=Bridge
BOOTPROTO=dhcp
ONBOOT=yes

请注意,主机还应具有大量磁盘空间用于 VM 镜像文件。这些文件的大小可能会有所不同,但在本文中,我们将创建 12GB 的文件,以支持 8GB 上完整的 Linux 发行版和 4GB 用于本地用户目录。较小的安装分区可以用于操作系统,如果需要,用户目录可以 NFS 挂载。此外,可以将 VM 镜像文件放在 NFS 挂载的目录中,尽管这可能会对虚拟机的运行性能产生严重影响。

此时,可以使用新的网络配置重启主机网络

# service network start

主机现在已准备好与虚拟机一起使用。

virt-manager 及其伙伴

在深入创建虚拟机之前,重要的是先了解相关的工具和文件。虚拟机管理器实际上是一套用于处理虚拟机的工具

  1. virt-install:用于将软件安装到 VM 镜像中的命令行工具。

  2. virt-clone:用于克隆 VM 镜像的命令行工具。

  3. virt-manager:用于启动、停止和使用 VM 镜像的 GUI。

  4. virt-image:用于基于 XML 描述创建 VM 的命令行工具。

前三个工具将用于创建、克隆和使用虚拟机。后者对于高级用户很有用,但超出了本文的范围。

virt-manager 工具是 Python 程序,它们依赖于 libvirt 库来管理虚拟机,并依赖于 QEMU 来运行虚拟机。libvirt 和 QEMU 都为各种任务提供了复杂的功能。幸运的是,您无需了解任何关于 QEMU 的知识即可开始使用 VM,您只需了解关于 libvirt 的非常基本的信息即可。

virt-manager 应用程序使用 VNC 连接到远程 libvirt 守护程序,并在本地显示器上查看远程虚拟机。这意味着您可以在您的系统上启动 virt-manager,并连接到跨网络在另一系统上运行的 VM。在大多数情况下,此类连接将需要密码身份验证,具体取决于 libvirt 的配置方式。本文采用了使用 root SSH 访问来访问远程主机的简单(且高度不安全)路径。这适用于我们公司,因为虚拟机位于隔离的网络上。如果您在家中位于配置良好的防火墙之后,这也适用,但为了安全起见,请考虑进一步研究 libvirt 的安全 (TLS) 传输选项。

请注意,virt-manager 提供了一个向导,用于使用本地或远程媒体安装在本地主机上创建新的虚拟机(图 1)。但是,本文重点介绍底层工具 virt-install 和 virt-clone。这些工具在创建虚拟机时提供了更强大的功能和灵活性。

Managing KVM Deployments with Virt-Manager

图 1. virt-manager 向导可以为本地主机创建镜像。

安装基本镜像

安装软件并配置主机网络后,就可以创建基本镜像了。基本镜像是将操作系统安装到 VM 镜像文件中的安装。这些文件可以采用多种格式,但推荐的格式是 qcow2

sudo virt-install --connect qemu:///system \
                  -n <vm-name> \
                  -r 512 \
                  --vcpus=1 \
                  -f ~/<vm-name>.qcow2 \
                  -s 12 \
                  -c <distro-install-image>.iso \
                  --vnc \
                  --noautoconsole \
                  --accelerate \
                  --os-type linux \
                  --os-variant generic26 \
                  --network=bridge:br0

将 <vm-name> 替换为虚拟机的符号名称。在工作中,我们使用发行版名称、版本和 CPU 大小,例如“fedora11-64”。<distro-install-image> 是用于安装 Linux 发行版的 ISO 镜像文件的名称。

virt-install 的手册页详细介绍了可用的选项。此特定命令以 root 用户身份连接到本地 hypervisor (--connect),并设置一个具有 512MB 内存和它可以使用的最大 CPU 数量的访客虚拟机 (-r, --vcpus)。它将在文件 ~/<vm-name>.qcow2 中创建一个 12GB (-f, -s) 的虚拟机镜像,并启动安装媒体 <distro-install-image>.iso。virt-install 将在访客上启动 VNC 控制台,并通过主机使其可用 (--vnc),但默认情况下不启动与其的连接 (--noautoconsole)。稍后将使用 virt-manager 连接到它。访客机器将在可用时使用内核加速运行 (--accelerate)。

访客将使用优化的 ACPI、APIC、鼠标和其他硬件配置 (--os-type, --os-variant) 创建,并使用桥接网络设备 (--network)。请注意,os_type 具有特定的有效值。有关详细信息,请查看手册页。

此命令将立即退出,同时在后台启动 VM。要与操作系统安装进行交互,请启动 virt-manager 应用程序。此程序将识别本地网络上的 VNC 服务器并列出它们(图 2)。双击其中一个将打开与该主机的连接并列出可用的访客系统。双击访客将打开一个访客窗口(图 3)。

Managing KVM Deployments with Virt-Manager

图 2. virt-manager 窗口显示带有 VNC 服务器的主机。连接到本地主机是自动的。

Managing KVM Deployments with Virt-Manager

图 3. 每个操作系统都将设置控制台的默认大小。可以使用“查看→缩放显示”菜单向上缩放控制台窗口,但不能向下缩放。

打开 VNC 窗口后,安装过程就像在裸机上安装一样进行。单击 VM 窗口内部以激活访客 VM 鼠标,然后同时按住 Ctrl-Alt 以将鼠标返回到主机桌面。在许多情况下,您不需要以这种方式捕获鼠标指针。相反,只需将主机鼠标指针悬停在 VM 控制台窗口上并键入,按键就会传递到访客 VM。

安装完成后,通常需要重新启动。即重新启动 VM — 此 VM 实例中的重新启动只会关闭虚拟机,而不会关闭主机。您必须使用 VNC 窗口菜单栏中的“运行”按钮手动再次启动 VM。重新启动后,请务必安装 Linux 发行版的任何更新。

libvirt 配置

使用 virt-install 创建 VM 镜像会执行两件事。它创建一个镜像文件,并创建一个配置(清单 1)以启动 libvirt。配置文件是一个 XML 文件,位于 /etc/libvirtd/qemu 下,应仅 root 用户可访问。

清单 1. VM 的示例 XML 配置文件

<domain type='kvm'>
  <name>ubuntu-9.04-64</name>
  <uuid>19a049b8-83a4-2ed1-116d-33db85a5da17</uuid>
  <memory>1048576</memory>
  <currentMemory>1048576</currentMemory>
  <vcpu>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc'>hvm</type>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <apic/>
    <pae/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/bin/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <source
       file='/home/baseimage/ubuntu-9.04-64.qcow2'/>
      <target dev='hda' bus='ide'/>
    </disk>
    <disk type='file' device='cdrom'>
      <target dev='hdc' bus='ide'/>
      <readonly/>
    </disk>
    <interface type='bridge'>
      <mac address='54:52:00:42:df:25'/>
      <source bridge='br0'/>
    </interface>
    <serial type='pty'>
      <target port='0'/>
    </serial>
    <console type='pty'>
      <target port='0'/>
    </console>
    <input type='mouse' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes'/>
  </devices>
</domain>

如果手动对此文件进行编辑,则应重启 libvirt

sudo service libvirtd restart

但是,最好不要编辑该文件,而是使用 libvirt 的 virsh 命令来更新 VM 配置。如果需要降低 VM 使用的内存量或 CPU 数量,则需要使用 virt-manager 的“详细信息”选项卡,而不是使用 virsh。在重启 libvirt 之前,请务必退出 virt-manager 的任何实例。

基本镜像可以连同 XML 配置文件一起复制到 NFS 目录,以便其他主机可以使用它。要使另一台主机使用它,请将 XML 文件复制到新主机的 /etc/libvirtd/qemu 目录,并对其进行编辑以指向 NFS 挂载点。然后,在新主机上重启 libvirt。

创建克隆

基本镜像只是用于创建 VM 设备的内核镜像。每个设备都是基本镜像的克隆,并安装了其他应用程序。基本镜像也称为“后备存储”,因为基本镜像用于读取,而克隆镜像用于写入。这样,克隆会被更新,而基本镜像保持原始状态。

创建克隆需要主机 libvirt 知道基本镜像,这意味着基本镜像的 XML 配置位于 libvirt 配置目录中,并且 libvirt 已重启。克隆是通过 virt-clone 命令执行的

sudo virt-clone -o <base-image-name> \
                -n <clone-image-name> \
                -f <path-to-base-image>

与 virt-install 一样,virt-clone 选项在手册页中详细描述。使用之前的 virt-install 示例和前面描述的命名方案,Fedora 基本镜像的克隆看起来更像这样

sudo virt-clone -o fedora11-64 \
                -n fedora11-64.1 \
                -f /home/cloneimages/fedora11-64.1

在此示例中,克隆镜像名称与带有标识后缀的基本镜像相同,克隆镜像文件与镜像名称相同,并将在 /home/cloneimages 中创建。镜像名称用于向 libvirt 标识访客 VM,并保存为 VM 的 XML 配置文件中的“name”元素。镜像文件名是镜像所在文件的名称。这存储在 XML 配置文件的“source file”元素中。

克隆镜像可能是一项系统密集型操作。虽然具有 8GB 内存的四核 CPU 可能可以很好地处理此操作,但如果其他操作正在进行中,则单核系统可能会陷入困境。在家中克隆可能需要留到晚上处理。

克隆不是使用 VM 所必需的。您可以像使用基本镜像一样轻松地直接使用它。但是,如果您计划使用相同的基本操作系统安装进行多个独立的配置,则克隆非常有用。换句话说,克隆通常在家庭中不是必需的,但在与服务器集群一起使用时可能是必需的。

总结

libvirt 提供了许多功能来对虚拟机执行更复杂的操作,例如存储、网络和 USB/PCI 选项。所有这些功能都应使用 virsh 命令行工具访问。virt-manager 提供了基于 GUI 的向导来创建新的虚拟机,并允许在显示交互式性能图表(图 4)的同时动态重新配置启动设备。对于家庭用户来说,virt-manager 的最佳功能是它能够同时显示多个 VM 控制台。

Managing KVM Deployments with Virt-Manager

图 4. 处理器和内存使用率可以动态调整到访客配置的最大值。

其他发行版也可以与 KVM 一起使用,尽管主机桥接网络的创建可能有所不同。高级用户可能希望研究使用逻辑卷管理器 (LVM) 而不是平面文件镜像来提高性能。

Michael J. Hammel 是科罗拉多州斯普林斯市 Colorado Engineering, Inc. (CEI) 的首席软件工程师,拥有超过 20 年的软件开发和管理经验。他为众多在线和印刷杂志撰写了 100 多篇文章,并且是关于 GIMP(首屈一指的开源图形编辑软件包)的三本书的作者。

加载 Disqus 评论