Skip to content

worker-vm1 虚拟机创建文档

虚拟机配置

项目配置
名称worker-vm1
CPU / 内存16 核 / 32G
磁盘200G(qcow2,根分区已自动扩展)
存储路径/kvm/lib/libvirt/kvm/worker/worker-vm1.qcow2
操作系统Rocky 9(GenericCloud 云镜像)
网络default NAT(virbr0),已开通外网
IP 地址192.168.122.138
登录用户 / 密码xxx / ai-ear.cn

创建步骤

1. 创建磁盘

bash
STORAGE_DIR=/kvm/lib/libvirt/kvm/worker
VM=worker-vm1
TEMPLATE=/kvm/lib/libvirt/kvm/Rocky-9-GenericCloud-Base.latest.x86_64.qcow2

mkdir -p "$STORAGE_DIR"
qemu-img convert -O qcow2 "$TEMPLATE" "$STORAGE_DIR/${VM}.qcow2"
qemu-img resize "$STORAGE_DIR/${VM}.qcow2" 200G

2. 生成 cloud-init 配置 ISO

bash
CI_DIR="$STORAGE_DIR/cloud-init-$VM"
rm -rf "$CI_DIR"
mkdir -p "$CI_DIR"

cat > "$CI_DIR/meta-data" <<EOF
instance-id: ${VM}-$(date +%s)
local-hostname: ${VM}
EOF

cat > "$CI_DIR/user-data" <<EOF
#cloud-config
chpasswd:
  list: |
    root:ai-ear.cn
  expire: false
ssh_pwauth: true
disable_root: false
users: []

growpart:
  mode: auto
  devices: ['/']
resize_rootfs: true

runcmd:
  - sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
  - systemctl restart sshd
EOF

mkisofs -output "$STORAGE_DIR/${VM}-cidata.iso" -volid cidata -joliet -rock \
    "$CI_DIR/user-data" "$CI_DIR/meta-data"
rm -rf "$CI_DIR"

3. 创建并启动虚拟机

bash
virt-install \
  --name worker-vm1 \
  --vcpus 16 \
  --memory 32768 \
  --disk path=/kvm/lib/libvirt/kvm/worker/worker-vm1.qcow2,format=qcow2,bus=virtio,cache=none \
  --disk path=/kvm/lib/libvirt/kvm/worker/worker-vm1-cidata.iso,device=cdrom,bus=sata \
  --network network=default,model=virtio \
  --os-variant rocky9 \
  --import \
  --noautoconsole \
  --graphics vnc,listen=0.0.0.0 \
  --virt-type kvm

外网验证

虚拟机启动后获取 IP:192.168.122.138

执行以下命令确认外网连通:

bash
ssh root@192.168.122.138
ping -c 2 223.5.5.5
curl -I https://www.baidu.com
curl -I http://mirrors.aliyun.com

验证结果:

  • ping 223.5.5.5 ✅ 通
  • curl https://www.baidu.com ✅ HTTP/1.1 200 OK
  • curl mirrors.aliyun.com ✅ 可达

故障处理:virbr0 网段无外网

排查时发现宿主机缺少 192.168.122.0/24 的 NAT 伪装规则,导致所有 default 网络虚拟机无法上外网。已手工补上:

bash
sudo iptables -t nat -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE

⚠️ 注意:手工规则在宿主机重启后会失效。如果重启后外网不通,执行:

bash
sudo virsh net-destroy default
sudo virsh net-start default

这会重新生成 libvirt 默认网络规则,但会短暂影响该网络上的其他运行虚拟机。

常用管理命令

bash
virsh list --all                # 列出所有虚拟机
virsh start worker-vm1          # 开机
virsh shutdown worker-vm1       # 关机
virsh reboot worker-vm1         # 重启
virsh destroy worker-vm1        # 强制断电
virsh domifaddr worker-vm1      # 查看 IP
virsh console worker-vm1        # 串口控制台
ssh root@192.168.122.138        # SSH 登录