shiroro
2025年6月23日 15時51分
==========
製品型番:AGX4520-C02D0
Debian/ABOSバージョン:3.21.3-at.13
カーネルバージョン:5.10.0-35-amd64
3G/LTE モジュール情報 (Debianのみ):
その他:
==========
flutter(dart)で、/home/atmark/test/にあるデータベースファイルを参照するプログラムを作成し「デバッグモードのアプリをATDEで実行」するとこのファイルを読み書きできるのですが、「デバッグモードのアプリをArmadilloで実行」すると、ファイルの存在が認識されなくなります。
(dartのsqfliteパッケージにdatabaseExists(引数にファイルパスを入力してそのパスのファイルがあればtrue、なければfalseを返す)メソッドがあるのですが、同じパスでもデバッグをATDEで実行するとtrue、Armadilloで実行を使用するとfalseが返ってきます。)
ATDE内にファイルを保存していることが原因かと思い、Armadillo内の/var/app/rollback/volumesに同じデータベースファイルをコピーして、参照するパスをこのパスに変更して「デバッグモードのアプリをArmadilloで実行」しても同様でした。
Armadilloからデバッグを行う際に、ファイルを参照するにはどのようにしたらよいでしょうか?
ご教示いただければ幸いです。
参照するファイルに対してlsコマンドを実行した結果は以下のとおりです。
atmark@atde9:~/test$ ls -l -rwxrwxrwx 1 atmark atmark 29696 6月 20 10:25 db2.sqlite4.db
armadillo:/var/app/rollback/volumes# ls -l -rwxrwxrwx 1 atmark atmark 29696 Jun 23 11:45 db2.sqlite4.db
コメント
shiroro
マルティネ様
お世話になっております。
> デフォルトの config/app.conf ファイルでは以下の設定はありますが、こちらのコンフィグでしたら Armadillo の /var/app/rollback/volumes にアプリケーション名のディレクトリが生成されるはずです。
> 存在してますか?
/var/app/rollback/volumesを確認すると、アプリケーション名のディレクトリが生成されていました。
ちなみに、 config/app.confを確認すると下記のようになっており、提示していただいたものと少し異なっていましたが、影響はあるでしょうか?
# mount app sources and data: # - /var/app/rollback/volumes can be rolled back on failed # upgrades, suitable for application sources and assets. # - /var/app/volumes is not copied on updates and more suitable # for volatile data such as logs and databases. add_volumes /var/app/rollback/volumes/{{PROJECT}}:/vol_app add_volumes /var/app/volumes/{{PROJECT}}:/vol_data
また、
> - /var/app/rollback/volumes/[appli]
は /vol_app
からアクセスできて、読み取り専用になっています
> - /var/app/rollback/[appli]
は /vol_data
からアクセスできます。
armadilloについてきちんと理解できておらず申し訳ないのですが、/vol_app
と、 /vol_data
はContaier内のディレクトリでよろしいでしょうか?
/vol_data
に参照したいファイルを保存して、flutterでパスを指定するとflutterから参照できる、ということでしょうか?
いくつも質問してしまって申し訳ありませんが、ご確認のほどよろしくお願いいたします。
at_dominique.m…
マルティネです。
> /var/app/rollback/volumesを確認すると、アプリケーション名のディレクトリが生成されていました。
> ちなみに、 config/app.confを確認すると下記のようになっており、提示していただいたものと少し異なっていましたが、影響はあるでしょうか?
/vol_app は読み取り専用にされてないですね。
その変更は今年の2月に行った変更ですので、このプロジェクトはその前に作成したのではないかと思います。
意図せずに変更できてしまいますので 「:ro
」を追加しただけで、特に問題を修正したわけではないので、追加してもしなくても問題ありません。
(vscode プロジェクトの更新は簡単にできませんので、念の為に新しいバージョンを使いたい場合は新しく作って flutter のソース等の変更したファイルをコピーする形になります。不器用で申し訳ございません)
> > - /var/app/rollback/volumes/[appli]
は /vol_app
からアクセスできて、読み取り専用になっています
> > - /var/app/rollback/[appli]
は /vol_data
からアクセスできます。
すみません、2つ目のパスは誤記でしたので訂正させてください。こちらでした:
- /var/app/volumes/[appli] は /vol_data からアクセスできます。
> armadilloについてきちんと理解できておらず申し訳ないのですが、/vol_app
と、 /vol_data
はContaier内のディレクトリでよろしいでしょうか?
はい。シリアルコンソールや ssh で接続するとArmadillo Base OS の「ホスト」上でログインされていますので、そちらでは /var/app/volumes 等のパスになりますが、
flutter のアプリケーションとしては /vol_data か /vol_app としてディレクトリが存在して同じ内容をアクセスできます。
コンソールから「podman exec -ti [アプリ名] bash
」等を実行すると、flutter アプリと同じディレクトリ構造を確認できます。(exit または ctrl-d でログアウトできます)
> /vol_data
に参照したいファイルを保存して、flutterでパスを指定するとflutterから参照できる、ということでしょうか?
はい、flutter で /vol_data/db2.sqlite4.db を参照するようにしたら、実際に /var/app/volumes/[アプリ名]/db2.sqlite4.db
を参照するようになります。
よろしくお願いします
shiroro
回答ありがとうございます。
今起動中のコンテナは以下のようになっていまして、signageplayerのデバッグをしようとしています。
armadillo:~# podman ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f50e11dfbd69 localhost/signageplayer:latest flutter_launch 55 years ago Up 7 seconds 0.0.0.0:41077->41077/tcp signageplayer
TeraTerm上でpodman exec -ti signageplayer bash
を入力すると、
名前がroot@f50e11dfbd69:~#になるのですが、数秒で自動的にarmadillo:~#に戻ってしまい、コンテナ操作ができません。
また、コンテナ内に入る他の方法として、podman attach signageplayer
を試してみましたが、入力すると下記のようなエラーメッセージが出てきます。
armadillo:~# podman attach signageplayer flutter: The Dart VM service is listening on http://0.0.0.0:41077/2thV5tvwQ2U=/ [04:27:55.343] libwayland: error in client communication (pid 33) xdg_wm_base@11: error 4: xdg_surface buffer (1280 x 720) is larger than the configured fullscreen state (0 x 0) EGL: errno=71 (Protocol error)
podman exec -ti signageplayer bash
ですぐコンテナを抜けてしまう原因、もしくはpodman attach signageplayer
でコンテナに入れない原因はわかりますでしょうか?
もしくは、ATDE上からコンテナの/vol_data に直接ファイルをコピーする方法はあるでしょうか?
at_dominique.m…
マルティネです。
> 今起動中のコンテナは以下のようになっていまして、signageplayerのデバッグをしようとしています。
>
> armadillo:~# podman ps -a > CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES > f50e11dfbd69 localhost/signageplayer:latest flutter_launch 55 years ago Up 7 seconds 0.0.0.0:41077->41077/tcp signageplayer >
>
> TeraTerm上でpodman exec -ti signageplayer bash
を入力すると、
> 名前がroot@f50e11dfbd69:~#になるのですが、数秒で自動的にarmadillo:~#に戻ってしまい、コンテナ操作ができません。
flutter アプリケーションが終了するとコンテナも終了してしまい、podman exec のコマンドも去勢的に終了されます。
(「Up 7 seconds」からも、コンテナが ps 実行より7秒前にリスタートされたとのことですので、ループでコンテナが再起動しているようです)
> また、コンテナ内に入る他の方法として、podman attach signageplayer
を試してみましたが、入力すると下記のようなエラーメッセージが出てきます。
attach もコンテナのメインコマンドの出力を取得して、コンテナ終了時にコマンドも終了します。
出力されたエラーメッセージを解決すると終了しなくなるのではないかと思います。
> armadillo:~# podman attach signageplayer > flutter: The Dart VM service is listening on http://0.0.0.0:41077/2thV5tvwQ2U=/ > [04:27:55.343] libwayland: error in client communication (pid 33) > xdg_wm_base@11: error 4: xdg_surface buffer (1280 x 720) is larger than the configured fullscreen state (0 x 0) > EGL: errno=71 (Protocol error)
もうしわけございません、こちらのエラーは flutter の問題で、fullscreen で起動すると画面がないとすぐに失敗します。
画面を接続していただければ解決されると思います。
また、 https://armadillo.atmark-techno.com/forum/armadillo/22954 の以前のフォーラムを参考にすると 「container/resources_flutter/bin/flutter_launch
」ファイルから flutter_main の「-f」オプションを外すと fullscreen が解除されて起動できますが、いかがでしょうか。
> もしくは、ATDE上からコンテナの/vol_data に直接ファイルをコピーする方法はあるでしょうか?
コンテナの /vol_data は armadillo (ホスト側)の /var/app/volumes/signageplayer と同じディレクトリですので、そちらにデータを転送していただければと思います。
SWUで量産を行う予定でしたら desc ファイルの swdesc_files 命令で転送できます。そうでない場合は scp (scp -F [path to signageplayer]/config/ssh_config [file] Armadillo:[dest]
) またはコンソールと usb メモリなどで転送できます。
よろしくお願いします。
shiroro
回答ありがとうございます。
/var/app/volumesに読み込みたいファイル(db2.sqlite4.db)はコピーできました。
lsコマンドの結果は以下の通りとなっています。
armadillo:/# ls -l /var/app/volumes total 32 -rwxr-xr-x 1 root root 29696 Jun 24 14:50 db2.sqlite4.db drwxr-xr-x 1 root root 0 Jun 12 13:03 signageplayer
ただ、flutter上で/vol_data/db2.sqlite4.dbを指定しても、ファイルが認識されませんでした。
下記のようにdart上でファイルパスを/vol_data/db2.sqlite4.dbとして、ファイルが存在していれば処理を進めるようにしているのですが、以前と変わらずfalseになってしまいます。
import "package:sqflite/sqflite.dart"; ~略~ var filepath = "/vol_data/db2.sqlite4.db"; //データベースを開く if( await databaseExists( filepath ) ) ←ここがfalseになる { データベースの処理 } ……… …… …
他にファイルを読み込めるようにするために確認しておくことはあるでしょうか?
>もうしわけございません、こちらのエラーは flutter の問題で、fullscreen で起動すると画面がないとすぐに失敗します。
>画面を接続していただければ解決されると思います。
画面接続すると先程のエラーは表示されなくなりましたが、podman attach signageplayer
を入力後にエンターキーを押しても改行されるだけでarmadillo:~#もroot@f50e11dfbd69:~#も表示されない状態になりました。
at_dominique.m…
マルティネです。
> /var/app/volumesに読み込みたいファイル(db2.sqlite4.db)はコピーできました。
> lsコマンドの結果は以下の通りとなっています。
> armadillo:/# ls -l /var/app/volumes > total 32 > -rwxr-xr-x 1 root root 29696 Jun 24 14:50 db2.sqlite4.db > drwxr-xr-x 1 root root 0 Jun 12 13:03 signageplayer
/var/app/volumes/db2.sqlite4.db
ではなく /var/app/volumes/signageplayer/db2.sqlite4.db
に設置してください。
> >もうしわけございません、こちらのエラーは flutter の問題で、fullscreen で起動すると画面がないとすぐに失敗します。
> >画面を接続していただければ解決されると思います。
> 画面接続すると先程のエラーは表示されなくなりましたが、podman attach signageplayer
を入力後にエンターキーを押しても改行されるだけでarmadillo:~#もroot@f50e11dfbd69:~#も表示されない状態になりました。
はい。attach すると「flutter_main」を実行したコンソールになりますので、flutter で標準入力を読まない限りはなにも起きません。
コンテナが終了しないと podman exec を使えるようになったと思いますので、調査にはそちらをつかってください。
(podman attach は ctrl-p ctrl-q を順番に入力すると detach できます)
よろしくお願いします
at_dominique.m…
2025年6月23日 16時52分
shiroroさん
お世話になっています、
マルティネです。
> ATDE内にファイルを保存していることが原因かと思い、Armadillo内の/var/app/rollback/volumesに同じデータベースファイルをコピーして、参照するパスをこのパスに変更して「デバッグモードのアプリをArmadilloで実行」しても同様でした。
分かりづらいですが、flutter が実行されてるコンテナ内ではボリュームを明示的に共有しないとアクセスできないようになっています(複数のコンテナでアクセスできるデータを制限できるような作りです)
デフォルトの config/app.conf ファイルでは以下の設定はありますが、こちらのコンフィグでしたら Armadillo の /var/app/rollback/volumes にアプリケーション名のディレクトリが生成されるはずです。
存在してますか?
コメントを日本語にすると:
-
/var/app/rollback/volumes/[appli]
は/vol_app
からアクセスできて、読み取り専用になっています-
/var/app/rollback/[appli]
は/vol_data
からアクセスできます。データベースでしたら、権限でもわかると思いますが rollback 用の /vol_app に入れると読み取り専用になりますので、デフォルトでは書き込みできません。
アップデートの仕組みとしてはアップデート中の書き込みが失いますので、ログや書き込むデータベースを /vol_data にしていただいて、アプリケーションデータ(画像やアプリケーションのコンフィグに関わるデータ)を /vol_app に保存することを推奨します。
また、他のディレクトリを共有する必要がある場合は app.conf も編集できますが、「アプリをArmadilloで実行」 で適用されませんので予め swu をビルドしてインストールする必要があります。デフォルト位置で試していただければと思います
よろしくお願いします。