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 //失敗
コメント
yasuda0108
> 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…
> 実行結果は下記になります。
ありがとうございます。
手動の "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
> > 実行結果は下記になります。
>
> ありがとうございます。
> 手動の "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…
> 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
at_dominique.m…
2022年4月19日 10時55分
yasuda0108さん
エラーに直接関係ないかもしれませんが、
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でシェルで起動されたコンテナでも同じ現象が起きるかを確認していただけますか?
よろしくお願いします。