siliconflow/vm_deploy
Shell
Captured source
source ↗siliconflow/vm_deploy
Language: Shell
Stars: 0
Forks: 0
Open issues: 0
Created: 2026-09-23T03:52:31Z
Pushed: 2026-09-23T04:04:26Z
Default branch: main
Fork: no
Archived: no
README:
vm_deploy — KVM 虚拟机一键部署工具
基于 KVM/libvirt + cloud-init 批量部署虚拟机,支持麒麟 V10 和 Ubuntu 22.04,自动完成静态 IP、SSH 免密、hosts 解析、根分区扩容等初始化配置。
功能特性
- 批量创建多台 VM,名称、CPU、内存、磁盘、MAC、IP 均可独立配置
- 支持麒麟 V10、Ubuntu 22.04 两类基础镜像
- cloud-init 初始化主机名、时区、用户、SSH 公钥、静态网络
- libvirt
defaultNAT 网络绑定 MAC/IP,保证地址稳定 - 自动配置宿主机 root 与本地普通用户 SSH 免密别名
- 自动写入
/etc/hosts,生成机器/IP 清单 - 首次启动自动扩展根分区到配置的磁盘容量
- 支持查看状态、批量启动/停止、一键销毁
目录结构
vm_deploy/ ├── README.md ├── .gitignore ├── vm_deploy.env # 部署配置 ├── vm_deploy.sh # 主脚本:部署/状态/SSH 配置/销毁 ├── start_vms.sh # 启动所有 libvirt VM ├── stop_vms.sh # 优雅关闭所有 libvirt VM ├── kvm_usage.md # virsh 常用命令速查 └── gen_qcow2/ ├── install_kylin_template.sh # 使用麒麟 ISO 制作 qcow2 模板 ├── input_iso/ # 放置本地 ISO(不入库) └── output_qcow2/ # 输出 qcow2 模板(不入库)
> ISO、qcow2、img 等大文件已通过 .gitignore 排除,请不要直接提交到仓库。
前置要求
- Linux 宿主机,建议 Ubuntu/Debian
- 使用 root 运行脚本
- BIOS/宿主机已开启硬件虚拟化,且存在
/dev/kvm - 可访问 libvirt
qemu:///system - 依赖命令:
qemu-kvm、libvirt-daemon-system、libvirt-clients、virtinst、cloud-image-utils、genisoimage
主部署脚本会在缺少 virt-install 时尝试通过 apt-get 自动安装依赖。
配置说明
编辑 vm_deploy.env:
MACHINE_NAMES=("machine1" "machine2")
MACHINE_CPU=(5 5)
MACHINE_MEM_MBS=(30720 30720)
DISK_GB=(50 50)
MACHINE_MACS=("52:54:00:12:34:38" "52:54:00:12:34:39")
MACHINE_IPS=("192.168.122.38" "192.168.122.39")
SSH_KEY="/root/.ssh/id_rsa"
POOL_DIR="/data/kvm/images"
WORK_DIR="$POOL_DIR/seeds"
NET_GW="192.168.122.1"
KYLIN_IMG_FILE="/data/vm_deploy/gen_qcow2/output_qcow2/kylin-v10-base.qcow2"数组配置必须一一对应,长度保持一致:
| 变量 | 说明 | |------|------| | MACHINE_NAMES | VM 名称列表,数组长度决定部署数量 | | MACHINE_CPU | 每台 VM 的 vCPU 数 | | MACHINE_MEM_MBS | 每台 VM 的内存,单位 MB | | DISK_GB | 每台 VM 的磁盘容量,单位 GB | | MACHINE_MACS | 每台 VM 的 MAC 地址 | | MACHINE_IPS | 每台 VM 的静态 IP | | SSH_KEY | 用于免密登录 VM 的 SSH 私钥 | | POOL_DIR | VM 磁盘镜像存放目录 | | WORK_DIR | cloud-init seed 文件存放目录 | | NET_GW | libvirt default 网络网关 | | KYLIN_IMG_FILE | 本地麒麟 qcow2 基础镜像路径 |
使用方法
# 默认部署麒麟 V10 sudo ./vm_deploy.sh # 显式指定镜像 sudo ./vm_deploy.sh deploy kylin-v10 sudo ./vm_deploy.sh deploy ubuntu # 查看配置中 VM 的部署状态 sudo ./vm_deploy.sh status # 仅配置 SSH 免密别名 sudo ./vm_deploy.sh ssh-config # 销毁配置中的全部 VM(需输入 yes 确认) sudo ./vm_deploy.sh destroy # 启动/停止当前 libvirt 中的全部 VM sudo ./start_vms.sh sudo ./stop_vms.sh
部署完成后可直接登录:
ssh machine1 ssh root@192.168.122.38
机器/IP 清单会写入项目上级目录的 machine_and_ip_list.txt。
镜像准备
方式一:使用已有 qcow2 镜像
将 KYLIN_IMG_FILE 配置为本地 qcow2 路径:
KYLIN_IMG_FILE=/path/to/kylin-v10-base.qcow2 sudo ./vm_deploy.sh deploy kylin-v10
方式二:在线下载基础镜像
不配置 KYLIN_IMG_FILE 时,脚本会尝试下载麒麟官方 cloud image。Ubuntu 会优先使用清华镜像源,失败后回退到 Ubuntu 官方源。
方式三:用麒麟 ISO 制作模板
将麒麟安装 ISO 放入 gen_qcow2/input_iso/,或通过 ISO_FILE 指定路径,然后执行:
cd gen_qcow2 sudo ISO_FILE=input_iso/Kylin-Server-V10-SP3-2403-Release-20240426-X86_64.iso \ FINAL_IMAGE=output_qcow2/kylin-v10-base.qcow2 \ ./install_kylin_template.sh
生成的 qcow2 模板可配置到 KYLIN_IMG_FILE 后用于部署。
大文件与 Git 忽略规则
以下文件默认不入库:
*.iso、*.qcow2、*.img、*.raw、*.vmdk、*.vdigen_qcow2/input_iso/下的安装介质gen_qcow2/output_qcow2/下的镜像模板- cloud-init 生成的
user-data、meta-data、network-config、seed.iso - 下载临时文件、日志和本地环境文件
如果大文件已经被 Git 跟踪,需要先从索引中移除但保留本地文件:
git rm --cached path/to/file.iso git rm --cached path/to/file.qcow2
网络说明
- VM 使用 libvirt
defaultNAT 网络,默认网段为192.168.122.0/24 - 脚本通过
virsh net-update写入 DHCP host,按 MAC 固定 IP - VM 内网卡通过 cloud-init 按 MAC 匹配并命名为
ens3 - 默认 DNS:
223.5.5.5、114.114.114.114
常用运维
# 查看所有 VM virsh list --all # 查看单台 VM 状态 virsh domstate machine1 # 进入控制台 virsh console machine1 # 强制关闭单台 VM virsh destroy machine1
更多命令见 kvm_usage.md。
注意事项
destroy会停止并删除配置中的 VM 及关联存储,执行前请确认数据已备份- VM 名称、MAC、IP 不要与现有 libvirt 资源冲突
- 修改数组配置后,运行部署前请确认所有数组长度一致
- 麒麟 VM 的自动扩容逻辑依赖模板中的 LVM 根分区布局