前言

在日常运维工作中,经常需要批量创建相同配置的虚拟机。如果每次都手动安装系统、配置环境,效率低下且容易出错。虚拟机模板镜像就是为了解决这个问题而生的——将配置好的虚拟机保存为模板,后续可以快速克隆出大量相同配置的虚拟机。

本文将以 Rocky Linux 9 为例,详细介绍如何使用 CLup IaaS 平台 制作 KVM 虚拟机模板镜像。

适用场景

  • 批量部署相同配置的业务服务器
  • 标准化开发/测试环境
  • 快速扩容和故障恢复

一、虚拟机技术简介

1.1 常见的虚拟化类型

在深入 KVM 之前,先了解一下常见的虚拟化技术类型:

类型 代表技术 隔离级别 性能 典型场景
全虚拟化 KVM、VMware ESXi、Hyper-V 硬件级隔离 接近原生 服务器虚拟化、云计算
半虚拟化 Xen PV 操作系统级 较好 早期云计算(已少见)
容器虚拟化 Docker、LXC 内核级 接近原生 应用隔离、微服务
操作系统级虚拟化 OpenVZ、FreeBSD Jails 内核级 接近原生 VPS 主机

1.2 KVM 与其他方案对比

KVM vs VMware ESXi

对比项 KVM VMware ESXi
开源程度 完全开源 闭源商业软件
成本 免费 付费(有免费版但功能受限)
管理 libvirt、多种管理工具 vCenter(需额外授权)
生态 Linux 原生集成 完善的企业生态
适用场景 开源环境、自建云平台 企业级虚拟化(已购买授权)

KVM vs 容器(Docker/LXC)

对比项 KVM 虚拟机 容器
隔离性 完全隔离(独立内核) 进程级隔离(共享内核)
安全性 相对较低
性能损耗 2%-5% <2%
系统要求 可运行不同操作系统 必须相同内核
适用场景 完整服务器、多租户 应用部署、微服务

什么时候选择 KVM?

  • 需要运行完整的操作系统
  • 需要运行不同类型的 Linux 发行版
  • 对隔离性和安全性要求高
  • 需要运行 Windows 虚拟机
  • 多租户环境

什么时候选择容器?

  • 应用部署和服务编排
  • 资源利用率优先
  • 快速启停和扩展
  • 微服务架构
提示:CLup 平台同时支持 KVM 虚拟机和 LXC 容器,可以根据实际需求灵活选择。

1.3 KVM 的优势

KVM(Kernel-based Virtual Machine)是 Linux 内核的原生虚拟化解决方案,具有以下优势:

  • 性能优异:接近物理机的性能,经过 virtio 驱动优化后损耗极小
  • 生态成熟:Linux 原生支持,配合 libvirt 管理非常方便
  • 完全开源:无许可成本,无厂商锁定
  • 功能丰富:支持热迁移、快照、动态资源调整
  • 社区活跃:Red Hat、Canonical 等大厂大力支持

二、准备工作

2.1 环境检查

在开始之前,确保宿主机支持 KVM 虚拟化:

# 检查 CPU 是否支持虚拟化
lscpu | grep Virtualization

# 应该输出类似:Virtualization: VT-x (Intel) 或 AMD-V (AMD)

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

# 应该看到 kvm_intel 或 kvm_amd

2.2 工具准备

2.3 CLup 平台简介

官网地址:CLup6.x产品手册:CLup简介
CLup 是一套自研的 KVM/LXC IaaS 与数据库 PaaS 管理平台,提供了可视化的虚拟机管理界面,支持:

  • 虚拟机生命周期管理(创建、启动、停止、删除)
  • 镜像和模板管理
  • 存储池和网络配置
  • 虚拟机监控和资源统计
  • 多种数据库管理(集群管理、监控告警、备份恢复等)

相比纯命令行操作,CLup 大大降低了 KVM 的使用门槛。

2.4 宿主机环境准备

需要一台安装了clup-agent的机器作为宿主机。宿主机上需要创建好存储池的目录和安装必要的依赖。我当前的机器安装的是Ubuntu2404的操作系统。
安装依赖

# KVM 虚拟机管理
apt install -y libvirt qemu-kvm qemu-img virt-manager virt-viewer virt-install libguestfs

# LXC 容器
apt install -y lxc lxc-templates

检查一下,执行命令不报错即可

