ホストの起動時にmacvlanブリッジを作成するスクリプトがあります。ホストは最新のArchLinuxです。これは、ホストとゲストが同じネットワークを共有できるようにすることを目的としています。私はで与えられた指示を見つけました:
(起動時の実行については、 systemdの起動スクリプトの書き方 と https://stackoverflow.com/questions/21830670/systemd-start-service-after-specific)も参考にしました。 -サービス )。
ただし、問題は、スクリプトが最初の試行では効果的でないことです。 macvlanデバイスとルーティングテーブルを作成しますが、ホストがゲストにpingを実行することはできません。その逆も同様です。
ただし、2回目に実行すると、機能します。つまり、 "create_macvlan_bridge.sh [4489]:RTNETLINKの回答:ファイルが存在します"というエラーメッセージが表示されます。これで、ホストは期待どおりにゲストにpingを実行できます。
最初はで動作するはずですが、なぜ動作しないのかわかりません。誰か助けてもらえますか?
[更新]ip a
の結果がmacvlan0の2番目のinet
エントリを示していることに気付きました2回目の実行後の@ enp10s0:
macvlan0 @ enp10s0:mtu 1500 qdiscnoqueue状態UPグループのデフォルトqlen1000
link/ether da:a2:21:d1:95:24 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.3/24 scope global macvlan0
valid_lft forever Preferred_lft forever
inet 192.168.1.22/24 brd192.168.1.255スコープグローバルセカンダリmacvlan0
valid_lft forever Preferred_lft forever
この2番目のIPアドレスがルーターからdhcpによってどのように提供され、secondary
属性を持っているかに注目してください。
奇妙なことに、2回目の実行後、ゲストは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
と出来上がり。
スクリプトにも問題がありました。私はそれを二度する必要はありませんでした。物事は1分かそこら後に再び働き始めました。しかし、それはまだ迷惑でした。不要なルーティング変更を行うことにしました。ホストからの通常のトラフィックが物理インターフェイスを使用してはならない理由はありません。 VMにアクセスするには、macvlanを使用するだけで済みます。そのため、本当に必要なルーティングの変更は
ip route flush dev $ MACVLN
ip route add $ VMHOST dev $ MACVLNメトリック0
その時点で、私はもはや問題を抱えていませんでした。
少なくともCentos7では、/ sbin/ifup-localがインターフェイスの起動の最後にsystemctlrestartnetworkによって実行されることも何の価値もありません。したがって、スクリプトをそこに置くことができますが、他のインターフェイスが起動したときにスクリプトを実行したくないため、このようなもので開始する必要があります。
もし!テスト "$ 1" = "em1";次に0fiを終了します
/ sbin/ifup-localの場合は、おそらくpingループも必要ありません。確かに、それは無限ループであるため危険です。したがって、ネットワークに問題がある場合、システムは起動の一部としてこれを思い付かない可能性があります。