Armadilloフォーラム

aiot-alarm-poweroff をpodmanコンテナから実行する方法

lmj_iot

2023年4月20日 15時29分

Armadillo-IoT A6Eでpodmanを使用しています。
起動したpodmanコンテナから aiot-alarm-poweroff を実行して、ホストマシンをスリープさせたいのですが
コンテナからaiot-alarm-poweroffは実行可能でしょうか。どのようにすればよいでしょうか。

自動運転による間欠運転を行いたく、ホストマシン起動時にコンテナ起動して、コンテナの処理の完了時にホストマシンをスリープさせる方法を検討しています。
よろしくお願いいたします。

コメント

アットマークテクノの古賀です。

lmj_iotさん:
>Armadillo-IoT A6Eでpodmanを使用しています。
>起動したpodmanコンテナから aiot-alarm-poweroff を実行して、ホストマシンをスリープさせたいのですが
>コンテナからaiot-alarm-poweroffは実行可能でしょうか。どのようにすればよいでしょうか。
>
>自動運転による間欠運転を行いたく、ホストマシン起動時にコンテナ起動して、コンテナの処理の完了時にホストマシンをスリープさせる方法を検討しています。

A6E に標準搭載しているゲートウェイコンテナで間欠動作するための仕組みを、流用するのが簡単です。マニュアルの、「状態遷移トリガにコンテナ終了通知を利用する」に記載している手順の仕組みを使い、コンテナの処理の完了時、つまり、コンテナの終了時にホスト(A6E)をスリープさせ、RTC 起床でスリープから復帰した時にコンテナを自動起動する、という運用ができます。
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

ゲートウェイコンテナではなく、別のコンテナを間欠動作させるために必要な設定は、次の通りです:

1.) お使いのコンテナに対する、/etc/atmark/containers/ に配置している .conf ファイルに、次の行を追加する:

add_args --hooks-dir=/etc/containers/aiot_gw_container_hooks.d

2.) /etc/conf.d/power-utils.conf で TARGET の値に指定しているコンテナの名前を、a6e-gw-container から、お使いのコンテナの名前に変更する。

いかがでしょうか?

古賀様
早速のご回答ありがとうございます。
マニュアルにあることに気付かず大変失礼いたしました。
試してみたところ、コンテナ終了を検知してホストのスリープとRTCによる再起動を行うことができました。感謝いたします。

追加での質問ですが、こちらの /etc/conf.d/power-utils.conf ファイルの
WAKEUP='RTC:300'
で指定するスリープ時間をその都度変更することは可能でしょうか
コンテナからconfファイルをマウントしてRTC:xxxを書き換えれば良いのでしょうか。
夜間と昼間でスリープ時間を変更したく、コンテナ終了時に時刻を基にスリープ時間を指定することを考えています。

どうぞよろしくお願いいたします。

アットマークテクノの古賀です。

lmj_iotさん:
>追加での質問ですが、こちらの /etc/conf.d/power-utils.conf ファイルの
>WAKEUP='RTC:300'
>で指定するスリープ時間をその都度変更することは可能でしょうか

はい。可能です。power-utils サービスは、コンテナの終了通知を受けて電源状態を遷移させる際に、その都度 power-utils.conf の内容を読んで動作に反映させるようになっています。

>コンテナからconfファイルをマウントしてRTC:xxxを書き換えれば良いのでしょうか。
>夜間と昼間でスリープ時間を変更したく、コンテナ終了時に時刻を基にスリープ時間を指定することを考えています。

コンテナ内部から、その外側にあるファイル、特に power-utils.conf など Base OS のシステム設定ファイルを操作するのは好ましくありませんので、別の方法がよいですね。

実は、ここでもコンテナの設定ファイルを利用できます。/etc/atmark/containers/ に配置している .conf ファイルには、/bin/sh が実行するシェルスクリプト内容を記述できますので、.conf ファイル内に、現在日時を見て日時に応じて /etc/conf.d/power-utils.conf ファイル内の WAKEUP 行を書き換える処理を記述すればよいでしょう。

ただし、CON10(RTCバックアップインターフェース) に電池を装着せずに運用される場合は、電源投入後の最初のコンテナ起動時や、間欠動作でシャットダウンモードを使う際に日時取得に関する対応が必要だと思います。電源投入による起動直後の状態では、(特に LTE 接続の場合に)ネットワーク接続が完了しておらず、NTP サーバーから日時を取得できていない可能性があります。そのため、取得した日時が epoch time に近いかどうかを見て、現在日時ではないと判断される場合は、現在日時を取得できるようになるまで待ってから power-utils.conf ファイルの設定内容変更処理を実行するように実装するのが安全です。

現在日時を取得できるようになるまで待ってから、日時に応じた処理を行うようにする場合は、以下のような記述にして、待ち動作を伴う動作をバックグラウンド実行させればよいかと思います:

check_time_and_update_sleep_duration() {
    # 現在日時と思われる日時が取得できるようになるまで待つ
    # 時刻に応じて /etc/conf.d/power-utils.conf の内容を変更
}
 
check_time_and_update_sleep_duration &

いかがでしょうか?

古賀様
詳細なご回答ありがとうございます。コンテナの設定confファイルからスクリプトにより書き換えるのですね。
ご教示いただいた方法を試してみます。

古賀様
ご教示いただいた方法で、その都度スリープ時間を書き換えてからホストをスリープさせることができました。
コンテナの設定confファイルが活用できることが分り助かりました。
この度は誠にありがとうございました。