使用 Nix 的 Tap 网络在虚拟机之间设置网络?

使用 Nix 的 Tap 网络在虚拟机之间设置网络?

我正在尝试在多个虚拟机之间共享网络。

我尝试添加:

    qemu.networkingOptions = [
                               "-nic user,model=virtio-net-pci"
                               "-netdev tap,id=mynet0"
                             ];

然而,这会导致以下错误:

qemu-system-x86_64: network script /etc/qemu-ifup failed with status 256

即使以 root 身份运行。我也不知道这个文件实际位于哪里?这会是客人的事吗?

答案1

你必须保持选项的纯度。我的意思是你不能混合网络声明

-net nic,model=virtio-net-pci,macaddr=... -net user,restrict=[on|off]

-device virtio-net-pci,netdev=net0,mac=...  -netdev tap,ifname=tap0,id=net0,script=...,downscript=...

其中第一个选项创建专用范围 10.0.0.x/8 的虚拟 LAN,为来宾 VM 提供 DHCP 地址 10.0.0.15,并(禁止)允许来宾 VM 通过嵌入式 NAT 防火墙到达主机系统网络;而显示的字母选项创建了一个与主机的tap0接口绑定的虚拟接口,您应该在其中定义tap0连接到哪个真实接口。

因此,如果您想连接两个虚拟机,假设 VMA/tapA 和 VMB/tapB ,您可以通过桥接器将这些虚拟机连接在一起,该桥接器可以定义为:

# ip link add name brAB type bridge
# ip link set dev  brAB up
# ip link set dev  tapA master brAB
# ip link set dev  tapB master brAB
# ip link set dev  tapA up
# ip link set dev  tapB up

此配置创建连接 VMA 和 VMB 的隔离网络仅有的!。要使该网络与一些免费主机 NIC 绑定或配置其他网络模式,您必须阅读有关真实主机网络配置的更多信息,例如有关虚拟交换机(openvswitch)或其他可能性的信息。

当然,在尝试使用虚拟接口 tapA 或 tapB 之前,需要先对其进行装箱。例如,您可以这样做:

# ip tuntap add name tapA mode tap

命令。

答案2

我需要以下内容:

qemu.networkingOptions = [
                           "-device e1000,netdev=abc,mac=52:55:00:d1:55:01"
                           "-netdev tap,id=abc,ifname=tapA,script=no,downscript=no"
                         ];

在第二个虚拟机中更改地址+接口:

qemu.networkingOptions = [
                           "-device e1000,netdev=abc,mac=52:55:00:d1:55:02"
                           "-netdev tap,id=abc,ifname=tapB,script=no,downscript=no"
                         ];

正如 @schweik 所提到的,我还需要配置使用以下脚本的网络:

for i in "$@"
do
case $i in
    --down)
        ip link delete brAB
        ip link delete tapA
        ip link delete tapB
    ;;
    --up)

        ip link add name brAB type bridge
        ip link set dev brAB up

        ip tuntap add dev tapA mode tap user $(whoami)
        ip tuntap add dev tapB mode tap user $(whoami)

        ip link set dev tapA master brAB
        ip link set dev tapB master brAB
        ip link set dev tapA up
        ip link set dev tapB up
    ;;
esac
done

相关内容