Armadillo と SACM

SACM (Service Adapter Control Manager) は、機器の自動接続、一元管理を可能にするマネージメントシステムサービスです。当初はSEILのみサポートするサービスでしたが、SACM との通信を担う libarms を組み込むことで SEIL 以外の機器も SACM から管理できるようになります。昨日(12/24(水))発売開始された Armadillo-IoT およびその開発環境では libarms が標準でサポートされました。SEILの話題からは逸れますが、このエントリでは実際にArmadillo-IoTをSACMから操作可能にするまでの手順を紹介します。

記事一覧

SACM トライアルプランを申し込む

https://dev.smf.jp/sacm/からお申し込みください。

SACM トライアルプランは無料でご利用になれます。利用期間の制限もありません。ただし、管理できる機器は 5 台までです。

libarms/armsd のビルド

Armadillo のファームウェア開発はアットマークテクノ様が提供されている環境を使用します。http://armadillo.atmark-techno.com/start などを参考に開発環境を準備してください。

ATDE, atmark-dist には libarms (C API) とそれをデーモンとして実装した armsd が予め組み込まれているので、make menuconfig 等から有効化するだけで簡単にファームウェアに組み込めます。

ここでは menuconfig を使った手順をご紹介します。

  1. シェルで make menuconfig を実行する
    • "Kernel/Library/Defaults Selection" > "Customize Vendor/User Settings" をオンにする
    • "Exit" する
    • "Miscellaneous Applications" > "armsd" と "rtnotifyd" をオンにする
    • "Exit" する
  2. シェルで make を実行する

make 実行後 images ディレクトリに linux.bin.gz と romfs.img.gz ができていれば成功です。このままでも使用できますが、この後の開発・デバッグを簡単にするために、armsd から再起動できないように(問題発生時に自動的に再起動してしまわないように)しておきましょう。vendors/AtmarkTechno/Armadillo-IoTG-Std/etc/armsd/scripts/reboot をエディタで開き、以下のようにします。

#!/bin/sh
# /usr/bin/nohup /sbin/reboot -d 5 > /dev/null 2>&1 &
echo reboot >&2

保存したら make コマンドを実行して再度ビルドします。

なお、Armadillo-840 でも armsd 起動スクリプトと設定ファイル (vendors/AtmarkTechno/Armadillo-IoTG-Std/etc/armsd) をコピーすることで、動作することを確認しています。また、他の Armadillo シリーズでも同様に動作するものと思われます。ただし、機種依存部分 (LEDの操作等) は変更が必要になります。

SACM に Armadillo の設定を投入する

https://trial.sacm.jp/user/をブラウザで開き、ログインします。ログインアカウントは SACM トライアル申し込み後、メールでご連絡しています。

ログインしたら「管理」タブで、利用する Distribution ID の SA ラベルを「Armadillo」など、分かりやすいものに変更します:

SACM では管理対象の機器を SA (Service Adapter, サービスアダプタ) と呼んでいます。

Distribution IDはサービスアダプタを識別する一意のIDです。トライアルお申し込み時に5台分割り当てられており、後程サービスアダプタ(Armdillo)のフラッシュメモリに書き込みます。

「SA」タブで、「Armadillo」を選択します:

Armadillo を設置するネットワークがNAPT 配下の場合は「詳細情報」タブ >「操作」>「優先接続モード変更」で「接続持続型」を選択します (*1):

「コンフィグ」タブ(詳細情報タブの隣) > 「コンフィグ変更」で各モジュール毎それぞれ以下のように登録します:

モジュール0: ネットワーク設定(*2):

VERSION=1                    # 必ず1行目に置く

# eth0 用設定。DHCP のみサポート。eth0 を使用しない場合は不要
interface_eth0=enable
interface_eth0_address=dhcp  # 必須
interface_eth0_metric=1      # DHCPで設定される経路のメトリック

# 3G 設定。3G モジュールを使用しない場合は不要。
interface_3g=enable
interface_3g_address=dhcp    # 必須
interface_3g_ppp_id="PPP ID"
interface_3g_ppp_pass="PPP Password"
interface_3g_apn="iijmobile.jp"
interface_3g_metric=10

# コンフィグ変更者を信頼できるものと仮定しています。
# このファイルは shell script として source コマンドで読み込みます。
# このため、任意のコマンドの実行が module 0 から可能ですので、
# 最初の仮定を是とできない環境では、別途安全な方法をご検討ください。

module1: /etc/lighttpd.conf そのもの (*2)

module2: ~root/.ssh/authorized_keys そのもの (*2)

なお、入力後、「コンフィグ変更」ボタンを押す必要があります。全てのモジュールの設定が完了したら、「コンフィグ反映」から、「次回起動時反映」をしてください。

余談ですが、「接続中」の状態になった後は「即時反映」や、夜間などに実行する「反映スケジュール指定」が使用可能になります。