virsh list

lxc-ls

磁盘准备,最好是将虚拟机放到单独的一块盘中,如果要用zfs存储池(不过社区版不支持),则还需要一块盘

# 我这里的磁盘是挂载过来的100GB,将其格式化为xfs
# 如果报错,需要安装xfsprogs
mkfs.xfs /dev/sdx

mkdir /vms
# 这里默认的isoimg存储池是/isoimg,修改了一下,直接放到/vms里面,对应的需要再界面上也修改一下
mkdir /vms/isoimg

# 查看磁盘的UUID,将其配置到/etc/fstab中,让机器启动就挂载上
blkid |grep sdx

# 复制sdx的UUID,然后编辑/etc/fstab,增加一行
UUID=xxxx /vms  xfs     defaults 0 0 

# reload一下然后挂载
systemctl daemon-reload && mount -a

# 检查一下
df -h
注意:这里的sdx是占位符,要替换成自己实际的磁盘符。

2.5 配置宿主机和IP地址范围

可以将安装了clup-agent的机器设置KVM虚拟机宿主机和LXC宿主机。


还需要将网络改为桥接模式,不过这里有时候好像没有成功。

如果没有成功的话,就手动配置一下吧(注意: 此操作可会导致网络中断,应该在能直连服务器或有管理端能直接登录服务器的情况下操作)

# 创建一个网桥
nmcli con add type bridge con-name br0 ifname br0

# 查看物理网卡,如果网卡名称不是简称,可以使用nmtui修改一下
nmcli conn show

# 将物理网卡加入到网桥中,注意替换实际的网卡名
nmcli conn modify ens3 master br0

# 根据自己的环境实际情况,选择固定网桥的mac地址,我这里的DHCP服务器是有一定的匹配规则的
nmcli conn modify br0 ethernet.cloned-mac-address 52:54:00:xx:xx:xx

重启网络,等待一会检查网络是否正常

nmcli networking off && nmcli networking on

设置IP范围

前面我们将isoimg存储池放到了/vms下面了,所以这里也需要修改一下:


三、虚拟机磁盘格式对比

KVM 虚拟机磁盘常用的两种格式是 rawqcow2,它们各有特点:

3.1 格式对比

特性 raw qcow2
性能 最快,接近物理磁盘 稍慢,但 virtio 优化后差异很小
空间占用 立即分配全部空间 精简配置,按需分配
快照支持 不支持(依赖文件系统) 原生支持快照
压缩/加密 不支持 支持
兼容性 通用性好 QEMU 特有

3.2 推荐场景

  • raw 格式:对性能要求极高的场景(建议在没有特殊极限 I/O 性能要求的情况下,首选 qcow2 格式)
  • qcow2 格式:推荐使用,功能丰富且节省空间

3.3 创建命令示例

# 创建 raw 格式磁盘(立即分配 20G)
qemu-img create -f raw /var/lib/libvirt/images/rocky9.raw 20G

# 创建 qcow2 格式磁盘(精简配置,最大 20G)
qemu-img create -f qcow2 /var/lib/libvirt/images/rocky9.qcow2 20G

在 CLup 中创建虚拟机时,平台会自动处理磁盘创建,默认使用 qcow2 格式。


四、使用 CLup 创建虚拟机并安装系统

4.1 上传 ISO 镜像

  1. 登录 CLup 管理平台
  2. 进入 IaaS 平台ISO镜像管理上传
  3. 点击 上传,选择本地的 Rocky Linux 9 ISO 文件
  4. 等待上传完成

4.2 配置模板

默认的模板好像不会无法分配宿主机,只能新建一个模板,选择宿主机了。复制下ISO默认模板的xml配置,然后点击“增加”。


4.3 创建虚拟机

  1. 进入 IaaS 平台主机管理
  2. 点击 创建KVM虚拟机,选择“从iso光盘镜像文件安装”,然后填写基本信息:
    | 配置项 | 推荐值 | 说明 |
    |--------|--------|------|
    | 虚拟机名称 | Rocky97-Base | 用于标识模板用途 |
    | CPU | 4 核 | 根据实际需求调整 |
    | 内存 | 4 GB | 最小 2GB |
    | 磁盘 | 20-50 GB | qcow2 格式 |
  3. 选择 Rocky Linux 9 ISO 作为启动介质
  4. 点击 创建,等待虚拟机启动

