Armadilloフォーラム

コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する

hts_yosakai

2024年10月1日 13時51分

コンテナを定時(毎時30分等)に起動できるようにしたいため、
armadillo-iotg-a6e_product_manual_ja-2.14.0で追加された
6.1.5. コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する
を参考に実行してみましたが、下記エラーが発生してうまく動作しませんでした。
対応方法をご教示ください。

error: volume path '/etc/atmark/power-utils:/tmp/power-utils' cannot contain columns

VisualStudioCodeを使用して、Python New ProjectからPythonのプロジェクトを生成しています。
atde9-amd64-20240925(VirtualBox)、atde9-amd64-20240826(VmWareWorkstation)
いずれのバージョンでも同じでした。

コンテナのconfファイルに、
#add sleep parameter
[ -e /etc/atmark/power-utils ] || mkdir /etc/atmark/power-utils
add_volume /etc/atmark/power-utils:/tmp/power-utils
を追加しました。

エラーメッセージが出て、コンテナの起動に失敗しますが、
loginして確認すると/etc/atmark/power-utilsのフォルダは出来上がっていました。

vscodeのapp.confファイルを添付いたします。

コンテナ内のプログラムにて、/tmp/power-utils/sleep_secsにスリープ時間<3600を書き込んでコンテナを終了
書き込んだ時間(秒)経過後にwakeupしてコンテナの起動がかかる
という認識で間違いないでしょうか?

以上、よろしくお願いいたします。

ファイル ファイルの説明
app.conf
コメント

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

hts_yosakaiさん:
>コンテナを定時(毎時30分等)に起動できるようにしたいため、
>armadillo-iotg-a6e_product_manual_ja-2.14.0で追加された
>6.1.5. コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する
>を参考に実行してみましたが、下記エラーが発生してうまく動作しませんでした。
>対応方法をご教示ください。
>
>error: volume path '/etc/atmark/power-utils:/tmp/power-utils' cannot contain columns1.

取り急ぎ、二点確認させてください:

1.) ご質問の投稿時に選択された「対象製品」が "Armadillo-IoT G3L" になっていますが、G3L ではなく A6E でしょうか?

2.) お手元の Armadillo の Armadillo Base OS のバージョンは、何でしょうか?
 弊社 Blog で、Armadillo Base OS のソフトウェアバージョンの確認方法を説明しています。そちらをご覧になって確認してくださいませ:
  https://armadillo.atmark-techno.com/blog/15349/22118

>VisualStudioCodeを使用して、Python New ProjectからPythonのプロジェクトを生成しています。
>atde9-amd64-20240925(VirtualBox)、atde9-amd64-20240826(VmWareWorkstation)
>いずれのバージョンでも同じでした。

マニュアルの上記箇所で説明しているのは、今年8月の月例リリースでリリースした Armadillo Base OS 3.20.2-at.2 で追加した機能なのです:
 https://armadillo.atmark-techno.com/news/20240828/update-aiota6e

もし、お手元の Armadillo が Armadillo-IoT A6E であり、Armadillo Base OS のバージョンが 3.20.2-at.2 より古い場合は、Armadillo-IoT A6E のソフトウェアダウンロードページにある「Armadillo-IoT ゲートウェイ G4 Armadillo Base OS」のリンク先から Base OS の SWU イメージをダウンロードして、SWU イメージを使ってアップデートしてください:
 https://armadillo.atmark-techno.com/resources/software
 https://armadillo.atmark-techno.com/resources/software/armadillo-iot-a6…

Armadillo Base OS の現在時点の最新版は、9月にリリースした 3.20.3-at.3 です。

回答ありがとうございます。
製品選択がうまくいっていなかったようです。
A6Eを使用しています。

baseos-6e-installer-3.20.3-at.3.zipを使用して、
SDカードからインストール
inital_setup.swu
oontainer_clea.swu
作成したコンテナのインストール
の手順で行っています。

