OTBR Docker の実行

GitHub でソースを見る

OpenThread ボーダー ルーター(OTBR)は、Thread ネットワークに参加するために Thread RCP ノードが必要です。OTBR Docker は、物理的な RCP(OpenThread ドングル)とシミュレートされた RCP の両方をサポートしています。

OTBR Docker を他の物理 Thread デバイスに接続する場合は、物理 RCP を使用します。シミュレートされた Thread ネットワークで境界ルーティングをテストする場合は、シミュレートされた RCP を使用します。

物理的な RCP

物理的な RCP には、サポートされている OpenThread プラットフォームを使用します。詳細については、OpenThread Border Router のビルドと構成ガイドの RCP をビルドしてフラッシュする手順をご覧ください。

RCP を添付する

  1. ビルドとフラッシュが完了したら、OTBR Docker を実行しているマシンに USB 経由で RCP デバイスを接続します。
  2. /dev を確認して、RCP デバイスのシリアルポート名を特定します。
    ls /dev/tty*
    /dev/ttyACMO
    

OTBR Docker コンテナを起動する

新しいターミナル ウィンドウで、RCP のシリアルポートを参照して OTBR Docker を起動します。たとえば、RCP が /dev/ttyACM0 にマウントされている場合:

docker run --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" -p 8080:80 --dns=127.0.0.1 -it --volume /dev/ttyACM0:/dev/ttyACM0 --privileged openthread/otbr --radio-url spinel+hdlc+uart:///dev/ttyACM0

成功すると、次のような出力が表示されます。

WARNING: Localhost DNS setting (--dns=127.0.0.1) may fail in containers.
RADIO_URL: spinel+hdlc+uart:///dev/ttyACM0
TUN_INTERFACE_NAME: wpan0
NAT64_PREFIX: 64:ff9b::/96
AUTO_PREFIX_ROUTE: true
AUTO_PREFIX_SLAAC: true
Current platform is ubuntu
* Applying /etc/sysctl.d/10-console-messages.conf ...
kernel.printk = 4 4 1 7
* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
kernel.kptr_restrict = 1
* Applying /etc/sysctl.d/10-link-restrictions.conf ...
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/10-magic-sysrq.conf ...
kernel.sysrq = 176
* Applying /etc/sysctl.d/10-network-security.conf ...
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
* Applying /etc/sysctl.d/10-ptrace.conf ...
kernel.yama.ptrace_scope = 1
* Applying /etc/sysctl.d/10-zeropage.conf ...
vm.mmap_min_addr = 65536
* Applying /etc/sysctl.d/60-otbr-ip-forward.conf ...
net.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1
* Applying /etc/sysctl.conf ...
 * Starting userspace NAT64 tayga             [ OK ]
/usr/sbin/service
 * Starting domain name service... bind9      [ OK ]
/usr/sbin/service
 * dbus is not running
 * Starting system message bus dbus           [ OK ]
   ...fail!
otWeb[155]: border router web started on wpan0
otbr-agent[224]: Thread interface wpan0
otbr-agent[224]: Thread is down
otbr-agent[224]: Check if Thread is up: OK
otbr-agent[224]: Stop publishing service
otbr-agent[224]: PSKc is not initialized
otbr-agent[224]: Check if PSKc is initialized: OK
otbr-agent[224]: Initialize OpenThread Border Router Agent: OK
otbr-agent[224]: Border router agent started.

OTBR Docker が実行されています。ターミナル ウィンドウを開いたまま、バックグラウンドで実行しておきます。プロセスを終了するかウィンドウを閉じると、OTBR Docker は停止します。

接続をテストするに進んで、OTBR Docker の設定を続行します。

シミュレートされた RCP

シミュレートされた RCP には、シミュレートされた OpenThread RCP ビルドを使用します。これは、単一のマシンでシミュレートされた Thread ネットワークを使用して境界ルーティングをテストする場合に便利です。

シミュレートされた RCP アプリケーションをビルドする

  1. OpenThread リポジトリのクローンを作成します。

    cd ~
    git clone https://github.com/openthread/openthread
    

  2. シミュレートされたアプリケーションをブートストラップしてビルドします。

    cd openthread
    ./script/bootstrap
    ./script/cmake-build simulation
    

双方向データ ストリームを設定する