4.4 控制台安装系统

CLup 自带有WebVNC,可以直接登录到主机。

  1. 在主机管理列表中,点击 登录 进入安装界面
  2. 按照 Rocky Linux 9 安装向导完成安装:
    • 选择语言(建议英文)
    • 安装目的地:选择虚拟磁盘
    • 网络配置:可暂不配置,后续优化时统一处理
    • root 密码:设置强密码并记录
    • 创建普通用户(可选)

3. 安装完成后点击 重启
安装建议:
选择安装位置时,可以选择自定义

4. 然后这样可以自定分区,只配置一个/boot分区即可,根据自身需要可选配置swap分区

4.5 安装完成验证

重启后,再次通过 VNC 登录系统,确认:

# 检查系统版本
cat /etc/redhat-release
# Rocky Linux release 9.x (xxx)

# 检查内核版本
uname -r

五、系统基础优化

模板镜像需要在克隆后直接可用,因此需要进行一系列基础优化,这样以后可以快速创建,而不需要在创建后再去配置。

5.1 主机名配置

设置默认主机名:

# 设置临时主机名
hostnamectl set-hostname Rocky9-Base

# 编辑 hosts 文件
vi /etc/hosts

# 添加:
127.0.0.1   localhost localhost.localdomain
::1         localhost localhost.localdomain

5.2 时区和时间同步

# 设置时区为上海
timedatectl set-timezone Asia/Shanghai

# 安装并启用 chrony
dnf install -y chrony
systemctl enable --now chronyd

# 验证时间同步
chronyc sources -v

5.3 SELinux 配置

SELinux 是 Linux 的安全增强机制,可以先设置为disabled,否则后续会踩很多坑,真实的生产环境根据需要再配置:

# 查看当前状态
getenforce

# 永久修改配置
vi /etc/selinux/config

# 修改:
SELINUX=disabled

5.4 防火墙基础设置

# 检查防火墙状态
systemctl status firewalld

# 这里我们先直接关闭,后续有需要再配置
systemctl disable --now firewalld

5.5 SSH 优化

# 备份配置文件
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑 SSH 配置
vi /etc/ssh/sshd_config

# 推荐修改:
PermitRootLogin yes          # 允许 root 登录(生产环境建议 no)
PasswordAuthentication yes   # 允许密码登录(建议配置密钥后改为 no)
PubkeyAuthentication yes     # 启用密钥登录
UseDNS no                    # 加快登录速度

# 重启 SSH 服务
systemctl restart sshd

5.6 禁用不必要的服务

# 查看所有服务
systemctl list-unit-files --type=service

# 禁用不需要的服务(示例)
systemctl disable --now postfix     # 如果不需要邮件服务

5.7 清理系统

为减小模板体积,清理不必要的文件:

# 清理缓存
dnf clean all

# 清理日志
journalctl --vacuum-time=1d

# 清理命令历史
> /root/.bash_history
history -c

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

六、使用 CLup 制作和管理模板

6.1 在 CLup 中保存为模板

  1. 确认虚拟机已关机,记住主机ID
  2. 在“模板管理”中点击”把虚拟机拷贝成模板“,输入主机ID和模板名称即可

6.2 使用模板创建新虚拟机

  1. 进入 主机管理
  2. 点击创建KVM虚拟机-> 从已有的普通模板中创建
  3. 选择 Rocky9-Base 模板
  4. 配置新虚拟机参数(CPU、内存、网络等)
  5. 点击 创建,等待克隆完成

6.3 验证模板

默认创建成功后启动克隆出的虚拟机,点击登录查看虚拟机是否启动成功。

如果以上检查都通过,说明模板制作成功。


七、常见问题

CLup 操作常见错误

问题:虚拟机网络没有自动分配
解决:

  1. 检查clup-dhcpd服务
  2. 执行./clup-dhcpd start -f,前台运行,查看报错,如果是权限问题,需要在root下执行setcap 'cap_net_bind_service=+ep' /home/clup/clup-server/bin/clup-dhcpd并重启服务(好像没法直接stop,需要kill -9 pid)

问题:VNC 控制台无法连接
解决

  1. 检查虚拟机是否处于运行状态
  2. 检查宿主机防火墙是否放行 VNC 端口(5900+)
  3. 尝试刷新页面或重新打开控制台
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