ABOS WebのSWUインストールの画面では以下のような表示になっています。
現在の SWU で管理されているバージョン
コンポーネント バージョン
base_os 3.20.3-at.3
boot 2020.4-at24
container_clear 2
extra_os.a6e-gw-container 2.6
extra_os.initial_setup 4
extra_os.waterlv 4
waterlv 4

以上、よろしくお願いいたします。

> アットマークテクノの古賀です。
>
> hts_yosakaiさん:
> >コンテナを定時(毎時30分等)に起動できるようにしたいため、
> >armadillo-iotg-a6e_product_manual_ja-2.14.0で追加された
> >6.1.5. コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する
> >を参考に実行してみましたが、下記エラーが発生してうまく動作しませんでした。
> >対応方法をご教示ください。
> >
> >error: volume path '/etc/atmark/power-utils:/tmp/power-utils' cannot contain columns1.
> …
>
> 取り急ぎ、二点確認させてください:
>
> 1.) ご質問の投稿時に選択された「対象製品」が "Armadillo-IoT G3L" になっていますが、G3L ではなく A6E でしょうか?
>
> 2.) お手元の Armadillo の Armadillo Base OS のバージョンは、何でしょうか?
>  弊社 Blog で、Armadillo Base OS のソフトウェアバージョンの確認方法を説明しています。そちらをご覧になって確認してくださいませ:
>   https://armadillo.atmark-techno.com/blog/15349/22118
>
> >VisualStudioCodeを使用して、Python New ProjectからPythonのプロジェクトを生成しています。
> >atde9-amd64-20240925(VirtualBox)、atde9-amd64-20240826(VmWareWorkstation)
> >いずれのバージョンでも同じでした。
>
> マニュアルの上記箇所で説明しているのは、今年8月の月例リリースでリリースした Armadillo Base OS 3.20.2-at.2 で追加した機能なのです:
>  https://armadillo.atmark-techno.com/news/20240828/update-aiota6e
>
>
> もし、お手元の Armadillo が Armadillo-IoT A6E であり、Armadillo Base OS のバージョンが 3.20.2-at.2 より古い場合は、Armadillo-IoT A6E のソフトウェアダウンロードページにある「Armadillo-IoT ゲートウェイ G4 Armadillo Base OS」のリンク先から Base OS の SWU イメージをダウンロードして、SWU イメージを使ってアップデートしてください:
>  https://armadillo.atmark-techno.com/resources/software
>  https://armadillo.atmark-techno.com/resources/software/armadillo-iot-a6…
>
> Armadillo Base OS の現在時点の最新版は、9月にリリースした 3.20.3-at.3 です。

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

hts_yosakaiさん:
>回答ありがとうございます。
>製品選択がうまくいっていなかったようです。
>A6Eを使用しています。
>
>baseos-6e-installer-3.20.3-at.3.zipを使用して、
>SDカードからインストール
>inital_setup.swu
>oontainer_clea.swu
>作成したコンテナのインストール
>の手順で行っています。

ご確認有り難うございます。Armadillo Base OS のバージョンも問題ないということですね。

hts_yosakaiさん(2024年10月1日 13時51分):
>コンテナのconfファイルに、
>#add sleep parameter
>[ -e /etc/atmark/power-utils ] || mkdir /etc/atmark/power-utils
>add_volume /etc/atmark/power-utils:/tmp/power-utils
>を追加しました。

add_volume /etc/atmark/power-utils:/tmp/power-utils

の行にある 'add_volume' を 'add_volumes' に変えてみてください。

ご回答ありがとうございます。

add_volumesに変更してエラーはなくなり、スリープに移行しました。
コマンドの間違いには気づきませんでした。
ありがとうございました。
プログラムで時間変更しての確認は引き続き行いたいと思います。

仕様書を修正しておいていただければと存じます。

以上、よろしくお願いいたします。

