跳到主要内容

第6章 KVM虚拟机克隆

虚拟机克隆是快速部署相同配置虚拟机的重要功能。KVM支持完整克隆和链接克隆两种方式,本章将详细介绍这两种克隆方法及其应用场景。

克隆概述

克隆类型对比

克隆类型特点优点缺点适用场景
完整克隆完全复制源虚拟机独立性强
性能不受影响
占用空间大
克隆速度慢
生产环境
独立部署
链接克隆基于源磁盘的差分磁盘节省空间
克隆速度快
依赖源磁盘
性能略低
开发测试
批量部署
注意事项

克隆前请确保:

  1. 源虚拟机已关机(避免数据不一致)
  2. 有足够的存储空间
  3. 了解网络配置冲突(MAC地址、IP地址)

完整克隆

完整克隆会创建源虚拟机的完整副本,包括磁盘和配置。

使用virt-clone命令

# 基本克隆命令
virt-clone --original centos7 --name centos7-clone --file /data/centos7-clone.qcow2

# 自动克隆(自动生成名称和磁盘路径)
virt-clone --original centos7 --auto-clone

# 克隆时指定多个磁盘
virt-clone --original web-server \
--name web-server-clone \
--file /data/web-clone-os.qcow2 \
--file /data/web-clone-data.qcow2

完整克隆步骤详解

  1. 关闭源虚拟机
# 确保源虚拟机已关闭
virsh shutdown centos7

# 等待关机完成
virsh list --all
  1. 执行克隆
# 克隆虚拟机
virt-clone --original centos7 --name centos7-backup --auto-clone

# 输出示例:
# WARNING 当卷已经被全部分配后,需要的卷容量将超过可用池空间。
# 正在分配 'centos7-clone.qcow2' | 10 GB 00:00:03
# 成功克隆 'centos7-backup'。
  1. 验证克隆结果
# 查看克隆的虚拟机
virsh list --all

# 查看磁盘文件
ls -lh /var/lib/libvirt/images/centos7*.qcow2

# 查看配置差异
virsh dumpxml centos7-backup | grep -E "(name|uuid|mac address|source file)"

克隆后的清理工作

重要步骤

克隆后需要修改以下配置避免冲突:

  1. 主机名
  2. IP地址
  3. SSH主机密钥
  4. 机器ID(machine-id)
# 启动克隆的虚拟机
virsh start centos7-backup

# 连接到虚拟机
virsh console centos7-backup

# 在虚拟机内执行:
# 1. 修改主机名
hostnamectl set-hostname centos7-backup

# 2. 修改IP地址(如果使用静态IP)
vi /etc/sysconfig/network-scripts/ifcfg-eth0

# 3. 重新生成SSH密钥
rm -f /etc/ssh/ssh_host_*
systemctl restart sshd

# 4. 重新生成machine-id
rm -f /etc/machine-id
systemd-machine-id-setup

# 5. 清理网络配置(RHEL/CentOS)
rm -f /etc/udev/rules.d/70-persistent-net.rules

链接克隆

链接克隆创建基于源磁盘的差分磁盘,只存储与源磁盘的差异部分。

创建链接克隆磁盘

# 创建基于backing file的qcow2磁盘
qemu-img create -f qcow2 -b /data/centos7.qcow2 -F qcow2 \
/data/centos7-linked1.qcow2

# 查看链接关系
qemu-img info /data/centos7-linked1.qcow2

# 输出示例:
# image: /data/centos7-linked1.qcow2
# file format: qcow2
# virtual size: 10G (10737418240 bytes)
# disk size: 196K
# backing file: /data/centos7.qcow2
# backing file format: qcow2

手动创建链接克隆虚拟机

  1. 创建差分磁盘
# 为多个克隆创建差分磁盘
for i in {1..3}; do
qemu-img create -f qcow2 -b /data/centos7.qcow2 -F qcow2 \
/data/centos7-linked${i}.qcow2
done
  1. 导出并修改配置文件
# 导出源虚拟机配置
virsh dumpxml centos7 > /tmp/centos7-linked.xml

# 编辑配置文件
vi /tmp/centos7-linked.xml

# 需要修改的内容:
# 1. <name>centos7-linked1</name>
# 2. 删除 <uuid> 行
# 3. 删除 <mac address> 行
# 4. 修改磁盘路径:
# <source file='/data/centos7-linked1.qcow2'/>
  1. 导入新虚拟机
# 定义新虚拟机
virsh define /tmp/centos7-linked.xml

# 启动虚拟机
virsh start centos7-linked1

链接克隆脚本

创建批量链接克隆的脚本:

#!/bin/bash
# link-clone.sh - 批量创建链接克隆

SOURCE_VM="centos7"
SOURCE_DISK="/data/centos7.qcow2"
CLONE_PREFIX="lab"
CLONE_COUNT=5

# 检查源虚拟机状态
if virsh domstate $SOURCE_VM 2>/dev/null | grep -q "running"; then
echo "错误:源虚拟机正在运行,请先关闭"
exit 1
fi

