Networking

除非執行兩次,否則在主機上創建 macvlan 網橋的腳本不起作用

  • October 6, 2020

我有一個腳本,它應該在啟動時在主機中創建一個 macvlan 網橋。主機是最新的 Arch Linux。這是為了讓主機和來賓共享同一個網路並互相交談。我在以下位置找到了說明:

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

(關於啟動時的執行,我也參考了How to write startup script for Systemd?https://stackoverflow.com/questions/21830670/systemd-start-service-after-specific-service)。

然而,問題是該腳本在第一次嘗試時無效。它會創建 macvlan 設備和路由表,但無法讓主機 ping 來賓,反之亦然。

但是當第二次執行時,它可以工作 - 也就是說,儘管有一條錯誤消息顯示為*“create_macvlan_bridge.sh$$ 4489 $$:RTNETLINK 回答:文件存在”*。主機現在可以按預期 ping 來賓。

不過,它應該在第一次嘗試時起作用,但我不知道為什麼它不起作用。任何人都可以幫忙嗎?

**$$ Update $$**我注意到在第二次執行後ip a顯示macvlan0@enp10s0inet的第二個條目的結果:

macvlan0@enp10s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 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 永遠首選_lft 永遠

    **inet 192.168.1.22/24 brd 192.168.1.255 範圍全域輔助 macvlan0

        valid_lft 永遠首選_lft**

請注意第二個 IP 地址是如何由路由器的 dhcp 提供的,並且它具有secondary屬性。

奇怪的是,在第二次執行之後,客人可以在 192.168.1.3“輔助”地址 ping 主機。


程式碼如下。

腳本:/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 &gt; /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

該問題的最新更新中詳細介紹的資訊使我了解了問題所在。

我已dhcpcd.service為所有介面啟用。我嘗試禁用它並僅啟用它enp10s0,並且它有效。

所以:

systemctl disable dhcpcd
systemctl enable dhcpcd@enp10s0

瞧。

我的腳本也有問題。我不必做兩次。大約一分鐘後,事情又開始工作了。但這仍然很煩人。我決定它會進行不必要的路由更改。來自主機的正常流量沒有理由不使用物理介面。您只需要使用 macvlan 即可訪問您的虛擬機。因此,您真正需要的唯一路由更改是

ip route flush dev $MACVLN

ip 路由添加 $ VMHOST dev $ MACVLN 指標 0

那時我不再有任何問題。

至少在 Centos 7 上,/sbin/ifup-local 在啟動界面結束時由 systemctl restart network 執行也是毫無價值的。所以你可以把腳本放在那裡,雖然它應該以這樣的方式開始,因為你不想在其他介面出現時執行它。

如果 !測試“$1”=“em1”;然後退出 0 fi

當它是 /sbin/ifup-local 時,您可能也不需要 ping 循環。確實這是很危險的,因為它是一個無限循環,所以如果有一些網路問題,系統可能不會在啟動時提出這個問題。

引用自:https://unix.stackexchange.com/questions/381581