第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 |
--cdrom | ISO镜像路径 | /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
# (空)
解决方案:
- 如果虚拟机仍在运行,立即导出配置:
virsh dumpxml centos7 > centos7-rescue.xml
- 如果已关机,需要手动创建配置文件或从备份恢复
最佳实践
- 定期备份配置
# 创建备份脚本
mkdir -p /backup/kvm/
for vm in $(virsh list --all --name); do
virsh dumpxml $vm > /backup/kvm/${vm}.xml
done
- 使用配置管理
# 使用Git管理虚拟机配置
cd /etc/libvirt/qemu/
git init
git add *.xml
git commit -m "Initial VM configs"
- 操作前确认状态
# 删除前检查虚拟机状态
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虚拟机。