除非執行兩次,否則在主機上創建 macvlan 網橋的腳本不起作用
我有一個腳本,它應該在啟動時在主機中創建一個 macvlan 網橋。主機是最新的 Arch Linux。這是為了讓主機和來賓共享同一個網路並互相交談。我在以下位置找到了說明:
(關於啟動時的執行,我也參考了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 > /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 循環。確實這是很危險的,因為它是一個無限循環,所以如果有一些網路問題,系統可能不會在啟動時提出這個問題。