跳到主要内容

第3章 创建KVM虚拟机

创建第一台虚拟机

使用virt-install创建虚拟机

virt-install是一个强大的命令行工具,用于创建KVM虚拟机。下面是创建CentOS 7虚拟机的完整示例:

virt-install \
--virt-type kvm \
--os-type=linux \
--os-variant rhel7 \
--name centos7 \
--memory 1024 \
--vcpus 1 \
--disk /opt/centos7.raw,format=raw,size=10 \
--cdrom /opt/CentOS-7-x86_64-DVD-1810.iso \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole

参数详解

virt-install 常用参数说明
参数说明示例
--name虚拟机名称centos7
--memory分配内存大小(MB)1024
--vcpus分配CPU核心数1
--disk虚拟硬盘配置path=/opt/vm.raw,size=10
--cdromISO镜像路径/opt/centos.iso
--network网络配置network=default
--graphics图形界面配置vnc,listen=0.0.0.0
--os-type操作系统类型linux
--os-variant操作系统版本rhel7
--noautoconsole不自动连接控制台-

高级参数

# 支持动态调整的虚拟机配置
virt-install \
--name centos7-advanced \
--memory 1024,maxmemory=4096 \ # 支持内存热添加
--vcpus 2,maxvcpus=8 \ # 支持CPU热添加
--disk /data/vm/centos7.qcow2,format=qcow2,size=20 \
--location http://mirrors.aliyun.com/centos/7/os/x86_64/ \ # 网络安装
--network bridge=br0 \ # 桥接网络
--console pty,target_type=serial \
--extra-args 'console=ttyS0,115200n8 serial'

虚拟机管理命令

查看虚拟机

# 查看正在运行的虚拟机
virsh list

# 查看所有虚拟机(包括关闭的)
virsh list --all

# 输出示例:
# Id 名称 状态
# ----------------------------------------------------
# 1 centos7 running
# - centos7-test 关闭

虚拟机电源管理

# 开启虚拟机
virsh start centos7

# 重启虚拟机(正常重启)
virsh reboot centos7

# 关闭虚拟机(正常关机)
virsh shutdown centos7

# 强制关闭虚拟机(相当于断电)
virsh destroy centos7

# 挂起虚拟机
virsh suspend centos7

# 恢复挂起的虚拟机
virsh resume centos7
关机方式的区别
  • shutdown:发送ACPI关机信号,需要虚拟机内安装acpid服务
  • destroy:强制断电,可能导致数据丢失,仅在紧急情况下使用

虚拟机自动启动

# 设置虚拟机开机自启
virsh autostart centos7

# 取消开机自启
virsh autostart --disable centos7

# 查看哪些虚拟机设置了自动启动
ls -la /etc/libvirt/qemu/autostart/

虚拟机重命名

# 关机状态下重命名
virsh shutdown centos7
virsh domrename centos7 web-server

# 验证重命名结果
virsh list --all

虚拟机配置管理

查看配置信息

# 查看虚拟机配置(XML格式)
virsh dumpxml centos7

# 导出配置文件
virsh dumpxml centos7 > centos7.xml

# 查看特定信息
virsh dominfo centos7
virsh vcpuinfo centos7
virsh domblklist centos7
virsh domiflist centos7

编辑配置文件

最佳实践

使用virsh edit命令编辑配置,它会自动检查XML语法

# 编辑虚拟机配置
virsh edit centos7

# 常见修改项:
# - 内存大小:<memory>标签
# - CPU数量:<vcpu>标签
# - 磁盘路径:<source file=''>
# - 网络配置:<interface>标签

配置修改示例

修改磁盘文件路径:

# 1. 关闭虚拟机
virsh shutdown centos7

# 2. 编辑配置
virsh edit centos7
# 找到并修改:
# <source file='/opt/centos7.raw'/>
# 改为:
# <source file='/data/centos7.raw'/>

# 3. 移动磁盘文件
mv /opt/centos7.raw /data/

# 4. 启动虚拟机
virsh start centos7

虚拟机删除与恢复

删除虚拟机

# 完整删除虚拟机(配置+磁盘)
virsh destroy centos7 # 先强制关机
virsh undefine centos7 # 删除配置
rm -f /opt/centos7.raw # 删除磁盘文件

# 仅删除配置(保留磁盘)
virsh undefine centos7

# 删除并清理相关存储卷
virsh undefine centos7 --remove-all-storage

恢复虚拟机

通过配置文件和磁盘文件恢复:

# 从备份的XML文件恢复
virsh define centos7.xml

# 启动恢复的虚拟机
virsh start centos7

生产环境常见问题

案例:误删除运行中的虚拟机配置

生产故障案例

问题描述:在虚拟机运行状态下执行undefine命令,导致配置文件被删除,但虚拟机进程仍在运行。关机后虚拟机"消失"。

故障重现

# 虚拟机正在运行
virsh list --all
# Id 名称 状态
# 3 centos7 running

# 误操作:删除配置
virsh undefine centos7

# 虚拟机仍在运行,但配置已删除
virsh list --all
# Id 名称 状态
# 3 centos7 running

# 关机后虚拟机消失
virsh shutdown centos7
virsh list --all
# (空)

解决方案

  1. 如果虚拟机仍在运行,立即导出配置:
    virsh dumpxml centos7 > centos7-rescue.xml
  2. 如果已关机,需要手动创建配置文件或从备份恢复

最佳实践

  1. 定期备份配置
# 创建备份脚本
mkdir -p /backup/kvm/
for vm in $(virsh list --all --name); do
virsh dumpxml $vm > /backup/kvm/${vm}.xml
done
  1. 使用配置管理
# 使用Git管理虚拟机配置
cd /etc/libvirt/qemu/
git init
git add *.xml
git commit -m "Initial VM configs"
  1. 操作前确认状态
# 删除前检查虚拟机状态
virsh domstate centos7

批量管理技巧

批量操作脚本

# 批量关闭所有虚拟机
for vm in $(virsh list --name); do
echo "Shutting down $vm"
virsh shutdown $vm
done

# 批量启动特定前缀的虚拟机
for vm in $(virsh list --all --name | grep "^web-"); do
echo "Starting $vm"
virsh start $vm
done

# 批量删除测试虚拟机
for vm in $(virsh list --all --name | grep "test"); do
virsh destroy $vm 2>/dev/null
virsh undefine $vm
done

虚拟机信息统计

# 统计虚拟机资源使用
echo "VM Name | State | CPU | Memory"
echo "--------|-------|-----|--------"
for vm in $(virsh list --all --name); do
state=$(virsh domstate $vm)
if [ "$state" = "running" ]; then
info=$(virsh dominfo $vm)
cpu=$(echo "$info" | grep "CPU(s)" | awk '{print $2}')
mem=$(echo "$info" | grep "Used memory" | awk '{print $3,$4}')
echo "$vm | $state | $cpu | $mem"
else
echo "$vm | $state | - | -"
fi
done

总结

本章介绍了KVM虚拟机的创建和日常管理操作,包括:

  • ✅ 使用virt-install创建虚拟机
  • ✅ 虚拟机的启动、关闭、重启等电源管理
  • ✅ 配置文件的查看、导出和修改
  • ✅ 虚拟机的删除与恢复
  • ✅ 生产环境常见问题及解决方案
  • ✅ 批量管理技巧

下一章将介绍如何通过VNC和Console连接到KVM虚拟机。