介绍
Ubuntu 是全球使用最广泛的 Linux 发行版之一,受到从个人用户到企业系统的各种环境的信赖。它常用于服务器搭建和开发环境。当你想在 Ubuntu 上实现全规模虚拟化时,最强大的解决方案之一就是 KVM(基于内核的虚拟机)。
KVM 是一种直接内置于 Linux 内核的基于 hypervisor 的虚拟化技术。通过利用 Intel VT、AMD‑V 等硬件辅助虚拟化特性,它提供了高性能和高稳定性。作为开源方案,KVM 让你在保持低成本的同时构建稳健的虚拟化基础设施。
虚拟化技术乍看可能比较复杂。然而,借助 Ubuntu 与 KVM 的组合,即使是初学者也能相对轻松地创建和运行虚拟机。它同样非常适合希望高效利用现有物理服务器资源的中级用户,以及希望将生产系统虚拟化的工程师。
本文将全面阐述如何在 Ubuntu 上构建基于 KVM 的虚拟化环境,涵盖基础使用、实用操作技巧以及常见问题的解决方案。如果你正考虑引入 KVM,或想更好地在 Ubuntu 上使用虚拟化,请务必阅读至文末。
KVM 与其他虚拟化技术的对比
市面上可供选择的虚拟化技术种类繁多。在 Ubuntu 环境中,常用的选项包括 KVM、VirtualBox 和 VMware。本节将说明每种技术的特性与差异,并阐述选择 KVM 的优势与劣势。
虚拟化技术的主要类型
- KVM(基于内核的虚拟机) KVM 是内置于 Linux 内核的虚拟化特性,主机操作系统必须是 Linux。通过利用 Intel VT、AMD‑V 等硬件虚拟化支持,它提供了适用于生产环境的高虚拟机性能。可通过命令行工具和 virt-manager 等管理实用程序实现灵活操作。
- VirtualBox VirtualBox 是 Oracle 提供的面向桌面的虚拟化软件,可在 Windows、macOS 和 Linux 上运行。它界面直观,常用于个人或学习用途。但相较于 KVM,在高负载或商业环境中的适用性较差。
- VMware(VMware Workstation / ESXi 等) VMware 是在企业环境中广泛使用的商业虚拟化产品。它功能丰富、支持力度强,但需要付费授权,尤其在大规模部署时会显著提升运营成本。
KVM 的优势
- 高性能与高稳定性 由于 KVM 作为 Linux 内核的一部分运行,它能够高效利用资源,并对 CPU 与内存分配进行细粒度控制。其稳定性使其适用于真实的生产系统。
- 开源且免费 KVM 完全开源,无需授权费用,是在预算受限的情况下构建虚拟化平台的理想选择。
- 丰富的管理工具与自动化能力 KVM 同时提供命令行工具(virsh、virt‑install)和图形界面工具(virt‑manager),便于实现操作自动化,并能与 DevOps 与基础设施管理工作流深度集成。
KVM 的劣势
- 仅限 Linux 主机操作系统 KVM 需要 Linux 内核,无法在 Windows 或 macOS 上作为主机使用。
- 需要 Linux 知识进行配置与故障排除 虽然有图形化工具,但高级配置和故障排除往往需要使用命令行并具备 Linux 相关的专业知识。
何时应该选择 KVM?
- 当您想要高效利用物理服务器资源时
- 当生产级系统或服务器需要虚拟化时
- 当您想以低成本构建功能完整的虚拟化平台时
- 当您想自动化 Linux 服务器操作和基础设施管理时
KVM 不仅适用于有经验的 Linux 用户和工程师,也适用于计划在未来开展严肃服务器运维的人员。
虚拟机创建与基本操作
一旦 KVM 环境准备就绪,您即可开始创建和操作虚拟机。KVM 允许您根据使用场景在图形管理工具(virt-manager)和命令行操作(virt-install 与 virsh)之间进行选择。本节将介绍这两种方法。
使用 virt-manager(GUI)创建虚拟机
virt-manager 是一款通过直观图形界面创建和管理虚拟机的工具。如果您使用的是 Linux 桌面环境,virt-manager 尤其方便。
- 从应用菜单或命令行启动
virt-manager。 - 点击左上角的 “New” 按钮。
- 选择安装介质位置(如 ISO 镜像),并选择客体操作系统类型(例如 Ubuntu 或 Windows)。
- 配置虚拟机的 CPU 核数、内存大小和磁盘容量。
- 检查设置后点击 “Finish” 创建虚拟机并开始安装过程。
使用 virt-manager,您可以轻松启动、停止、重启虚拟机,进行快照,以及添加网络接口或存储设备。
使用 virt-install(CLI)创建虚拟机
对于服务器场景或远程环境,从命令行创建虚拟机通常更为实用。下面给出 virt-install 命令的基本用法示例。
sudo virt-install \
--name ubuntu-vm \
--memory 2048 \
--vcpus 2 \
--disk size=20 \
--cdrom /path/to/ubuntu.iso \
--os-type linux \
--os-variant ubuntu20.04 \
--network network=default \
--graphics vnc
--name: 虚拟机名称--memory: 分配的内存(单位 MB)--vcpus: 虚拟 CPU 核数--disk size=20: 虚拟磁盘大小(单位 GB)--cdrom: 用于安装的 ISO 镜像路径--os-type、--os-variant: 操作系统类型和版本--network: 网络配置--graphics: 图形模式(如 VNC)
执行该命令后,虚拟机将自动启动,并通过 VNC 或其他图形界面显示安装画面。
启动、停止、删除及快照虚拟机
KVM 通过简洁的命令即可轻松管理虚拟机。常用操作如下:
- 启动虚拟机
virsh start <virtual-machine-name>
- 关闭虚拟机
virsh shutdown <virtual-machine-name>
- 强制停止虚拟机
virsh destroy <virtual-machine-name>
- 删除虚拟机(删除磁盘时请谨慎)
virsh undefine <virtual-machine-name>
- 创建快照
virsh snapshot-create-as <virtual-machine-name> <snapshot-name>
所有这些操作也可以通过 virt-manager GUI 完成。
网络配置与扩展
网络配置是使用 KVM 运行虚拟机的关键环节。默认配置已能满足多数场景,但生产环境往往需要进行定制。本节阐述 KVM 网络的基础知识以及常用的高级配置。
默认 NAT(virbr0)与桥接网络的区别
当安装 KVM 时,会自动创建名为 virbr0 的虚拟网络桥。这是基于 NAT 的网络,具有以下特性。
- virbr0(NAT 模式)的特性
- 虚拟机可以访问外部互联网
- 从宿主机或其他网络直接访问需要端口转发
- 适用于家庭使用、开发和测试环境
相比之下,桥接网络为虚拟机提供与物理网络等同的访问权限。
- 桥接网络的特性
- 虚拟机加入与宿主机相同的网络段
- 可以直接从物理 PC 和其他服务器访问
- 适用于生产服务器和面向公众的服务
创建和配置自定义桥接(用于局域网访问)
如果您希望生产服务器或其他 PC 能直接访问虚拟机,则应配置桥接网络。下面是一个通用的操作示例,假设宿主机的物理网卡为 eth0。
- 安装 bridge-utils(如果已安装可跳过)
sudo apt install bridge-utils
- 编辑网络配置文件 Ubuntu 18.04 及以后版本使用 Netplan。编辑类似
/etc/netplan/01-netcfg.yaml的配置文件。示例:network: version: 2 renderer: networkd ethernets: eth0: dhcp4: no bridges: br0: interfaces: [eth0] dhcp4: yes
- 应用配置
sudo netplan apply
- 将新桥接(br0)分配给虚拟机网络 使用 virt‑manager 或 virsh 将网络适配器更改为 br0。
静态 IP 分配和端口转发
- 静态 IP 分配 您可以在客体操作系统内部配置静态 IP,或根据 MAC 地址通过 DHCP 服务器分配固定 IP。
- 端口转发(使用 NAT 时) 通过 virsh 命令或 libvirt XML 配置,您可以将特定端口(如 SSH 或 Web 服务)从宿主机转发到虚拟机。示例(转发 SSH 端口 22):
virsh nat-forward --network default --add-port tcp:2222:22
注意:通过编辑 libvirt 配置文件或使用 firewalld 控制访问,还可以进行更高级的配置。
存储管理与磁盘操作
在使用 KVM 运行虚拟机时,存储设计和磁盘管理极为重要。本节将说明虚拟磁盘的类型、创建方法、存储池的管理,以及如何扩展磁盘并有效使用快照。
虚拟磁盘类型(qcow2 与 raw)及使用场景
KVM 主要支持以下两种虚拟磁盘类型。
- qcow2 格式
- KVM 的标准虚拟磁盘格式
- 支持快照、磁盘压缩以及空间高效分配
- 适用于灵活的操作和测试环境
- raw 格式
- 简单的格式,不进行压缩或转换
- 最适合追求最高性能和高 I/O 工作负载的场景
大多数情况下推荐使用 qcow2,但应根据具体需求选择合适的格式。
创建与管理存储池
KVM 通过所谓的存储池概念来管理虚拟机使用的磁盘资源。
- 默认存储池 安装后,
/var/lib/libvirt/images/被用作默认存储池。虚拟磁盘会在该目录下创建。 - 创建新存储池(示例)
- 创建目录
sudo mkdir /data/kvm-images sudo chown libvirt-qemu:kvm /data/kvm-images - 使用 virt‑manager 或 virsh 添加新池,使用 virsh:
virsh pool-define-as --name mypool --type dir --target /data/kvm-images virsh pool-autostart mypool virsh pool-start mypool
扩展虚拟磁盘与使用快照
- 扩展虚拟磁盘 为了增加磁盘容量,使用
qemu-img命令(支持 qcow2 与 raw)。sudo qemu-img resize /var/lib/libvirt/images/ubuntu-vm.qcow2 +10G
调整大小后,还必须在客体操作系统内部扩展分区和文件系统。
- 使用快照 使用 qcow2 磁盘时,您可以创建快照以在特定时间点保存虚拟机的状态。
virsh snapshot-create-as <virtual-machine-name> <snapshot-name>
快照在进行配置更改、系统更新或测试回滚场景之前进行备份时极为有用。
客户操作系统的安装与运行
本节介绍如何在 KVM 虚拟机中安装并高效运行操作系统。内容涵盖典型的客户操作系统安装流程、ISO 镜像的处理以及性能优化技巧。
安装常见的客户操作系统
KVM 支持多种客户操作系统,包括 Ubuntu、CentOS 和 Windows。以下提供 Ubuntu 和 Windows 的示例安装步骤。
- Ubuntu 安装
- 从 Ubuntu 官方网站下载最新的 ISO 镜像。
- 在 virt-manager 中创建新虚拟机时,选择“本地安装介质”,并指定下载的 ISO 文件。
- 为虚拟机配置 CPU、内存和磁盘容量。
- 按照屏幕提示完成标准的 Ubuntu 安装。
- Windows 安装
- 从 Microsoft 官方网站下载 Windows 评估版 ISO 镜像。
- 使用 virt-manager 或 virt-install 创建新虚拟机,并指定 ISO 文件。
- 对于 Windows 客户机,安装 virtio 驱动可显著提升磁盘和网络性能。将 virtio ISO 挂载为虚拟 CD 驱动器,并在安装过程中使用。
获取并挂载 ISO 镜像
- 客户操作系统的安装需要从官方渠道下载的 ISO 镜像。
- 在创建虚拟机时指定 ISO 文件路径,即可将其挂载为虚拟 CD/DVD。
- 如有需要,可同时挂载多个 ISO 镜像(操作系统和驱动)。
客户操作系统运行与性能优化技巧
- 优化资源分配 合理分配 CPU 和内存。资源分配过多会对宿主操作系统和其他虚拟机产生负面影响。
- 安装 virtio 驱动 在 Windows 或较旧的 Linux 客户机中安装 virtio 驱动,可大幅提升磁盘和网络性能。
- 禁用不必要的服务 禁用客系统中未使用的服务和后台进程,有助于节约系统资源。
- 使用 KVM 客户工具 安装 QEMU Guest Agent 可实现更精准的虚拟机信息获取以及受控关机操作。
实际使用案例与自动化技巧
KVM 并不仅限于简单的虚拟机创建与运行。它在各种业务和开发场景中得到广泛应用,通过结合脚本和自动化工具,可显著提升管理效率。本节将介绍实际使用案例和自动化思路。
服务器使用案例示例
- 开发与测试环境分离 为每个项目准备独立的虚拟机,可自由切换软件版本和配置,从而在不影响生产系统的情况下测试新操作系统版本或应用程序。
- 构建内部服务 将文件服务器、Web 服务器和数据库服务器分别运行在独立的虚拟机中,可降低故障影响。备份和快照也能按虚拟机轻松管理。
使用 CLI 与 Ansible 实现自动化供应
- 使用 CLI 自动创建虚拟机 通过脚本化
virt-install和virsh命令,可自动创建和管理多台虚拟机。例如:用于批量创建虚拟机的 Shell 脚本。for i in {1..5} do virt-install --name test-vm-$i --memory 1024 --vcpus 1 \ --disk size=10 --cdrom /path/to/ubuntu.iso \ --os-type linux --os-variant ubuntu20.04 \ --graphics none --network network=default --noautoconsole done
- 使用 Ansible 的基础设施自动化 使用 Ansible,您可以仅通过 playbook 自动化虚拟机创建、初始配置和应用部署。这在服务器众多或配置一致性至关重要的环境中尤为有效。
类云操作技巧
- 创建 VM 模板 将经常使用的基础虚拟机保存为模板,可让您几乎瞬间部署新服务器。
- API 集成与基于 Web 的管理工具 libvirt 提供可与自定义工具或其他管理系统集成的 API。在大规模环境中,诸如 Cockpit 的基于 Web 的管理工具实现可视化和集中化控制。
故障排除与常见错误解决方案
在运行 KVM 环境时,您可能会遇到虚拟机启动失败或网络连接问题等情况。本节涵盖常见问题、排查步骤以及如何有效利用日志和支持资源。