socat コマンドライン ユーティリティを使用して、シミュレートされた RCP と OTBR Docker の間でデータを転送するための双方向データ ストリームを確立します。

  1. 新しいターミナル ウィンドウを開いてこのプロセスを実行します。OTBR Docker の実行中は実行したままにする必要があります。

  2. socat のインストール:

    sudo apt-get install socat
    

  3. socat を開始します。

    socat -d -d pty,raw,echo=0 pty,raw,echo=0
    2018/09/06 09:58:29 socat[242994] N PTY is /dev/pts/2
    2018/09/06 09:58:29 socat[242994] N PTY is /dev/pts/7
    2018/09/06 09:58:29 socat[242994] N starting data transfer loop with FDs [5,5] and [7,7]
    

出力で太字になっている 2 つのシリアルポートをメモします。最初のものはシミュレートされた RCP に、2 番目のものは OTBR Docker に使用します。上記の出力例では、以下のようになります。

  • /dev/pts/2 = シミュレートされた RCP ポート
  • /dev/pts/7 = OTBR Docker

このターミナル ウィンドウを開いたまま、バックグラウンドで実行します。

シミュレートされた RCP を開始する

  1. OTBR Docker の実行中にシミュレートされた RCP を実行したままにする必要があるため、新しいターミナル ウィンドウを開いてシミュレートされた RCP を実行します。

  2. socat の出力の最初のシリアルポートを使用して、シミュレートされた RCP アプリケーションを開始します。たとえば、socat の出力から /dev/pts/2 を使用する場合は、次のようにします。

    ~/openthread/build/simulation/examples/apps/ncp/ot-rcp 1 > /dev/pts/2 < /dev/pts/2
    

このコマンドからの出力はありません。ターミナル ウィンドウを開いたまま、バックグラウンドで実行します。

OTBR Docker コンテナを起動する

新しいターミナル ウィンドウで、socat 出力の 2 つ目のシリアルポートを使用して OTBR Docker を起動します。たとえば、socat の出力から /dev/pts/7 を使用する場合:

docker run --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" -p 8080:80 --dns=127.0.0.1 -it --volume /dev/pts/7:/dev/ttyUSB0 --privileged openthread/otbr

このコマンドは /dev/ttyUSB0 ポートも使用しています。これは、Docker コンテナ内のデフォルトのマウント ポイントです。

成功すると、次のような出力が表示されます。

WARNING: Localhost DNS setting (--dns=127.0.0.1) may fail in containers.
RADIO_URL: spinel+hdlc+uart:///dev/ttyUSB0
TUN_INTERFACE_NAME: wpan0
NAT64_PREFIX: 64:ff9b::/96
AUTO_PREFIX_ROUTE: true
AUTO_PREFIX_SLAAC: true
Current platform is ubuntu
* Applying /etc/sysctl.d/10-console-messages.conf ...
kernel.printk = 4 4 1 7
* Applying /etc/sysctl.d/10-ipv6-privacy.conf ...
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
* Applying /etc/sysctl.d/10-kernel-hardening.conf ...
kernel.kptr_restrict = 1
* Applying /etc/sysctl.d/10-link-restrictions.conf ...
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
* Applying /etc/sysctl.d/10-magic-sysrq.conf ...
kernel.sysrq = 176
* Applying /etc/sysctl.d/10-network-security.conf ...
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
* Applying /etc/sysctl.d/10-ptrace.conf ...
kernel.yama.ptrace_scope = 1
* Applying /etc/sysctl.d/10-zeropage.conf ...
vm.mmap_min_addr = 65536
* Applying /etc/sysctl.d/60-otbr-ip-forward.conf ...
net.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1
* Applying /etc/sysctl.conf ...
 * Starting userspace NAT64 tayga             [ OK ]
/usr/sbin/service
 * Starting domain name service... bind9      [ OK ]
/usr/sbin/service
 * dbus is not running
 * Starting system message bus dbus           [ OK ]
   ...fail!
otWeb[155]: border router web started on wpan0
otbr-agent[224]: Thread interface wpan0
otbr-agent[224]: Thread is down
otbr-agent[224]: Check if Thread is up: OK
otbr-agent[224]: Stop publishing service
otbr-agent[224]: PSKc is not initialized
otbr-agent[224]: Check if PSKc is initialized: OK
otbr-agent[224]: Initialize OpenThread Border Router Agent: OK
otbr-agent[224]: Border router agent started.

OTBR Docker が実行されています。このターミナル ウィンドウを開いたまま、バックグラウンドで実行します。プロセスを終了するか、ウィンドウを閉じると、OTBR Docker が停止します。