> アットマークテクノの古賀です。
>
> hts_yosakaiさん:
> >回答ありがとうございます。
> >製品選択がうまくいっていなかったようです。
> >A6Eを使用しています。
> >
> >baseos-6e-installer-3.20.3-at.3.zipを使用して、
> >SDカードからインストール
> >inital_setup.swu
> >oontainer_clea.swu
> >作成したコンテナのインストール
> >の手順で行っています。
>
> ご確認有り難うございます。Armadillo Base OS のバージョンも問題ないということですね。
>
> hts_yosakaiさん(2024年10月1日 13時51分):
> >コンテナのconfファイルに、
> >#add sleep parameter
> >[ -e /etc/atmark/power-utils ] || mkdir /etc/atmark/power-utils
> >add_volume /etc/atmark/power-utils:/tmp/power-utils
> >を追加しました。
>
>

> add_volume /etc/atmark/power-utils:/tmp/power-utils
> 

> の行にある 'add_volume' を 'add_volumes' に変えてみてください。

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

hts_yosakaiさん:
>ご回答ありがとうございます。
>
>add_volumesに変更してエラーはなくなり、スリープに移行しました。
>コマンドの間違いには気づきませんでした。
>ありがとうございました。

ご確認有り難うございます。マニュアルに TPYO があったせいでお手数をかけてしまい、申し訳ありません。

>プログラムで時間変更しての確認は引き続き行いたいと思います。

もし動作におかしなところがあれば、お知らせください。

>仕様書を修正しておいていただければと存じます。

マニュアルの当該箇所の修正は、今月末の月例アップデートに投入します。
有難うございました。

スリープに遷移して、指定時間後の起動確認は出来ました。
スリープ中に、SW1での起動が出来ないようなのですが、仕様でしょうか?
SW1はマスクできないとの認識でした。
SW1で起動することは出来ないでしょうか?

以上、よろしくお願いいたします。

> アットマークテクノの古賀です。
>
> hts_yosakaiさん:
> >ご回答ありがとうございます。
> >
> >add_volumesに変更してエラーはなくなり、スリープに移行しました。
> >コマンドの間違いには気づきませんでした。
> >ありがとうございました。
>
> ご確認有り難うございます。マニュアルに TPYO があったせいでお手数をかけてしまい、申し訳ありません。
>
> >プログラムで時間変更しての確認は引き続き行いたいと思います。
>
> もし動作におかしなところがあれば、お知らせください。
>
> >仕様書を修正しておいていただければと存じます。
>
> マニュアルの当該箇所の修正は、今月末の月例アップデートに投入します。
> 有難うございました。

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

hts_yosakaiさん:
>スリープ中に、SW1での起動が出来ないようなのですが、仕様でしょうか?

はい、仕様なのです。
マニュアルの「状態遷移トリガにコンテナ終了通知を利用する」での説明で、コンテナ終了時にスリープした後に起床するための起床要因を「起床条件」の表に記載していますが、SW1 で起床したい場合も、設定ファイルの WAKEUP 行で明示的に指定しなければいけません。
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
そのうえで、「コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する」の動作では、設定ファイルの WAKEUP 行の内容を無視します。
つまり、この動作の場合は、起床要因は SoC 内蔵 RTC のアラーム割り込みだけが起床要因になるのです。

>SW1はマスクできないとの認識でした。
>SW1で起動することは出来ないでしょうか?

現状は、できません。ごめんなさい。

今後、atmark-power-utils サービスの機能追加で、上記動作の場合にも power-utils.conf の WAKEUP 行の内容を動作に反映する対応を加えるかも知れません。
参考までにお聞きできると嬉しいのですが、「コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する」の動作を行う際に、スリープ中に SW1 でも起床できると嬉しいのは、どういう場合でしょうか?

仕様とのこと承知しました。

コンテナのconfファイル内で、power-utils.confのスリープ値を書き換えて対応できそうなので、
こちらで対応します。

ご質問の件、
不具合等があった時に、スリープ中にSW1で起動をかけてメンテナンス作業を行いたい場合に使用することを考えています。

ちなみに、スリープ中に電源がOFF→ONして問題はないでしょうか?

以上、よろしくお願いいたします。

