服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-11-06 简米科技 3,849 字 9 分钟阅读

脚本安装虚拟机具体步骤是怎样的,虚拟机脚本安装教程怎么操作?

导读先检查宿主机虚拟化环境并准备好系统镜像和无人值守配置文件,然后编写调用virt-install等命令的批量脚本,最后执行脚本并验证虚拟机状态, 下面我把整个流程拆开,每一步都配上可以直接用的命令和思路,照着走就能搞定,脚本安装虚拟机前需要做哪些准备?写脚本之前,环境没弄好,后面跑起来全是坑,这个阶段主要做三件事……

先检查宿主机虚拟化环境并准备好系统镜像和无人值守配置文件,然后编写调用virt-install等命令的批量脚本,最后执行脚本并验证虚拟机状态。 下面我把整个流程拆开,每一步都配上可以直接用的命令和思路,照着走就能搞定。

脚本安装虚拟机前需要做哪些准备?

写脚本之前,环境没弄好,后面跑起来全是坑,这个阶段主要做三件事:确认宿主机支持虚拟化、装好依赖工具、把镜像和配置文件准备到位。

检查宿主机虚拟化环境

虚拟化不是默认开启的,先确认CPU支持并已启用硬件虚拟化,执行下面命令,有输出就代表支持:

grep -E -o 'vmx|svm' /proc/cpuinfo

Intel处理器显示vmx,AMD处理器显示svm,如果没有输出,需要进BIOS开启虚拟化功能,否则后续脚本会直接报错。

接着检查libvirt服务是否正常运行,KVM、QEMU这套虚拟化栈,多数情况下都靠libvirt统一管理:

systemctl status libvirtd

如果没启动,先启动并设为开机自启:

systemctl enable --now libvirtd

然后确认必备软件都装了,不同发行版包名略有差别,以CentOS/RHEL系为例,需要这几个核心包:

dnf install -y qemu-kvm libvirt-daemon virt-install

准备镜像和无人值守配置文件

脚本安装虚拟机一般有两种镜像选择:一种是完整ISO镜像,配合kickstart自动应答文件;另一种是云镜像,配合cloud-init做初始化配置,对于批量部署,云镜像体积小、启动快,更适合脚本化。

用qemu-img创建虚拟机的磁盘文件,比如每台机器给一个20G的qcow2格式磁盘:

qemu-img create -f qcow2 /images/web1.qcow2 20G

qcow2格式支持按需分配,不会立刻占满宿主机空间,这也是行业共识认为比较稳妥的做法。

同时准备一个kickstart文件,比如ks.cfg,里面定义好root密码、分区方案、软件包选择等,脚本安装时通过--initrd-inject参数把它注入到虚拟机中。

设计脚本参数与目录规划

批量创建虚拟机之前,先把参数设计好,名称、内存、CPU、磁盘路径、网络这些最好用变量控制,不要写死在命令里。

建议的目录结构:

  • /images/ 存放虚拟机磁盘镜像
  • /ks/ 存放kickstart配置
  • /iso/ 存放系统ISO镜像
  • /scripts/ 存放批量创建脚本

这样脚本里引用路径清晰,后续维护也不容易晕。

shell脚本批量创建虚拟机怎么操作?

准备就绪后,开始写核心脚本,这里给出一份可运行的shell脚本,你按需改参数就能用。

编写批量创建脚本的核心逻辑

脚本的核心逻辑是用循环遍历虚拟机列表,每台虚拟机调用一次virt-install命令,virt-install是libvirt自带的命令行工具,支持无人值守安装。

关键参数说明:

  • --name:虚拟机名称
  • --memory:内存大小,单位MB
  • --vcpus:CPU核心数
  • --disk:磁盘路径和大小
  • --location:安装源位置,可以指ISO或网络URL
  • --extra-args:传递给内核的参数,比如指定kickstart文件
  • --initrd-inject:把本地文件注入到虚拟机的initrd中
  • --graphics none:不启用图形界面,适合纯命令行环境
  • --noautoconsole:安装完成后不自动连入控制台

一份可运行的脚本示例

