Armadilloフォーラム

コンテナ自動作成によるシリアル通信エラーについて

yasuda0108

2022年4月19日 10時30分

Armadillo-G4にて、シリアル通信を行うAPP(Qtで作成)を実行する際に、
コンテナを自動で作成した場合に、シリアル通信に失敗してしまいます。

コンテナ自動起動の記述に問題があるのでしょうか。

以下に現状を記述します。

#コンテナ手動作成コマンド
armadillo:~# podman run -itd --name=syTest \
> --env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu \
> --env=QT_QPA_PLATFORM=linuxfb \
> --device=/dev/dri \
> --device=/dev/galcore \
> --device=/dev/fb0 \
> --volume=/sys:/sys \
> --volume=/dev:/dev \
> --volume=/run/udev:/run/udev \
> --volume=/opt/firmware:/opt/firmware \
> --privileged \
> localhost/moni:v0.02 /bin/bash
 
#コンテナ自動起動.confファイル
armadillo:~# cat /etc/atmark/containers/jiTest.conf
image="localhost/moni:v0.02"
volumes="/sys:/sys /dev:/dev /run/udev:/run/udev /opt/firmware:/opt/firmware"
devices="/dev/dri /dev/galcore /dev/fb0"
readonly=yes
autostart=yes
append_args=--env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu
append_args=--env=QT_QPA_PLATFORM=linuxfb
append_args --privileged
append_args -ti
set_command /bin/bash 
 
#コンテナ一覧
CONTAINER ID  IMAGE                      COMMAND      CREATED         STATUS                    PORTS       NAMES
14e2023e795b  localhost/gk_moni:v0.02    /bin/bash    20 minutes ago  Exited (1) 5 seconds ago              syTest
4b9fd7abaa93  localhost/gk_moni:v0.02    /bin/bash    52 years ago    Up 22 minutes ago                     jiTest
 
#手動作成コンテナ内でシリアル通信APP実行
root@14e2023e795b:/home/MONI# ./MONI
//使用可能なポートの検索
Name        :  "ttymxc0"
Name        :  "ttymxc2"
Name        :  "ttymxc1"
//ttymxc2のポート開放を実行
Port open successful
//成功
 
#自動作成コンテナ内でシリアル通信APP実行
root@4b9fd7abaa93:/home/MONI# ./MONI
//使用可能なポートの検索
Name        :  "ttymxc0"
Name        :  "ttymxc2"
Name        :  "ttymxc1"
//ttymxc2のポート開放を実行
Port open failure
//失敗
コメント

at_dominique.m…

2022年4月19日 10時55分

yasuda0108さん

> append_args=--env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu
> append_args=--env=QT_QPA_PLATFORM=linuxfb

エラーに直接関係ないかもしれませんが、
https://armadillo.atmark-techno.com/forum/armadillo/11408#comment-10987 に言っていました通り、
append_argsは変数ではないので、 =サインを使うと効果がなくなります。
`append_args --env=QT_QPA_PLATFORM=linuxfb` を使いください。

それ以外は同じに見えますので、2点を確認していただけると幸いです:
- podman_start の確認: podman_start -a -v で実行すれば、podman run コマンドの詳細を確認できます。そのコマンドをこちらにコピーしていただけますか?そちらのコマンドと手動のコマンドを比べて何かわかるかもしれません。

- --privileged オプションは devicesと同じく、起動時のデバイスをコンテナに作成しますが、タイミングによってコンテナがttymxc2の準備が終わる前に起動されるかもしれません。
./MONI の出力にリストされるので、これも問題ないと思いますが、自動起動ではなくpodman_startでシェルで起動されたコンテナでも同じ現象が起きるかを確認していただけますか?

よろしくお願いします。

yasuda0108

2022年4月19日 12時03分

> yasuda0108さん
>
>

> > append_args=--env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu
> > append_args=--env=QT_QPA_PLATFORM=linuxfb
> 

>
> エラーに直接関係ないかもしれませんが、
> https://armadillo.atmark-techno.com/forum/armadillo/11408#comment-10987 に言っていました通り、
> append_argsは変数ではないので、 =サインを使うと効果がなくなります。
> `append_args --env=QT_QPA_PLATFORM=linuxfb` を使いください。
>
以前ご指摘頂いた内容ですが、どうやら修正後保存できていなかったようです。。失礼しました。
下記の通り修正しました。

armadillo:~# cat /etc/atmark/containers/jiTest.conf
image="localhost/gk_moni:v0.02"
volumes="/sys:/sys /dev:/dev /run/udev:/run/udev /opt/firmware:/opt/firmware"
devices="/dev/dri /dev/galcore /dev/fb0"
readonly=yes
autostart=yes
append_args --env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu
append_args --env=QT_QPA_PLATFORM=linuxfb
append_args --privileged
#append_args -w /home/0411_R577_MONI
#set_command ./R577_MONI
append_args -ti
set_command /bin/bash 