> アットマークテクノの古賀です。
>
> hts_yosakaiさん:
> >スリープ中に、SW1での起動が出来ないようなのですが、仕様でしょうか?
>
> はい、仕様なのです。
> マニュアルの「状態遷移トリガにコンテナ終了通知を利用する」での説明で、コンテナ終了時にスリープした後に起床するための起床要因を「起床条件」の表に記載していますが、SW1 で起床したい場合も、設定ファイルの WAKEUP 行で明示的に指定しなければいけません。
>  https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
> そのうえで、「コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する」の動作では、設定ファイルの WAKEUP 行の内容を無視します。
> つまり、この動作の場合は、起床要因は SoC 内蔵 RTC のアラーム割り込みだけが起床要因になるのです。
>
> >SW1はマスクできないとの認識でした。
> >SW1で起動することは出来ないでしょうか?
>
> 現状は、できません。ごめんなさい。
>
> 今後、atmark-power-utils サービスの機能追加で、上記動作の場合にも power-utils.conf の WAKEUP 行の内容を動作に反映する対応を加えるかも知れません。
> 参考までにお聞きできると嬉しいのですが、「コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する」の動作を行う際に、スリープ中に SW1 でも起床できると嬉しいのは、どういう場合でしょうか?

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

hts_yosakaiさん:
>仕様とのこと承知しました。
>
>コンテナのconfファイル内で、power-utils.confのスリープ値を書き換えて対応できそうなので、
>こちらで対応します。

了解しました。
「コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する」で指定できる秒数は最大3600、つまり1時間であり、それ以上長くスリープしたい場合は、power-utils.conf の内容を参照する通常動作を使って欲しい、という意図の仕様です。
ですので、スリープしたい時間の長さに応じて使い分けて頂くのがよいと思います。

>ご質問の件、
>不具合等があった時に、スリープ中にSW1で起動をかけてメンテナンス作業を行いたい場合に使用することを考えています。

了解しました。
power-utils.conf の内容を参照する通常動作で使う SoC 外付けの RTC 起床では、最大59秒の誤差が起きますが、その誤差を無視/許容できる程度の長さでスリープする場合は、通常動作で使っていただくのがよいと思います。

実は、「コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する」の機能は、コンテナが自発終了するときに、その都度違うスリープ時間を指定したい、という要望に応えるために追加したものです。
機能追加するとしたら、通常動作で SoC 内蔵 RTC のアラーム割り込みも power-utils.conf の WAKEUP 行に起床要因として書けるようにする(※SoC 外付け RTC とは、排他な起床要因とならざるを得ませんが)、というのが良いのかも知れません。
いかがでしょうか?

>ちなみに、スリープ中に電源がOFF→ONして問題はないでしょうか?

はい。基本的には、問題ありません。
Armadillo Base OS の Linux カーネルのコンフィグレーションでは、SUSPEND_SKIP_SYNC が無効のまま(: デフォルト設定)になっており、/sys/power/sync_on_suspend の値が 1 ですから、Suspend to RAM する前にファイルシステムのキャッシュをフラッシュするはずです。

ただし、内蔵ストレージ(eMMC)や、microSD カードや USB メモリに対して、スリープする時にファイル書込みをしているプロセスがある場合、そのプロセスが書き込んだ内容は、スリープ中に電源 OFF->ON することで一部が失われる可能性があります。
つまり、ファイルシステムは壊れないものの、スリープにより途中で停止した書込み動作が、再開しないまま停止するため、書きこもうとしていたデータの残りがストレージに書き出されずに、失われる可能性があります。

power-utils.conf 内のRTCと、今回機能追加されたもので使用するRTCが異なっているんですね。。

基本的にはpower-utils.conf で設定した周期で起動して、起動周期を変えたいときに今回追加されて機能で対応するということですね。。

機能追加していただけるとしたら、指定時刻に起動できるようになるとうれしいですが、ハードアーキテクチャの問題になると思うので。。
毎正時、10分、20分・・・50分と、10分おきとか。。。30分おきとか。。