# 导出源配置
virsh dumpxml $SOURCE_VM > /tmp/source.xml

for i in $(seq 1 $CLONE_COUNT); do
CLONE_NAME="${CLONE_PREFIX}${i}"
CLONE_DISK="/data/${CLONE_NAME}.qcow2"

echo "创建克隆: $CLONE_NAME"

# 创建差分磁盘
qemu-img create -f qcow2 -b $SOURCE_DISK -F qcow2 $CLONE_DISK

# 修改配置
sed -e "s/<name>.*<\/name>/<name>$CLONE_NAME<\/name>/" \
-e "/<uuid>/d" \
-e "/<mac address/d" \
-e "s|<source file='.*'/>|<source file='$CLONE_DISK'/>|" \
/tmp/source.xml > /tmp/${CLONE_NAME}.xml

# 导入虚拟机
virsh define /tmp/${CLONE_NAME}.xml

# 启动虚拟机(可选)
# virsh start $CLONE_NAME
done

echo "完成!创建了 $CLONE_COUNT 个链接克隆"

高级克隆技术

使用快照作为克隆基础

# 创建只读快照作为模板
virsh snapshot-create-as centos7 --name template \
--disk-only --diskspec vda,file=/data/template.qcow2

# 基于快照创建克隆
qemu-img create -f qcow2 -b /data/template.qcow2 -F qcow2 \
/data/clone1.qcow2

克隆池管理

最佳实践

对于大规模部署,建议创建专门的克隆池来管理模板和克隆

# 创建模板存储池
virsh pool-define-as templates dir - - - - "/data/templates"
virsh pool-start templates
virsh pool-autostart templates

# 创建克隆存储池
virsh pool-define-as clones dir - - - - "/data/clones"
virsh pool-start clones
virsh pool-autostart clones

模板制作最佳实践

  1. 系统优化
# 清理软件包缓存
yum clean all

# 清理日志
find /var/log -type f -exec truncate -s 0 {} \;

# 清理临时文件
rm -rf /tmp/* /var/tmp/*

# 清理历史记录
history -c
> ~/.bash_history
  1. 通用化配置
# 安装cloud-init(推荐)
yum install -y cloud-init

# 或手动创建初始化脚本
cat > /etc/rc.d/init.d/vm-init << 'EOF'
#!/bin/bash
# 首次启动时执行
if [ ! -f /etc/vm-initialized ]; then
# 重新生成SSH密钥
rm -f /etc/ssh/ssh_host_*
ssh-keygen -A

# 设置随机主机名
hostnamectl set-hostname vm-$(openssl rand -hex 4)

# 标记已初始化
touch /etc/vm-initialized
fi
EOF

chmod +x /etc/rc.d/init.d/vm-init
  1. 磁盘压缩
# 在虚拟机内填充零数据
dd if=/dev/zero of=/zero bs=1M
rm -f /zero

# 关机后压缩磁盘
qemu-img convert -c -O qcow2 source.qcow2 template.qcow2

克隆管理工具

图形化管理

使用virt-manager进行克隆:

  1. 右键点击虚拟机 → "克隆"
  2. 设置新名称
  3. 选择存储选项
  4. 点击"克隆"

命令行批量管理

# 列出所有克隆(假设使用特定前缀)
virsh list --all | grep "^lab"

# 批量启动克隆
for vm in $(virsh list --all --name | grep "^lab"); do
virsh start $vm
done

# 批量删除克隆
for vm in $(virsh list --all --name | grep "^lab"); do
virsh destroy $vm 2>/dev/null
virsh undefine $vm --remove-all-storage
done

故障排查

常见问题

  1. 磁盘空间不足
# 检查存储池使用情况
virsh pool-info default

# 清理未使用的磁盘
virsh vol-list default
  1. 链接克隆性能问题
# 将链接克隆转换为完整克隆
qemu-img convert linked.qcow2 full.qcow2

# 或使用blockcommit合并
virsh blockcommit vm vda --active --pivot
  1. backing file丢失
# 修改backing file路径
qemu-img rebase -u -b /new/path/backing.qcow2 linked.qcow2

# 检查并修复
qemu-img check linked.qcow2

克隆验证清单

克隆后检查项
  • 虚拟机能正常启动
  • 网络连接正常(IP不冲突)
  • 主机名已修改
  • SSH可以正常连接
  • 应用服务运行正常
  • 磁盘空间使用合理

总结

本章详细介绍了KVM虚拟机克隆技术:

  • ✅ 完整克隆的创建和管理
  • ✅ 链接克隆的原理和实现
  • ✅ 批量克隆脚本和自动化
  • ✅ 模板制作最佳实践
  • ✅ 克隆后的配置清理
  • ✅ 常见问题及解决方案

虚拟机克隆大大提高了虚拟机部署效率,合理使用克隆技术可以快速构建测试环境和生产集群。下一章将介绍KVM网络管理。