Orange Pi R1 のSPIフラッシュにOSを入れてルーターにする

メニュー

回線自動判別

eth0がルーター等のローカルネットワークに接続された場合はDHCPクライアントにして、そうでない場合はPPP接続する感じにしました。

/etc/network/interfaces
auto eth0
mapping eth0
  script /etc/network/dhcpc-test.sh

iface eth0-local inet dhcp

iface eth0-global inet manual
  up ip link set dev eth0 up
  post-up pppd call provider
  pre-down killall -q pppd

/etc/network/dhcpc-test.sh
#!/bin/sh
IF=$1

ip link set dev $IF up

if udhcpc -i $IF -n -q -T 2 -t 5 > /dev/null 2>&1; then
  MODE="local"
else
  MODE="global"
fi

ip link set dev $IF down

echo "$IF-$MODE"
スクリプトは実行権限が必要です。


/etc/network/interfacesでmappingにするとscriptの出力がデバイスの処理を分けれます。
scriptには本来のデバイス名が引数として渡されます。

udhcpcコマンドは引数に-qをつけるとIPが取得できれば即時終了、-nをつけるとIPが取得できない場合も常駐せずに終了となるようです。-Tはタイムアウト、-tは試行回数ぽいです。
# udhcpc -i eth0 -n -q -T 2 -t 5
の場合は2秒x5回DHCPサーバーへの接続を試みて、成功したら即時終了。IPの取得ができなければ10秒程度でエラー終了となります。
なので、スクリプトへの引数がeth0でeth0がDHCPサーバーに繋がっていればスクリプトはeth0-localを出力し、それ以外の場合はeth0-globalを出力します。


元の/etc/network/interfacesで、eth0-localの場合はインターフェイスはdhcpでIPを取得し、eth0-globalの場合はpppdを起動する感じ。

なお、
# ifdown eth0
はできなくなり、デバイスをdownさせる場合は、
# ifdown eth0=eth0-local

# ifdown eth0=eth0-global
のどちらかになります。

これだけだと起動中のケーブルの差し替えには対応しませんので、切り替える場合は手動でifdownとifupする必要があります。
[編集]   [AD]
rentafree.net