ブログ

Armadillo-IoT(G4):スイッチ長押しで起動するコンテナを選択する

at_kazutaka.bito
2023年5月1日 11時28分

Armadillo-IoT(G4)で、スイッチ長押しで起動するコンテナを選択する方法です。
用例としては、スイッチが長押しされていればメンテナンスモードのコンテナを起動し、
長押しされてなければ、通常モードのコンテナを起動する、といった場合が考えられます。

以下では、podman_startコマンド
 podman_start example1
 podman_start example2
で起動する2つのコンテナ(example1、example2)用のコンテナイメージと
コンフィグファイル(example1.conf、example2.conf)が準備済みとします。

ここでは例として、下記のように動作するものです。
Armadillo-IoT ゲートウェイ G4製品マニュアル「図13.6 Armadillo-IoT ゲートウェイ G4のインターフェース」より
 LED(LED3):Hertbeatでチカチカ点滅する間、コンテナ選択可能状態
 スイッチ(SW1):
  コンテナ選択可能状態:5秒長押しでexample2、それ以外はexample1を起動する
  コンテナ起動後:5秒長押しでreboot、10秒長押しでpoweroffする

1. コンテナのコンフィグファイルを自動起動しないように設定する

コンテナ(example1、example2)のコンフィグファイル
/etc/atmark/containers/example1.conf
/etc/atmark/containers/example2.conf

set_autostart no

を記述します。

2. 以降の設定ファイルを置くディレクトリ(/etc/my_etc)を作成

下記コマンドで/etc/my_etcを作成します。

armadillo:~# mkdir /etc/my_etc


3. 「コンテナ選択可能状態」のスイッチ(SW1)のコンフィグファイルを作成

「5秒長押しでexample2、それ以外はexample1を起動する」buttondのコンフィグファイル
(select_container_buttond.conf)を上記手順2で作成した/etc/my_etcディレクトリ内に下記の内容で作成します。

/etc/my_etc/select_container_buttond.conf

BUTTOND_ARGS="$BUTTOND_ARGS -l prog1 -t 5000 -a 'echo example2 > /tmp/select_container'"

補足)スイッチ(SW1)を5秒以上長押しすると、/tmp/select_containerに"example2"と記述します。

/etc/my_etc/select_container_buttond.confをeMMCに保存します。

armadillo:~# persist_file /etc/my_etc/select_container_buttond.conf


4. 「コンテナ起動後」のスイッチ(SW1)のコンフィグファイルを作成

「5秒長押しでreboot、10秒長押しでpoweroffする」buttondのコンフィグファイル
(normal_buttond.conf)を上記手順2で作成した/etc/my_etcディレクトリ内に下記の内容で作成します。
/etc/my_etc/normal_buttond.conf

BUTTOND_ARGS="$BUTTOND_ARGS -l prog1 -t 5000 -a 'reboot'"
BUTTOND_ARGS="$BUTTOND_ARGS -l prog1 -t 10000 -a 'poweroff'"

補足)スイッチ(SW1)を5秒以上長押しでreboot、10秒長押しでpoweroffを実行します。

/etc/my_etc/normal_buttond.confをeMMCに保存します。

armadillo:~# persist_file /etc/my_etc/normal_buttond.conf


5. 「コンテナ選択可能状態」と「コンテナ起動後」のスイッチ(SW1)の機能を切り替えるスクリプトの作成

スイッチ(SW1)の機能を切り替えるスクリプト(select_container.start)を下記の内容で
/etc/local.dディレクトリに作成します。
補足)/etc/local.dディレクトリに、.start ファイルを置いておくと起動時に実行されます。

/etc/local.d/select_container.start

#!/bin/sh
 
echo example1 > /tmp/select_container
 
echo heartbeat > /sys/class/leds/led1/trigger
cp /etc/my_etc/select_container_buttond.conf /etc/atmark/buttond.conf
rc-service buttond restart
 
sleep 10
 
echo none > /sys/class/leds/led1/trigger
echo 1 > /sys/class/leds/led1/brightness
cp /etc/my_etc/normal_buttond.conf /etc/atmark/buttond.conf
rc-service buttond restart
 
CONTAINER=`cat /tmp/select_container`
 
podman_start $CONTAINER

補足)上記スクリプトはArmadilloが起動する自動実行され、下記のように動作します。
・/tmp/select_containerに、デフォルトで起動するコンテナ名"example1"を記述します。
・スイッチ(SW1)を「コンテナ選択可能状態」(上記手順3)での機能(※)にします。
 ※)5秒長押しで、/tmp/select_containerにコンテナ名"example2"を記述します。
・10秒経過後、/tmp/select_containerに記述されているコンテナ名のコンテナを起動します。
・スイッチ(SW1)を「コンテナ起動後」(上記手順4)での機能(※)にします。
 ※)5秒以上長押しでreboot、10秒長押しでpoweroffします。

/etc/local.d/select_container.startに実行権限を付けて、eMMCに保存します。

armadillo:~# chmod +x /etc/local.d/select_container.start
armadillo:~# persist_file /etc/local.d/select_container.start


以上を実施後、再起動すると、下記のように動作します。

LED(LED3)がHertbeatでチカチカ点滅する間(10秒間)に、スイッチ(SW1)で起動するコンテナを選択できます。
 5秒長押しでexample2を起動
 それ以外はexample1を起動
コンテナ起動後は、スイッチ(SW1)の5秒以上長押しでreboot、10秒長押しでpoweroffを実行します。

参考情報)上記で使用した機能(スイッチ、起動スクリプト)については、下記も合わせて参考ください。
Armadillo-IoT ゲートウェイ G4製品マニュアル「9.11.4. ボタンやキーを扱う」
Armadillo-IoT ゲートウェイ G4製品マニュアル「9.11.5. Armadillo Base OS 側の起動スクリプト」
G4:ユーザースイッチのみでシャットダウン、リブートを行う方法