(*1):起動時間が短縮できます。「接続待受型」でも起動できますがタイムアウトを待つため、不利になります。 ただし、NAT セッション維持のため定期的にパケットを送受信するため、従量課金の回線ではご注意ください。目安として、一日あたり2.2MB程度使用します。

(*2): 実装例としてこのようにモジュールとコンフィグが定義されています。実環境で利用される際は、必要に応じてカスタマイズしてください。

SACM に接続してみる

以下のネットワーク環境が必要です。

また、シリアルコンソールをとるための PC も必要です。

まず SACM の認証情報をフラッシュメモリに書き込むため、一旦 armadillo を起動し、シリアルコンソールからログインします。root でログイン (初期パスワード:root) した後、/etc/config/armsd.conf.secretsに以下の内容でファイルを作成し、/bin/flatfsd -sを実行してフラッシュメモリに保存してください。

DIST_ID="SACM申し込みによって払いだされた Distribution ID"
LS_SA_KEY="同 LS SA Key"
 
MOBILE_ID="PPP ID"
MOBILE_PASS="PPP Password"
MOBILE_APN="APN (iijmobile.jp)"

次に先ほどビルドしたファームウェアを書き込みます。

フラッシュメモリへの書き込みは下記のWebページを参考にしてください。http://manual.atmark-techno.com/armadillo-iot/armadillo-iotg-std_product_manual_ja-1.0.0/ch12.html

ファームウェアの書き込みが終わったら準備完了です。さあ再起動してみましょう。

無事SACMと接続が完了すると、LED3 が点滅から点灯に、SACM の表示が「接続中」「操作・コンフィグ有効」に変わります。ただし、「接続中」への遷移は数分かかります。電源投入から数分待っても「操作・コンフィグ有効」にならない場合は設定、構成を見なおしてください。その際、ログ (デフォルトは /var/log/messages) がヒントになると思います。

接続を確認できたら、ファームウェアビルドで変更した reboot スクリプトを元に戻してください。また、ここに処理を追加することで、例えば再起動時に LED を点滅させるといった拡張が可能になります。

SACM でできること

機能要素として、大きく3 つあります:

ゼロコンフィグは、機器固有の設定を一切持たない状態からネットワーク越しにコンフィグを取得することができます。機器の識別には、フラッシュメモリに書き込んだDistribution IDを使用します。標準の実装ではインターネット接続のためにモバイルの PPP ID/Password を書き込んでいますが、IIJ から払い出す、SACM サーバー群へのみ到達可能な特殊なアカウントを使うことで、ゼロの状態からコンフィグ取得が可能になります。(ご利用についてはお問い合わせください)

Pushオペレーションは、Web 画面からSA(サービスアダプタ)に対して操作ができます。

これらの他、コンフィグの即時反映が可能です。また、WebAPI (http://manual.sacm.jp/webapi) を使って機械的に実行することもできます(APIアクセスキーの発行には有料版の契約が必要です)。

Heartbeat監視は、機器の UP/DOWN 判定 (メール通知) と、CPU 使用率などのグラフ表示が可能です。「接続中」になったら、「監視」タブから SA と通知先メールアドレスを登録し、電源を落としてしばらく待ってください。15 分ほどで DOWN 検知メールが届き、Web画面でも「接続中」から「切断中」に変化します。また CPU 使用率などの送信も armsd に実装済みですので、しばらく待つと SA の「グラフ」タブから確認できるようになります。

カスタマイズ

先ほど Push オペレーションをご紹介しましたが「ステータス取得」と「任意コマンド」は、実は未実装です。例として「ステータス」を実装してみましょう。

vendors/AtmarkTechno/Armadillo-IoTG-Std/etc/armsd/scripts/status を以下のように書き換えてください

#!/bin/sh
id=$1
in=$2
out=$3
 
command=`head -n 1 $in`
$command > $out

次に vendors/AtmarkTechno/Armadillo-IoTG-Std/etc/armsd/gen-conf.sh の #script-status: /etc/armsd/scripts/status となっている行の先頭の # を外してください。

その後ファームウェアを再度ビルドし、Armadillo に書き込んでください。

再起動後、「操作・コンフィグ有効」になったら、オペレーション実行画面でモジュール0 を選択し、パラメータに "netstat -rn" を入力して「ステータス取得」を実行してください。成功すると経路表が表示されるはずです。(もしくは「タスク」タブから参照してください)

今回は実装例ということでこの様にしましたが、コマンド実行には制限が無いため、例えば rm -rf / のような危険なコマンドも実行できてしまいます。適宜制限をかけてください。

script-status 以外のスクリプトの役割は以下のようになります

なお、PING, TRACEROUTE, コンフィグ取得は armsd の中で処理します。

最後に

このエントリでは SACM から Armadillo を管理する方法を紹介しました。SACM を使うことで、ほとんど手を動かすこと無くリモート管理が実現できます。また、カスタマイズも容易です。ぜひ Armadillo-IoT と SACM をお試しください。