QEMU启动的时候,可以选择组网方式,一般有两种选择,user模式和tap模式
user模式就是用NAT,tap模式就是用bridge网桥模式。以前也有过一次实践:FreeBSD RISCV 在QEME中实践-网络配置_pkg.txz: not found-CSDN博客
user NAT模式
参数设置类似这样
-netdev user,id=net0,ipv6=off,hostfwd=tcp::8022-:22 -netdev -device virtio-net-device,netdev=net0
这样的好处是省心省力,不用考虑再去设置任何东西,QEMU仿真系统启动之后,直接就能通过nat访问外网。 关键是user模式可以直接在普通用户下使用。所以建议使用user模式。
tap 网桥模式
QEMU启动后的网络设置通常涉及将QEMU虚拟机的网卡与宿主机网卡绑定,以实现虚拟机和宿主机之间的网络连通。参数设置类似这样:
-netdev tap,id=net0,ipv6=off,hostfwd=tcp::8022-:22,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown, -device virtio-net-device,netdev=net0
好处是网桥可以让虚拟机互相之间也能通信,但是缺点就是配置复杂,费时费力。另外tap模式需要在管理员权限下使用,普通用户无权限运行。
以下是一般步骤:
-
创建TAP虚拟网卡:
在宿主机上,你需要创建一个TAP虚拟网卡。这可以通过ip tuntap
命令来完成。例如:sudo ip tuntap add dev tap0 mode tap
sudo ip link set dev tap0 up
这将创建一个名为
tap0
的TAP设备,并将其设置为活动状态。 -
配置TAP设备IP地址:
接下来,你需要为TAP设备配置一个IP地址。这可以通过ip address add
命令来完成。例如:sudo ip address add dev tap0 192.168.2.128/24
这将为
tap0
设备分配IP地址192.168.2.128
,并设置子网掩码为255.255.255.0
。 -
QEMU启动参数:
当启动QEMU虚拟机时,你需要使用-net nic
和-net tap
参数来指定虚拟机的网卡和TAP设备。例如:qemu-system-x86_64 -hda /path/to/your/disk.img -net nic -net tap,ifname=tap0,script=/etc/qemu-ifup
其中,
-hda
参数指定虚拟机的磁盘映像文件,-net nic
参数创建一个新的虚拟网卡,-net tap
参数将该虚拟网卡与TAP设备tap0
绑定。script=/etc/qemu-ifup
指定了一个脚本,该脚本在QEMU启动时会被调用,用于配置TAP设备的网络设置。 -
配置
/etc/qemu-ifup
脚本(可选):/etc/qemu-ifup
脚本用于在QEMU启动时配置TAP设备的网络设置。这个脚本的具体内容取决于你的网络环境和需求。一个简单的示例脚本可能只是简单地启动TAP设备,但更复杂的脚本可能会配置路由、防火墙规则等。 -
测试网络连接:
一旦QEMU虚拟机启动并配置了网络,你就可以在虚拟机内部使用ping
命令或其他网络工具来测试与宿主机的网络连接了。
请注意,上述步骤可能因你的操作系统、QEMU版本和网络环境的不同而略有差异。确保参考适用于你的具体情况的文档和教程。
在Ubuntu24.04下实践
这台Ubuntu24.04是在Windows10下的仿真环境,网络信息:
ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.25.183.186 netmask 255.255.240.0 broadcast 172.25.191.255
inet6 fe80::215:5dff:fe3c:d3f6 prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:3c:d3:f6 txqueuelen 1000 (Ethernet)
RX packets 3295 bytes 4999578 (4.9 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2264 bytes 160405 (160.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
创建tap0虚拟网卡
sudo ip tuntap add dev tap0 mode tap
sudo ip link set dev tap0 up
用ifconfig tap0看看新加的tap0口:
tap0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 3e:93:14:dc:94:1c txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
如果想删除,使用del命令删除tap0
sudo ip tuntap del tap0 mode tap
配置TAP设备IP地址:
接下来,需要为TAP设备配置一个IP地址。这可以通过ip address add
命令来完成。例如:
sudo ip address add dev tap0 172.25.183.187/20
这将为tap0设备分配ip地址172.25.183.187,并设置子网掩码为255.255.240.0
QEMU启动仿真
QEMU启动参数:
当启动QEMU虚拟机时,需要使用-net nic
和-net tap
参数来指定虚拟机的网卡和TAP设备。例如在这篇文档里:在Ubuntu下运行QEMU仿真FreeBSD riscv64系统-CSDN博客
user NAT模式
使用user启动NAT为:
qemu-system-riscv64 -machine virt -m 2048M -smp 6 -nographic \
-kernel u-boot.bin \
-drive file=FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \
-netdev user,id=net0,ipv6=off,hostfwd=tcp::8022-:22 \
-netdev tap -device virtio-net-device,netdev=net0
这样就可以NAT上网了!
tap网桥模式(未成功)
加上tap设备桥接后的QEMU启动命令为:
sudo qemu-system-riscv64 -machine virt -m 2048M -smp 6 -nographic -kernel u-boot.bin -drive file=FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 -netdev tap,id=net0 -device virtio-net-device,netdev=net0
不过启动的时候报错:W: /etc/qemu-ifup: no bridge for guest interface found
所以网络还没调好。
调试
如何看qemu支持的网卡
qemu-system-aarch64 -M virt -nic model=help
显示
MESA: error: ZINK: failed to choose pdev
glx: failed to create drisw screen
NVD3D10: CPU cyclestats are disabled on client virtualization
NVD3D10: CPU cyclestats are disabled on client virtualization
Available NIC models:
e1000
e1000-82544gc
e1000-82545em
e1000e
i82550
i82551
i82557a
i82557b
i82557c
i82558a
i82558b
i82559a
i82559b
i82559c
i82559er
i82562
i82801
igb
ne2k_pci
pcnet
rtl8139
tulip
virtio-net-pci
virtio-net-pci-non-transitional
virtio-net-pci-transitional
vmxnet3