>
> それ以外は同じに見えますので、2点を確認していただけると幸いです:
> - podman_start の確認: podman_start -a -v で実行すれば、podman run コマンドの詳細を確認できます。そのコマンドをこちらにコピーしていただけますか?そちらのコマンドと手動のコマンドを比べて何かわかるかもしれません。
>
実行結果は下記になります。

armadillo:~# podman_start -a -v
Starting 'io-auto'
eval podman run -d --name 'io-auto' --replace --read-only --read-only-tmpfs=false --mount type=tmpfs,target=/dev/shm,ro=true --log-opt max-size=1mb --restart
=on-failure --pull=never  '-w' '/home' '--device=/dev/dri:/dev/dri' '--volume=/sys:/sys' '--volume=/dev:/dev' '--volume=/run/udev:/run/udev' 'localhost/gk-io
ctrl:v0.00'  './initIO.sh'
938046b7471655e693a92c95f000c5ec77b966878b39848b58b7c98433946702
[  159.560244] IPv6: ADDRCONF(NETDEV_CHANGE): vethd356d274: link becomes ready
[  159.567362] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[  159.574350] cni-podman0: port 2(vethd356d274) entered blocking state
[  159.580804] cni-podman0: port 2(vethd356d274) entered disabled state
[  159.587310] device vethd356d274 entered promiscuous mode
[  159.592721] cni-podman0: port 2(vethd356d274) entered blocking state
[  159.599083] cni-podman0: port 2(vethd356d274) entered forwarding state
c1ef2679f3248ce179eab5e317c54c02cb99448020825f8c6ae41ebd49b4eef2
Starting 'jiTest'
eval podman run -d --name 'jiTest' --replace --read-only --read-only-tmpfs=false --mount type=tmpfs,target=/dev/shm,ro=true --log-opt max-size=1mb --restart
=on-failure --pull=never  '--env=LD_LIBRARY_PATH=/opt/firmware/usr/lib/aarch64-linux-gnu' '--env=QT_QPA_PLATFORM=linuxfb' '--privileged' '-ti' '--device=/dev
/dri:/dev/dri' '--device=/dev/galcore:/dev/galcore' '--device=/dev/fb0:/dev/fb0' '--volume=/sys:/sys' '--volume=/dev:/dev' '--volume=/run/udev:/run/udev' '--
volume=/opt/firmware:/opt/firmware' 'localhost/gk_moni:v0.02'  '/bin/bash'
[  160.029556] cni-podman0: port 2(vethd356d274) entered disabled state
[  160.036717] device vethd356d274 left promiscuous mode
[  160.041845] cni-podman0: port 2(vethd356d274) entered disabled state
[  170.296947] cni-podman0: port 1(veth299ef99e) entered disabled state
[  170.303954] device veth299ef99e left promiscuous mode
[  170.309070] cni-podman0: port 1(veth299ef99e) entered disabled state
eb771e6bab801d3044cd22a3e0c3271d124b18ec2f8bc60ee3a8c29ebbec546c
[  170.580901] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[  170.587569] cni-podman0: port 1(veth53d25aae) entered blocking state
[  170.593973] cni-podman0: port 1(veth53d25aae) entered disabled state
[  170.600466] device veth53d25aae entered promiscuous mode
[  170.605881] cni-podman0: port 1(veth53d25aae) entered blocking state
[  170.612245] cni-podman0: port 1(veth53d25aae) entered forwarding state
fcf50a37805de2f0ebcefce918c616fd67b78d59c581b4e72bc32626fc3fcd86

> - --privileged オプションは devicesと同じく、起動時のデバイスをコンテナに作成しますが、タイミングによってコンテナがttymxc2の準備が終わる前に起動されるかもしれません。

なるほど、今回の場合--privileged オプションは外しても問題ないのでしょうか。

> ./MONI の出力にリストされるので、これも問題ないと思いますが、自動起動ではなくpodman_startでシェルで起動されたコンテナでも同じ現象が起きるかを確認していただけますか?

シェルで起動したコンテナで実行しましたが、同様の現象が起きました。

armadillo:~# podman start -a jiTest
root@eb771e6bab80:/# cd /home/MONI
root@eb771e6bab80:/home/MONI# ./MONI
Start Up Time 0.251
Name        :  "ttymxc0"
Name        :  "ttymxc2"
Name        :  "ttymxc1"
Port open failure

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

at_dominique.m…

2022年4月19日 12時45分

> 実行結果は下記になります。

ありがとうございます。
手動の "syTest" に比べたら、以下の差があります:
- --replace --log-opt max-size=1mb --restart=on-failure --pull=never
動作に影響がないはずです。
- --read-only --read-only-tmpfs=false --mount type=tmpfs,target=/dev/shm,ro=true
先ほど気づきませんでしたが、readonly=true によるオプションです。
readonly=true を設定すると、一時的なファイルも使えなくなりますのでこれで動かない可能性が高いと思います。

