You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过cloud-init为两台QEMU虚拟机配置不同IP并实现互通?

如何通过cloud-init为两台QEMU虚拟机配置不同IP并实现互通?

当然可以!咱们分两步来搞定:先通过cloud-init给每台VM配置专属静态IP,再调整QEMU的网络设置让它们能互相访问。

第一步:创建cloud-init配置文件

cloud-init需要两个核心文件:user-data(用于配置用户、SSH密钥等)和network-config(用于设置静态IP)。

  1. 先写通用的user-data文件(两台VM可以共用),用来设置登录权限:
#cloud-config
users:
  - name: ubuntu
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC...  # 替换成你自己的SSH公钥
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    groups: sudo
    shell: /bin/bash
  1. 给每台VM单独写network-config文件:
  • 给vm0创建vm0-netcfg.yaml,配置IP为192.168.50.10/24:
network:
  version: 2
  ethernets:
    enp0s3:  # Ubuntu云镜像中e1000网卡的默认名称
      addresses:
        - 192.168.50.10/24
      gateway4: 192.168.50.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
  • 给vm1创建vm1-netcfg.yaml,配置IP为192.168.50.11/24:
network:
  version: 2
  ethernets:
    enp0s3:
      addresses:
        - 192.168.50.11/24
      gateway4: 192.168.50.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
  1. 把配置文件打包成cloud-init镜像:
    用genisoimage工具分别为两台VM生成专属的iso镜像(注意-volid cidata是必须的,cloud-init只会识别这个卷名):
# 生成vm0的cloud-init镜像
genisoimage -output vm0-cloudinit.iso -volid cidata -joliet -rock user-data vm0-netcfg.yaml

# 生成vm1的cloud-init镜像
genisoimage -output vm1-cloudinit.iso -volid cidata -joliet -rock user-data vm1-netcfg.yaml

第二步:调整QEMU启动命令,让VM互通

原来的user网络模式默认会隔离VM,咱们只要给两台VM指定同一个子网,就能让它们互相访问,同时保留主机到VM的SSH端口转发。

修改后的启动命令如下:

  • vm0的启动命令:
qemu-system-x86_64 -m 4G -smp 4 -hda ./ubuntu2404-vm0.img \
  -device e1000,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2222-:22,net=192.168.50.0/24 \
  -drive file=./vm0-cloudinit.iso,format=raw,media=cdrom \
  -nographic -enable-kvm
  • vm1的启动命令:
qemu-system-x86_64 -m 4G -smp 4 -hda ./ubuntu2404-vm1.img \
  -device e1000,netdev=net0 -netdev user,id=net0,hostfwd=tcp::2223-:22,net=192.168.50.0/24 \
  -drive file=./vm1-cloudinit.iso,format=raw,media=cdrom \
  -nographic -enable-kvm

这里关键的改动是加了net=192.168.50.0/24参数,让两台VM处于同一个子网内,同时挂载了咱们生成的cloud-init镜像,启动时会自动应用网络配置。

验证互通

启动两台VM后,你可以:

  • 从主机用ssh ubuntu@localhost -p 2222登录vm0,用ssh ubuntu@localhost -p 2223登录vm1
  • 在vm0里ping vm1的IP:ping 192.168.50.11,应该能正常连通;反过来在vm1里ping vm0也一样
  • 甚至可以直接在vm0里用ssh ubuntu@192.168.50.11登录vm1,完全不需要经过主机

额外提示

  • 如果你的VM网卡名不是enp0s3,可以先启动VM后用ip addr查看实际网卡名,再修改network-config里的名称
  • 如果你需要主机和VM在同一个网段互通,可以改用桥接网络模式,但需要先在主机上创建虚拟网桥,配置稍复杂一点,上面的方法已经能满足VM之间互通+主机SSH访问的需求啦

备注:内容来源于stack exchange,提问作者xiaogw

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:54:32