我有一个脚本,应该在主机启动时在主机中创建一个 macvlan 网桥。主机是最新的 Arch Linux。这是为了允许主机和访客共享同一网络*并相互交谈*。我找到了以下网址给出的说明:
(关于启动时的执行,我也查阅了如何编写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
瞧。