#!/bin/bash
# 批量创建虚拟机脚本
VM_LIST=("web1" "web2" "web3")
MEM_SIZE=2048
VCPU_NUM=2
DISK_SIZE=20
for vm in "${VM_LIST[@]}"; do
  echo "正在创建虚拟机:$vm"
  qemu-img create -f qcow2 /images/$vm.qcow2 ${DISK_SIZE}G
  virt-install \
    --name $vm \
    --memory $MEM_SIZE \
    --vcpus $VCPU_NUM \
    --disk path=/images/$vm.qcow2,format=qcow2 \
    --location /iso/CentOS-7.iso \
    --extra-args "ks=file:/ks.cfg" \
    --initrd-inject /ks/ks.cfg \
    --network network=default \
    --graphics none \
    --noautoconsole
  # 每台间隔20秒,避免并发过高导致宿主机资源耗尽
  sleep 20
done
echo "所有虚拟机创建任务已提交"

脚本里用了一个数组VM_LIST,你改成自己的机器名就行,注意sleep 20是给上一台虚拟机留出系统初始化时间,避免同时启动太多虚拟机导致内存分配失败。

执行脚本和验证安装结果

执行前先给脚本加执行权限:

chmod +x /scripts/create_vms.sh

有两种方式运行:

  • 前台执行,看完整输出:/scripts/create_vms.sh
  • 后台执行,退出终端也不影响:nohup /scripts/create_vms.sh > /logs/create_vms.log 2>&1 &

后台方式适合创建大批量虚拟机,日志重定向方便回查。

等脚本跑完,用virsh命令验证:

virsh list --all

看到虚拟机状态是shut off就说明创建成功,然后用下面命令进入控制台:

virsh console web1

如果安装过程中没有报错,会看到系统正在自动安装,安装完成后会自动重启。

用表格对比脚本安装与手动安装

对比维度 脚本安装 手动安装
操作效率 一次性创建多台 一台一台点鼠标
重复性 参数改一次,反复用 每次操作都要重新点
出错率 配置统一,不易漏 人为操作容易漏参数
适用场景 批量部署、测试环境 单台特殊配置

脚本安装虚拟机遇到报错怎么排查?

脚本跑不起来或者虚拟机起不来,别慌,按下面几个方向逐个查。

安装源无法访问的常见原因

virt-install的--location参数指向ISO路径,最常见的报错是找不到镜像,先确认路径存在,并且文件有读权限。

如果ISO在远程服务器上,比如通过HTTP访问,要提前把安装源部署到本地web目录,业界更推荐的做法是用云镜像,直接从本地qcow2文件启动,完全避开安装源问题。

虚拟机启动后网络不通怎么处理

网络不通,十有八九是虚拟机的网络配置没跟上,先检查宿主机上的默认网卡:

virsh net-list

确保default网络是active状态,如果是kickstart安装,检查ks.cfg里的network段有没有正确配置IP和掩码。

批量创建时,IP很容易冲突,建议用DHCP地址池,或者通过cloud-init给每台虚拟机下发固定IP,脚本里按顺序分配IP即可。

批量执行时出现资源冲突

同时创建太多虚拟机会导致“cannot allocate memory”之类的错误,这时候减少并发数,比如在脚本里加一个计数器,每创建3台虚拟机sleep更长的时间,另外确认宿主机内存和CPU核数是否足够,用free -h和nproc查看。

如果已经创建一半失败,可以先用virsh undefine清理掉残留定义,再重新执行脚本。

脚本安装虚拟机常见问题解答

问:脚本安装虚拟机时如何指定内存和CPU大小?

通过virt-install命令的--memory和--vcpus参数控制,在批量脚本中,可以把这些值定义为变量,比如MEM_SIZE=4096,VCPU_NUM=4,这样不同批次只需要改变量值,不用改整段命令。

问:批量创建虚拟机时如何避免IP冲突?

最稳妥的方式是使用cloud-init或kickstart的网络配置段,事先规划好IP分配表,比如每台虚拟机名称对应一个固定IP,在脚本循环中通过关联数组将IP传给配置文件,如果使用DHCP,则需要确保DHCP地址池足够大,不会重复分配原有地址。

问:脚本安装虚拟机后怎么自动执行后续的初始化命令?

kickstart文件的%post段可以写入任意shell命令,比如配置源、安装软件、启动服务,cloud-init则通过runcmd模块实现同样的效果,这些命令会在系统首次启动时自动执行,无需手动登录操作。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