この設定を外してみればう動くようになりますか?
readonly=false(デフォルト)で動きましたら、アプリケーションが多分/tmpかどこかに一時的なファイルを使ってttymxc2を開けてますので、アプリケーションでも対応できるかもしれません。
privilegedなコンテナなので、 strace をインストールして strace ./MONI で引っかかるファイルを見つけると思います。

> なるほど、今回の場合--privileged オプションは外しても問題ないのでしょうか。

そうですね、--privileged は開発用の便利機能としてありますが、コンテナのセキュリティのメリットがなくなりますのでできれば適切な代わりのオプションを見つけて運用で使うといいです…が、その「適切な代わりのオプションを見つける」万能方法はありませんので、手探りになります…

手順っぽいものをブログか開発ガイドに足したいと思いますので、申し訳ないですができるまで待っていただきませんか。
(もちろん試しても構いませんが、今月はあまり余裕がないのであまり手伝えないかもしれません)

よろしくお願いします。

yasuda0108

2022年4月19日 13時33分

> > 実行結果は下記になります。
>
> ありがとうございます。
> 手動の "syTest" に比べたら、以下の差があります:
> - --replace --log-opt max-size=1mb --restart=on-failure --pull=never
> 動作に影響がないはずです。
> - --read-only --read-only-tmpfs=false --mount type=tmpfs,target=/dev/shm,ro=true
> 先ほど気づきませんでしたが、readonly=true によるオプションです。
> readonly=true を設定すると、一時的なファイルも使えなくなりますのでこれで動かない可能性が高いと思います。
>
> この設定を外してみればう動くようになりますか?
> readonly=false(デフォルト)で動きましたら、アプリケーションが多分/tmpかどこかに一時的なファイルを使ってttymxc2を開けてますので、アプリケーションでも対応できるかもしれません。
> privilegedなコンテナなので、 strace をインストールして strace ./MONI で引っかかるファイルを見つけると思います。
>

readonly=falseにすることで、無事実行できました。ありがとうございました。
本ボードの運用方法として、ボード終了方法は、シャットダウンではなく電圧OFFでの終了を想定しています。
そのため、readonly=trueに設定しておいたのですが、これが良くなかったのですね。
readonly=flaseの場合でも、下記で回答頂いている通り、シャットダウンではなく電源OFFでも問題ない認識ですが、よろしいでしょうか。
https://armadillo.atmark-techno.com/forum/armadillo/10747

>
> > なるほど、今回の場合--privileged オプションは外しても問題ないのでしょうか。
>
> そうですね、--privileged は開発用の便利機能としてありますが、コンテナのセキュリティのメリットがなくなりますのでできれば適切な代わりのオプションを見つけて運用で使うといいです…が、その「適切な代わりのオプションを見つける」万能方法はありませんので、手探りになります…
>
> 手順っぽいものをブログか開発ガイドに足したいと思いますので、申し訳ないですができるまで待っていただきませんか。
> (もちろん試しても構いませんが、今月はあまり余裕がないのであまり手伝えないかもしれません)
>
> よろしくお願いします。

ありがとうございます。
--privilegedに関しては急ぎではありませんので、開発ガイドを待ちたいと思います。

at_dominique.m…

2022年4月19日 13時54分

> readonly=falseにすることで、無事実行できました。ありがとうございました。
> 本ボードの運用方法として、ボード終了方法は、シャットダウンではなく電圧OFFでの終了を想定しています。
> そのため、readonly=trueに設定しておいたのですが、これが良くなかったのですね。
> readonly=falseの場合でも、下記で回答頂いている通り、シャットダウンではなく電源OFFでも問題ない認識ですが、よろしいでしょうか。
> https://armadillo.atmark-techno.com/forum/armadillo/10747

はい、podman_switch_storage --disk を実行しないかぎりpodmanのコンテナイメージはtmpfsで保存しますので、電源を切ってもOSとイメージが化ける恐れはありません。
read-writeのデータは以下の通りにありますので、そちらを使っていたら注意が必要です:
- /var/app/volumes か /var/app/rollback/volumes のデータディレクトリを volumes で使う場合
- host側の /var/log も rw でsyslogが使いますすが、化けてもログなしで実行しつづけます。

それ以外のデータはread-onlyでマウントされてますので、化けないはずです。

(readonlyの設定の目標は長い時間の運用にその tmpfs が full になる可能性があるので、最初から書けないようにしたらこの心配がなくなります。)

--privilegedについても承知いたしました、できる次第ここで連絡します。

よろしくおねがいします。

yasuda0108

2022年4月19日 15時34分

ご回答ありがとうございます。
内容理解いたしました。
引き続きよろしくお願いいたします。