Skip to content

使用QEMU/KVM创建虚拟机完整指南

概述

QEMU/KVM是Linux系统中的主流虚拟化解决方案,提供高性能的硬件虚拟化能力。本文档详细介绍使用QEMU和KVM创建和管理虚拟机的完整流程,包括磁盘创建、虚拟机安装和配置优化。

核心原理

KVM(基于内核的虚拟机)是Linux内核的虚拟化基础设施,QEMU提供硬件模拟和设备模拟。二者结合可以实现接近物理机的性能:

  1. KVM:提供CPU和内存虚拟化
  2. QEMU:模拟各种硬件设备
  3. Libvirt:提供虚拟机管理API和工具

前提条件

1. 硬件要求

  • 支持虚拟化技术的CPU(Intel VT-x或AMD-V)
  • 足够的内存和存储空间
  • 支持虚拟化的BIOS设置(需在BIOS中启用VT-x/AMD-V)

2. 软件要求

bash
# 检查CPU是否支持虚拟化
egrep -c '(vmx|svm)' /proc/cpuinfo

# 检查KVM内核模块是否加载
lsmod | grep kvm

# CentOS/RHEL安装KVM相关软件
yum install qemu-kvm libvirt virt-install bridge-utils -y

# Ubuntu/Debian安装KVM相关软件
apt install qemu-kvm libvirt-daemon-system virtinst bridge-utils -y

3. 服务启动

bash
# 启动libvirt服务
systemctl start libvirtd
systemctl enable libvirtd

# 检查libvirt服务状态
systemctl status libvirtd

# 将用户添加到libvirt组(可选)
usermod -a -G libvirt $(whoami)

磁盘管理

1. 创建磁盘镜像

bash
# 创建30GB的qcow2格式磁盘
qemu-img create -f qcow2 /kvm_dir/kylin-vm-verify4.qcow2 30G

# 查看磁盘信息
qemu-img info /kvm_dir/kylin-vm-verify4.qcow2

2. 磁盘格式说明

格式说明特点
raw原始格式性能最好,但功能有限
qcow2QEMU镜像格式支持快照、压缩和加密
vmdkVMware格式与VMware兼容
vhdHyper-V格式与Hyper-V兼容

3. 调整磁盘大小

bash
# 扩展磁盘到50GB
qemu-img resize /kvm_dir/kylin-vm-verify4.qcow2 +20G

# 磁盘格式转换
qemu-img convert -f raw -O qcow2 source.img target.qcow2

网络配置

1. 桥接网络设置

bash
# 创建桥接网卡
brctl addbr br0
brctl addif br0 eth0

# 为桥接网卡分配IP
dhclient br0

# 或者静态配置
ifconfig br0 192.168.1.100 netmask 255.255.255.0 up

2. NAT网络设置

bash
# 创建NAT网络(默认已存在)
virsh net-list --all

# 启动默认网络
virsh net-start default
virsh net-autostart default

虚拟机创建

1. 使用virt-install创建虚拟机

bash
# 创建虚拟机并启动安装
virt-install \
  --name kylin-vm-verify4 \
  --memory 4096 \
  --vcpus 4 \
  --os-type=linux \
  --os-variant=kylin10 \
  --disk path=/kvm_dir/kylin-vm-verify4.qcow2,format=qcow2,bus=virtio \
  --cdrom /root/Kylin-Server-V10_U1-Release-Build02-20210729-GFB-arm64.iso \
  --network bridge=br0,model=virtio \
  --graphics vnc,listen=0.0.0.0,port=5906,password=shxy@000 \
  --boot uefi \
  --noautoconsole

2. 参数详解

参数说明示例值
--name虚拟机名称kylin-vm-verify4
--memory内存大小(MB)4096
--vcpusCPU核心数4
--os-type操作系统类型linux
--os-variant操作系统变体kylin10
--disk磁盘配置path=/kvm_dir/xxx.qcow2,format=qcow2,bus=virtio
--cdrom安装介质路径/root/xxx.iso
--network网络配置bridge=br0,model=virtio
--graphics图形配置vnc,listen=0.0.0.0,port=5906,password=xxx
--boot启动方式uefi

3. 从现有磁盘启动虚拟机

bash
# 从已有磁盘启动虚拟机
virt-install \
  --name kylin-vm-verify4 \
  --memory 4096 \
  --vcpus 4 \
  --import \
  --disk path=/kvm_dir/kylin-vm-verify4.qcow2,format=qcow2,bus=virtio \
  --network bridge=br0,model=virtio \
  --graphics vnc,listen=0.0.0.0,port=5906,password=shxy@000

虚拟机管理

1. 使用virsh管理虚拟机

bash
# 列出所有虚拟机
virsh list --all

# 启动虚拟机
virsh start kylin-vm-verify4

# 关闭虚拟机
virsh shutdown kylin-vm-verify4

# 强制关闭虚拟机
virsh destroy kylin-vm-verify4

# 暂停虚拟机
virsh suspend kylin-vm-verify4

