起動時に Synology NAS で次のスクリプトを実行する必要があります。 Synology NASには、起動時にトリガーできる予約タスクが組み込まれています。
私が実行するスクリプトは次のとおりです。
#!/bin/sh
ip link add macvlan0 link eth0 type macvlan mode bridge
ip addr add 192.168.0.240/32 dev macvlan0
ip link set macvlan0 up
ip route add 192.168.0.240/28 dev macvlan0
しかし、これはうまくいかず、eth0
インターフェイスがこれらのコマンドを受け入れる準備ができていない場合、タスクは非常に迅速に実行されるようです。
sleep 60
すべてのコマンドの前に配置すると、ip *
問題が解決します。しかし、私の仕事をする前にランダムな数秒を待つのは正しいとは思いません。
上記の要件を考慮して、コマンドをeth0
実行できるようにインターフェイスが利用可能になるのを待つ最良の方法は何ですか?ip *
答え1
eth0
ステータスを確認し/sys/class/net/eth0/operstate
、ネットワークインターフェイスが機能するまで待ちます。
while ! [ "$(cat /sys/class/net/eth0/operstate)" = "up" ]
do
echo "waiting for eth0 to be up"
sleep 2
done
ip link add macvlan0 link eth0 type macvlan mode bridge
ip addr add 192.168.0.240/32 dev macvlan0
ip link set macvlan0 up
ip route add 192.168.0.240/28 dev macvlan0
答え2
これが問題に対する私の最終的な解決策です。
while ! ip link show eth0 | grep -q 'state UP'; do
sleep 1
done
ip link add macvlan0 link eth0 type macvlan mode bridge
ip addr add 192.168.0.240/32 dev macvlan0
ip link set macvlan0 up
ip route add 192.168.0.240/28 dev macvlan0
ただし、Synologyには2つの「開始」スケジュールジョブがあり、起動時にいくつかのエラーが発生します。この問題を解決するために、他のジョブが先行ジョブとして含まれるようにこのジョブを構成しました。つまり、ジョブは順番に実行され、新しいジョブを開始する前に前のジョブが完了するのを待ちます。