如何通过cloud-init为两台QEMU虚拟机配置不同IP并实现互通?
如何通过cloud-init为两台QEMU虚拟机配置不同IP并实现互通?
当然可以!咱们分两步来搞定:先通过cloud-init给每台VM配置专属静态IP,再调整QEMU的网络设置让它们能互相访问。
第一步:创建cloud-init配置文件
cloud-init需要两个核心文件:user-data(用于配置用户、SSH密钥等)和network-config(用于设置静态IP)。
- 先写通用的
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
- 给每台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]
- 把配置文件打包成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
相关产品推荐
相关产品推荐