# 恢复虚拟机
virsh resume kylin-vm-verify4

# 删除虚拟机
virsh undefine kylin-vm-verify4

2. 虚拟机配置修改

bash
# 编辑虚拟机配置
virsh edit kylin-vm-verify4

# 修改内存大小
virsh setmaxmem kylin-vm-verify4 8G
virsh setmem kylin-vm-verify4 6G

# 添加磁盘
virsh attach-disk kylin-vm-verify4 /kvm_dir/additional_disk.qcow2 vdb --live

# 添加网络接口
virsh attach-interface kylin-vm-verify4 bridge br0 --model virtio --live

3. 虚拟机快照管理

bash
# 创建快照
virsh snapshot-create-as kylin-vm-verify4 --name "snap1" --description "First snapshot"

# 列出快照
virsh snapshot-list kylin-vm-verify4

# 恢复快照
virsh snapshot-revert kylin-vm-verify4 --snapshotname "snap1"

# 删除快照
virsh snapshot-delete kylin-vm-verify4 --snapshotname "snap1"

性能优化

1. CPU优化

xml
<!-- 在虚拟机XML配置中优化CPU -->
<cpu mode='host-passthrough' check='partial'>
  <feature policy='require' name='vmx'/>
</cpu>

<!-- 设置CPU拓扑 -->
<cpu>
  <topology sockets='2' cores='2' threads='1'/>
</cpu>

2. 内存优化

xml
<!-- 启用大页内存 -->
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<memoryBacking>
  <hugepages>
    <page size='2048' unit='KiB'/>
  </hugepages>
</memoryBacking>

3. 磁盘I/O优化

xml
<!-- 使用virtio磁盘控制器 -->
<controller type='virtio-serial' index='0' ports='16'>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
</controller>

<!-- 磁盘缓存策略 -->
<disk type='file' device='disk'>
  <driver name='qemu' type='qcow2' cache='none' io='native'/>
  <source file='/kvm_dir/kylin-vm-verify4.qcow2'/>
</disk>

4. 网络优化

xml
<!-- 使用virtio网络设备 -->
<interface type='bridge'>
  <mac address='52:54:00:71:b1:b6'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <driver name='vhost'/>
  <tune>
    <sndbuf size='256'/>
    <rcvbuf size='256'/>
  </tune>
</interface>

高级功能

1. 虚拟机克隆

bash
# 克隆虚拟机
virt-clone --original kylin-vm-verify4 --name kylin-vm-clone --file /kvm_dir/kylin-vm-clone.qcow2

# 克隆磁盘
virt-clone --original-xml /etc/libvirt/qemu/kylin-vm-verify4.xml --auto-clone

2. 虚拟机迁移

bash
# 准备迁移(源主机)
virsh migrate --live --p2p --tunnelled --unsafe kylin-vm-verify4 qemu+tcp://目标主机IP/system

# 接收迁移(目标主机)
virsh migrate --incoming qemu+tcp://本地IP/system

3. 虚拟机自动启动

bash
# 设置虚拟机自动启动
virsh autostart kylin-vm-verify4

# 查看自动启动设置
virsh list --autostart

故障排查

1. 常见错误及解决

错误1:虚拟机启动失败

bash
# 检查虚拟机日志
journalctl -u libvirtd -f

# 检查虚拟机详情
virsh dominfo kylin-vm-verify4

# 检查XML配置
virsh dumpxml kylin-vm-verify4

错误2:网络连接问题

bash
# 检查桥接网络状态
brctl show

# 检查虚拟网络接口
virsh domiflist kylin-vm-verify4

错误3:性能问题

bash
# 查看虚拟机资源使用
virsh domstats --cpu --block
top -p $(virsh list | awk '/running/ {print $2}')

2. 日志分析

bash
# libvirt守护进程日志
journalctl -u libvirtd -b

# QEMU进程日志
virsh domxml-from-native kylin-vm-verify4 qemu-argv | grep '\-d\|\-D'

# 查看KVM内核消息
dmesg | grep -i kvm

注意事项

⚠️ 安全提醒

  • 限制虚拟机访问宿主机敏感资源
  • 定期更新虚拟化软件
  • 使用SELinux/AppArmor增强虚拟化安全

⚠️ 性能提示

  • 为虚拟机分配适当的资源,避免过度分配
  • 使用virtio设备驱动提高性能
  • 在SSD上存储虚拟机磁盘

⚠️ 维护建议

  • 定期备份虚拟机磁盘和配置
  • 监控宿主机资源使用情况
  • 使用集中管理工具管理大量虚拟机

总结

QEMU/KVM提供了强大的虚拟化解决方案,通过合理配置可以实现接近物理机的性能。创建虚拟机需要注意磁盘格式、网络配置和资源分配。通过virt-install、virsh等工具可以方便地管理虚拟机生命周期,结合性能优化和监控可以构建稳定高效的虚拟化环境。

用心记录,持续学习 | CNB