除非运行两次,否则在主机上创建 macvlan 桥接的脚本将不起作用

除非运行两次,否则在主机上创建 macvlan 桥接的脚本将不起作用

我有一个脚本,应该在主机启动时在主机中创建一个 macvlan 网桥。主机是最新的 Arch Linux。这是为了允许主机和访客共享同一网络*并相互交谈*。我找到了以下网址给出的说明:

https://www.furorteutonicus.eu/2013/08/04/enabling-host-guest-networking-with-kvm-macvlan-and-macvtap

(关于启动时的执行,我也查阅了如何编写Systemd的启动脚本?https://stackoverflow.com/questions/21830670/systemd-start-service-after-specific-service)。

然而,问题是该脚本在第一次尝试时并不有效。它创建 macvlan 设备和路由表,但无法使主机能够 ping 访客,反之亦然。

但是当第二次执行时,它会起作用 - 也就是说,尽管出现错误消息“create_macvlan_bridge.sh[4489]:RTNETLINK 答案:文件存在”。主机现在可以按预期 ping 访客。

第一次尝试应该可以工作,但我不明白为什么不是。有人可以帮忙吗?

[更新]我注意到结果ip a显示了第二个inet条目macvlan0@enp10s0第二次执行后:

macvlan0@enp10s0: <广播、多播、UP、LOWER_UP> mtu 1500 qdisc noqueue 状态 UP 组默认 qlen 1000
    link/ether da:a2:21:d1:95:24 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.3/24 范围全局 macvlan0
        valid_lft 永远 Preferred_lft 永远
    inet 192.168.1.22/24 brd 192.168.1.255 范围全局辅助 macvlan0
        valid_lft 永远 Preferred_lft 永远

请注意第二个 IP 地址是如何由路由器的 dhcp 提供的,并且它具有secondary属性。

奇怪的是,第二次执行后,访客可以 ping 通主机 192.168.1.3在“次要”地址。


代码如下。

脚本:/usr/local/bin/create_macvlan_bridge.sh

#!/bin/sh

# Evert Mouw, 2013
# Modified by Marc Ranolfi, 2017-07-24

# ------------
# wait for network availability
# ------------
TESTHOST=kernel.org
while ! ping -q -c 1 $TESTHOST > /dev/null
do
    echo "$0: Cannot ping $TESTHOST, waiting another 5 secs..."
    sleep 5
done

# ------------
# network config
# ------------
HWLINK=enp10s0
MACVLN=macvlan0

IP=192.168.1.3/24
NETWORK=192.168.1.0/24
GATEWAY=192.168.1.1

# ------------
# setting up $MACVLN interface
# ------------
ip link add link $HWLINK $MACVLN type macvlan mode bridge
ip address add $IP dev $MACVLN
ip link set dev $MACVLN up

# ------------
# routing table
# ------------
# empty routes
ip route flush dev $HWLINK
ip route flush dev $MACVLN

# add routes
ip route add $NETWORK dev $MACVLN metric 0

# add the default gateway
ip route add default via $GATEWAY

Systemd 单元文件:/etc/systemd/system/create_macvlan_bridge.service

[Unit]
Description=Create_macvlan_bridge
Wants=network-online.target
After=network.target network-online.target dhcpcd.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/create_macvlan_bridge.sh

[Install]
WantedBy=multi-user.target

答案1

我也遇到了脚本问题。我不必做两次。大约一分钟后事情又开始工作了。但这仍然很烦人。我决定它会进行不必要的路由更改。来自主机的正常流量没有理由不使用物理接口。您只需使用 macvlan 即可访问您的虚拟机。因此,您真正需要的唯一路由更改是

ip 路由刷新 dev $MACVLN

ip route add $VMHOST dev $MACVLN metric 0

那时我就​​不再有任何问题了。

至少在 Centos 7 上,/sbin/ifup-local 在启动界面结束时由 systemctl restart network 执行,这也是毫无价值的。因此,您可以将脚本放在那里,尽管它应该以类似这样的方式开始,因为您不想在其他界面启动时运行它。

如果 !测试“$1”=“em1”;然后退出 0 fi

当 /sbin/ifup-local 时,您可能也不需要 ping 循环。事实上,它很危险,因为它是一个无限循环,所以如果存在一些网络问题,系统可能不会在启动时将此问题解决。

答案2

问题的最新更新中详细的信息让我了解了问题所在。

我已经dhcpcd.service启用了所有接口。我尝试禁用它并仅启用它enp10s0,并且它有效。

所以:

systemctl disable dhcpcd
systemctl enable dhcpcd@enp10s0

瞧。

相关内容