power-utils.confの設定で定間隔で起動し、現在時刻を見て、今回追加の機能を使用してスリープ時間を調整して決まった時刻に起動できるように調整するのが手っ取り早いのかなと考えています。

もっと簡単な方法があれば、ご教示いただけると助かります。

基本的なことかもしれないですが、コンテナの起動・停止、スリープ・スリープ解除、hook.sh、power-utils.confの参照シーケンスをご教示いただけないでしょうか?

以上、よろしくお願いいたします。

> アットマークテクノの古賀です。
>
> hts_yosakaiさん:
> >仕様とのこと承知しました。
> >
> >コンテナのconfファイル内で、power-utils.confのスリープ値を書き換えて対応できそうなので、
> >こちらで対応します。
>
> 了解しました。
> 「コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する」で指定できる秒数は最大3600、つまり1時間であり、それ以上長くスリープしたい場合は、power-utils.conf の内容を参照する通常動作を使って欲しい、という意図の仕様です。
> ですので、スリープしたい時間の長さに応じて使い分けて頂くのがよいと思います。
>
> >ご質問の件、
> >不具合等があった時に、スリープ中にSW1で起動をかけてメンテナンス作業を行いたい場合に使用することを考えています。
>
> 了解しました。
> power-utils.conf の内容を参照する通常動作で使う SoC 外付けの RTC 起床では、最大59秒の誤差が起きますが、その誤差を無視/許容できる程度の長さでスリープする場合は、通常動作で使っていただくのがよいと思います。
>
> 実は、「コンテナ終了後、指定した秒数だけスリープしてコンテナを再始動する」の機能は、コンテナが自発終了するときに、その都度違うスリープ時間を指定したい、という要望に応えるために追加したものです。
> 機能追加するとしたら、通常動作で SoC 内蔵 RTC のアラーム割り込みも power-utils.conf の WAKEUP 行に起床要因として書けるようにする(※SoC 外付け RTC とは、排他な起床要因とならざるを得ませんが)、というのが良いのかも知れません。
> いかがでしょうか?
>
> >ちなみに、スリープ中に電源がOFF→ONして問題はないでしょうか?
>
> はい。基本的には、問題ありません。
> Armadillo Base OS の Linux カーネルのコンフィグレーションでは、SUSPEND_SKIP_SYNC が無効のまま(: デフォルト設定)になっており、/sys/power/sync_on_suspend の値が 1 ですから、Suspend to RAM する前にファイルシステムのキャッシュをフラッシュするはずです。
>
> ただし、内蔵ストレージ(eMMC)や、microSD カードや USB メモリに対して、スリープする時にファイル書込みをしているプロセスがある場合、そのプロセスが書き込んだ内容は、スリープ中に電源 OFF->ON することで一部が失われる可能性があります。
> つまり、ファイルシステムは壊れないものの、スリープにより途中で停止した書込み動作が、再開しないまま停止するため、書きこもうとしていたデータの残りがストレージに書き出されずに、失われる可能性があります。

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

hts_yosakaiさん:
>power-utils.conf 内のRTCと、今回機能追加されたもので使用するRTCが異なっているんですね。。
>
>基本的にはpower-utils.conf で設定した周期で起動して、起動周期を変えたいときに今回追加されて機能で対応するということですね。。

はい、そうです。

>機能追加していただけるとしたら、指定時刻に起動できるようになるとうれしいですが、ハードアーキテクチャの問題になると思うので。。
>毎正時、10分、20分・・・50分と、10分おきとか。。。30分おきとか。。
>
>power-utils.confの設定で定間隔で起動し、現在時刻を見て、今回追加の機能を使用してスリープ時間を調整して決まった時刻に起動できるように調整するのが手っ取り早いのかなと考えています。

そうですね。おっしゃるように、起床したい日時から現在日時を引いた秒数を計算して、その秒数を設定していただくことで対応できると思います。
たとえば bash の場合、次のようにして現在日時との差分秒数を計算できますよね:

$ echo $(($(date +%s --date "2024-10-04 12:00:00") - $(date +%s)))

>基本的なことかもしれないですが、コンテナの起動・停止、スリープ・スリープ解除、hook.sh、power-utils.confの参照シーケンスをご教示いただけないでしょうか?

次のシーケンスになります:

1.) コンテナが自発終了する

2.) コンテナエンジン(podman)が、コンテナの終了/停止をトリガーとするフック動作を実行する

3.) (2)のフック動作で実行されるよう設定されているスクリプト(hook.sh)が、power-utils デーモンにコンテナ終了を通知する

4.) power-utils デーモンは、power-utils.conf を参照して起床要因を設定し、スリープまたはシャットダウンする
  (※シャットダウンする場合、有効な起床要因は SoC 外付け RTC のみ)
  ただし、/etc/atmark/power-utils/sleep_secs ファイルが存在し、その内容が、有効な秒数であれば、SoC 内蔵 RTC を起床要因としてスリープする

5.) スリープまたはシャットダウン前に設定された有効な起床要因が発生し、OS が起床(スリープの場合)または起動(シャットダウンの場合)する

6.) スリープしていた場合は、power-utils デーモンが、対象コンテナを起動する
  シャットダウンしていた場合は、自動起動設定されているコンテナを OS が起動する

いかがでしょうか?

解りやすい説明ありがとうございました。
いろんな方法がとれそうですね。
いろいろ試してみたいと思います。

> アットマークテクノの古賀です。
>
> hts_yosakaiさん:
> >power-utils.conf 内のRTCと、今回機能追加されたもので使用するRTCが異なっているんですね。。
> >
> >基本的にはpower-utils.conf で設定した周期で起動して、起動周期を変えたいときに今回追加されて機能で対応するということですね。。
>
> はい、そうです。
>
> >機能追加していただけるとしたら、指定時刻に起動できるようになるとうれしいですが、ハードアーキテクチャの問題になると思うので。。
> >毎正時、10分、20分・・・50分と、10分おきとか。。。30分おきとか。。
> >
> >power-utils.confの設定で定間隔で起動し、現在時刻を見て、今回追加の機能を使用してスリープ時間を調整して決まった時刻に起動できるように調整するのが手っ取り早いのかなと考えています。
>
> そうですね。おっしゃるように、起床したい日時から現在日時を引いた秒数を計算して、その秒数を設定していただくことで対応できると思います。
> たとえば bash の場合、次のようにして現在日時との差分秒数を計算できますよね:
>

> $ echo $(($(date +%s --date "2024-10-04 12:00:00") - $(date +%s)))
> 

>
>
> >基本的なことかもしれないですが、コンテナの起動・停止、スリープ・スリープ解除、hook.sh、power-utils.confの参照シーケンスをご教示いただけないでしょうか?
>
> 次のシーケンスになります:
>
> 1.) コンテナが自発終了する
>
> 2.) コンテナエンジン(podman)が、コンテナの終了/停止をトリガーとするフック動作を実行する
>
> 3.) (2)のフック動作で実行されるよう設定されているスクリプト(hook.sh)が、power-utils デーモンにコンテナ終了を通知する
>
> 4.) power-utils デーモンは、power-utils.conf を参照して起床要因を設定し、スリープまたはシャットダウンする
>   (※シャットダウンする場合、有効な起床要因は SoC 外付け RTC のみ)
>   ただし、/etc/atmark/power-utils/sleep_secs ファイルが存在し、その内容が、有効な秒数であれば、SoC 内蔵 RTC を起床要因としてスリープする
>
> 5.) スリープまたはシャットダウン前に設定された有効な起床要因が発生し、OS が起床(スリープの場合)または起動(シャットダウンの場合)する
>
> 6.) スリープしていた場合は、power-utils デーモンが、対象コンテナを起動する
>   シャットダウンしていた場合は、自動起動設定されているコンテナを OS が起動する
>
> いかがでしょうか?