
SBC向けのプロビジョニングと共有システム
Provisioner は、シングルボードコンピュータ (SBC)、特に U-Boot ベースのプラットフォーム向けの、開発者にフォーカスしたプロビジョニング用サイドキックです。

自己完結型の環境を提供し、以下の操作を可能にします:
運用モデルは意図的にシンプルです:
1 ボード => 1 Provisioner インスタンス
Provisioner はハードウェアの近くで動作し、安全な多重化インターフェースを通じて制御されたリモートアクセスを開発者に提供します。
このプロジェクトは、以下の 2 つの主要要素で構成されています:
| コンポーネント | 実行場所 | 役割 |
|---|---|---|
| Provisioner | ホスト / ラボノード | 制御プレーン、シリアルゲートウェイ、プロビジョニングサービス |
| goinit | ターゲットボード | フラッシュエージェント & プロビジョニングランタイム |
Provisioner がワークフローを調整し、goinit がボード上でローカルにそれらを実行します。
Provisioner は 3 つの運用プレーンを橋渡しします:
これにより、ブートローダーからランタイムプロビジョニングまで継続的な制御が可能になります。
物理コンソール接続を所有し、以下を提供します:
シリアルは、最終的なフォールバック制御パスとして残ります。
組み込みサービスがブートアーティファクトを提供します:
TFTP
HTTP
Provisioner は、アクセス層と制御層の両方として機能する統一 SSH エンドポイントを公開します。
すべてのリモート操作は 単一の SSH 接続で多重化 され、公開鍵認証によって管理されます。
多重化チャネルには以下が含まれます:
アクセス管理:
したがって、SSH は以下の両方を伝送します:
Provisioner の I/O モデルの中心には ルーター があります。これは、プロデューサーとコンシューマーの間でターミナルストリームを仲介するプラグイン可能なソフトウェアアーティファクトです。
すべてのコンソールトラフィックは、サブシステム間で直接ではなく、このコンポーネントを経由して流れます。
ルータークライアントは以下を行うことができます:
例:
ルーターは 2 つのクライアントバリアントを区別します:
| タイプ | 特徴 | 例 |
|---|---|---|
| 人間 | インタラクティブ、ANSI 対応 | SSH ターミナル |
| 機械 | 決定論的、生 I/O | スクリプト、自動化 |
これにより、ユーザビリティと決定論のそれぞれに合わせたストリーム処理が可能になります。
ユニキャスト
マルチキャスト
複数のエンジニアが干渉なく同じコンソールを監視できます。
専用のプラグイン可能ウォッチャーが ANSI ターミナルのニュアンスを軽減します:
ハードコードされたロジックではなく、プラグインとして実装されています。
モニターシェルは、インタラクティブなボード制御を提供します。
> ?
? : このテキスト
board_stat : 最後の goinit ボードステータスを報告します。ボードは PROVISIONER_MGMT_* を出力している必要があります
echo : 引数をエコーバックします
enuser : トンネルのユーザーを有効にします
exec_assm : 指定された assm スクリプトをロードして実行します
exec_scr : 指定されたスクリプトをロードして実行します
exec_state : 指定されたスクリプトの状態を返します
exit : このシェルを終了します
filter : フィルターコマンド: 'filter help' と入力すると詳細が表示されます
help : このテキスト
log_serial : シリアルで送受信されたすべてを ser.log ファイルにコピーします。注意: 以前のファイルを上書きします。
log_serial_stop : シリアルログサブシステムを停止する必要があります。
send_serial : シリアル経由でファイルを送信します: send_serial <ファイル> <plain|gzip|xmodem_unix|xmodem_uboot> [宛先パス]
send_serial_deps : send_serial plain/gzip のリモート依存関係を確認します: stty, dd, base64, gzip, rm (または busybox)。
toff : snmp を使用してボードの電源を切るためのコマンド PDU
ton : snmp を使用してボードの電源を入れるためのコマンド PDU
tterm : シリアルトンネル接続を終了します
ulist : トンネルのユーザー状態を一覧表示します
>
filter help
使用可能: enable, disable, default, show, add, remove, help
ルールは ASCII または HEX で定義できます:
filter add ascii Hello Hello World
filter add hex 48656c6c6f 48656c6c6f 576f726c64
フィルターは以下を行うことができます:
これはブート自動化とコンソール正規化に役立ちます。
Provisioner は直接シリアルファイル転送をサポートしています:
send_serial <ファイル> <モード> [宛先パス]
モード:
| モード | 方法 |
|---|---|
| plain | Base64 |
| gzip | Base64 + 圧縮 |
| xmodem_unix | rx による XMODEM |
| xmodem_uboot | loadx による XMODEM |
依存関係は以下で確認:
send_serial_deps
必要なユーティリティ:
転送エンジンは、スタンドアロンユーティリティ send_console-ng から派生し、Provisioner に適合されました。 これにより、以下の状況でファイル転送が可能になります:
機能:
元のユーティリティと比較して:
stdbuf と cat の依存関係を削除dd を導入これにより、Provisioner は深刻に劣化したボード状態でも動作できます。
アセンブリ風の expect エンジン:
ログインやブートフローに最適です。
シリアルストリームにバインドされた外部プログラムを実行します。
モード:
| モード | 動作 |
|---|---|
| line | ラインバッファ |
| char | バイトストリーム |
軽量の予約統合は存在しますが、プロジェクトの主要な焦点ではありません。 以下の目的のみで使用されます:
Provisioner は完全なラブスケジューラになることを目指していません。
Provisioner は Go で書かれており、クロスコンパイルが容易です。
make
GOARCH=arm64 make
外部ツールチェーンは必要ありません。
以下の環境に展開可能: