我需要在 Linux 下为我的 qemu 虚拟机创建一个网桥。
我正在阅读手册页、官方文档和教程,但仍然发现无法理解这些步骤。
例如(来自https://wiki.ubuntu.com/KvmWithBridge)
# The primary network interface
auto br0
iface br0 inet static
address 192.168.0.101
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255
gateway 192.168.0.1
bridge_ports eth0
bridge_stp off
bridge_maxwait 5
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 192.168.0.4
dns-search mydomain.net
这对我来说毫无意义:
- 为什么桥接器需要 IP?为什么我可以使用桥接器和 IP,因为它应该只是一条数据链路路径
- 为什么我需要关闭 eth0?桥接器是两个物理设备之间的连接,为什么关闭以太网卡以与该卡建立互连是有意义的?
- 谁或什么在此获取了 IP?
192.168.0.101
具体是什么?
这种模式在许多教程、指南和文档中重复出现,其中混合了一些没有明显含义的词语(显然桥梁应该处理 IP...)。
因此,我想问:如何创建桥接,以便我的qemu
实例可以通过桥接自行连接eth0
?为了简单起见,我只想使用iproute2
和/etc/network/interfaces
,而不使用其他任何东西。
答案1
我会尽力回答你的问题。
桥接接口不需要 IP 地址即可在端口之间切换帧。当然,您可以配置没有 IP 地址的桥接接口。在这种情况下,您的 Linux 主机将作为简单的 L2 交换机工作。当您在桥接接口上分配 IP 地址时,您可以将 Linux 主机视为高级 L3 交换机。
您不需要禁用接口来将其添加到桥中。
之后,
ifup br0
在您的 Linux 系统中,br0
接口将被创建。地址192.168.0.101
将被分配给它。在系统中使用适当的选项运行 qemu VM 后,应该会出现一个附加界面。之后,您可以
br0
使用命令手动将其添加到界面中
ip link set dev <tap-iface> master br0
您可以编写一个简短的脚本来将新的 tap 接口添加到桥接器中。此脚本可以放在特殊目录中,并在新 qemu 主机启动后执行。
如果您更喜欢
iproute2
,您可以在接口文件中使用它,使用pre-up
、up
和post-up
其他语句内部。如果我理解正确的话,您可以添加类似的内容到
/etc/network/interfaces
文件以调出tap
界面并将其添加到桥中:
iface tap10 inet manual
pre-up /sbin/tunctl -t $IFACE -u root || true
pre-up /sbin/ip link set dev $IFACE master br0
up /sbin/ip link set dev $IFACE up
post-down /sbin/tunctl -d $IFACE || true
新版本的 iproute2 本身支持 tun/tap 接口,因此tunctl
不需要使用二进制文件。
iface tap10 inet manual
pre-up /sbin/ip tuntap add mode tap user root name $IFACE || true
pre-up /sbin/ip link set dev $IFACE master br0
up /sbin/ip link set dev $IFACE up
post-down /sbin/ip link del dev $IFACE || true
在 qemu VM 启动命令行中您应该使用类似这样的命令:
-netdev tap,id=mynet0,ifname=tap10,script=no,downscript=no