KVM 常见问题
- 虚拟机启动失败或无法创建
- 硬件虚拟化(Intel VT 或 AMD‑V)被禁用
- 分配的内存或磁盘空间不足
- 存储池或 ISO 镜像路径不正确
- 网络连接问题
- 虚拟网络适配器配置错误
- 桥接或 NAT 配置错误,或 DHCP 分配失败
- 防火墙或安全限制
- 性能严重下降
- 资源分配过度或不足
- 缺少 virtio 驱动(尤其是 Windows 客户机)
- 磁盘 I/O 瓶颈
日志检查与基本排查流程
出现问题时,检查日志应是第一步。
- 检查系统日志
sudo journalctl -xe
查找与 KVM 或 libvirt 相关的错误信息。
- 检查 libvirt 日志 位于
/var/log/libvirt/(如libvirtd.log)的日志文件提供有价值的信息。 - 检查 VM 专用日志 使用 virt‑manager 或 virsh 检查 VM 状态,并在日志或详情视图中查看错误细节。
- 检查网络状态
ip a brctl show virsh net-list --all
这些命令有助于验证网络连接和桥接配置。
基本排查工作流
- 确定问题何时开始以及有哪些更改
- 查看日志和配置
- 如有必要,修改设置并重启服务或重新创建虚拟机
使用官方文档和社区资源
以下资源在排查问题时非常有帮助。
- 官方文档 Ubuntu 官方 KVM 文档 libvirt 官方文档
- 社区论坛和问答站点
- Ubuntu 论坛
- Ask Ubuntu
- Stack Overflow
- 使用错误信息搜索 在英文和本地语言中搜索精确的错误信息,通常能找到相关解决方案。
安全性与性能优化
安全高效地运行 KVM 环境需要安全措施和性能优化。本节介绍保护虚拟化平台和最大化资源效率的实用技术。
加强虚拟化安全性
- 禁用不必要的服务并最小化配置 禁用客机和宿主系统中未使用的服务,以减少攻击面。
- 防火墙和访问控制 在宿主和客机系统上适当配置防火墙(如 ufw 或 firewalld)。使用非默认端口、基于密钥的认证以及 fail2ban 等工具来保护 SSH 访问。
- 虚拟机之间的隔离 使用不同的虚拟网络或物理网络分段来分离关键服务器,以在遭受妥协时限制损害。
- 定期更新 保持宿主和客机系统的安全补丁和软件更新。
优化资源分配(CPU、内存、磁盘 I/O)
- 基本资源管理 为每个虚拟机仔细分配 CPU 和内存,同时为宿主系统保留足够的资源。
- 磁盘 I/O 优化 为关键虚拟机使用高速 SSD 存储。对 qcow2 格式的过度快照使用保持警惕,因为可能影响性能。
- 使用 virtio 驱动 安装 virtio 驱动可显著提升客机操作系统的磁盘和网络性能。
自动化备份和快照
- 定期创建快照 定期快照可在系统故障时实现快速恢复。
- 备份磁盘镜像和配置文件 定期将虚拟磁盘镜像(qcow2 或 raw)和 libvirt XML 配置文件备份到外部存储。
- 与自动化工具集成 使用 cron 或 Ansible 自动化备份和快照任务。
结论与学习资源
本文涵盖了从在 Ubuntu 上构建 KVM 虚拟化环境到日常运维、实际案例、故障排除、安全以及性能优化的全部内容。以下是摘要和进一步学习的推荐资源。
摘要
- KVM 概述与优势 KVM 是一种开源的高性能虚拟化技术,广泛用于 Ubuntu 服务器环境。
- 从安装到运维 我们演示了 CPU 虚拟化检查、软件包安装、权限设置、虚拟机创建以及基本操作。
- 网络、存储与运维最佳实践 您学习了如何配置 NAT 与桥接网络、管理存储池、扩展磁盘以及有效使用快照。
- 故障排除与安全 介绍了常见错误的解决方案、日志检查方法以及安全高效运维的最佳实践。
后续步骤与推荐资源
KVM 是一个强大的虚拟化平台,适用于个人和企业。请以本指南为基础,进一步深化理解,并根据具体需求定制 KVM。
命令速查表与常用配置示例
随时可用的常用命令和配置示例能够显著提升日常虚拟机管理效率。本节提供简明参考。
常用 KVM / virsh / virt-manager 命令
- 列出虚拟机
virsh list --all
- 启动虚拟机
virsh start <virtual-machine-name>
- 关闭虚拟机
virsh shutdown <virtual-machine-name>
- 强制停止虚拟机
virsh destroy <virtual-machine-name>
- 创建虚拟机(virt-install)
virt-install --name <name> --memory <MB> --vcpus <cores> \ --disk size=<GB> --cdrom <ISO-path> \ --os-type linux --os-variant ubuntu20.04
- 删除虚拟机(仅删除定义)
virsh undefine <virtual-machine-name>
网络和桥接配置示例
- 列出网络
virsh net-list --all
存储管理与磁盘操作
- 列出存储池
virsh pool-list --all
- 调整虚拟磁盘大小
sudo qemu-img resize /path/to/disk.qcow2 +10G
- 创建快照
virsh snapshot-create-as <virtual-machine-name> <snapshot-name>
其他实用技巧
- 启用虚拟机自动启动
virsh autostart <virtual-machine-name>
- 显示详细的虚拟机信息
virsh dominfo <virtual-machine-name>
- 启动 virt-manager(图形界面)
virt-manager
常见问题解答
Q1:KVM、VirtualBox 和 VMware 有何区别?
A1:KVM 是集成在 Linux 内核中的高性能虚拟化平台,适合生产服务器使用。VirtualBox 主要面向桌面用户,而 VMware 提供丰富的企业功能并有商业支持。若追求低成本高性能,KVM 是理想选择。
Q2:如何备份和恢复虚拟机?
A2:可以通过复制磁盘镜像文件(qcow2 或 raw)来备份虚拟机。同时建议备份 libvirt 的 XML 配置文件和快照,以便更轻松地恢复。
Q3:能在虚拟机内部使用 USB 设备吗?
A3:可以。可通过 virt-manager 的硬件设置或 virsh 配置 USB 直通,从而在虚拟机中使用 USB 存储设备、外接硬盘和打印机等。
Q4:如何在主机启动时自动启动虚拟机?
A4:运行 virsh autostart <virtual-machine-name> 命令,即可在主机系统启动时自动启动对应的虚拟机。
Q5:如果虚拟机运行缓慢该怎么办?
A5:检查 CPU 与内存分配,优化磁盘 I/O(使用更快的存储或在合适情况下将 qcow2 改为 raw),并在客系统中安装 virtio 驱动程序。
Q6:网络配置无法正常工作。应检查哪些方面?
A6:使用 virsh 和 brctl 命令检查网络状态。审查桥接、Netplan 或 NetworkManager 的配置文件,并在必要时重新创建虚拟网络。
Q7:可以使用 KVM 构建集群或高可用(HA)配置吗?
A7:可以。通过将 KVM 与 Pacemaker、Corosync 以及共享存储(NFS 或 iSCSI)结合使用,可实现 HA 配置和实时迁移。但需要具备较高的技术水平。


