Armadilloフォーラム

デバッグモードのアプリをATDEで実行した際に参照できたファイルがArmadilloで実行すると参照できない

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
コメント

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 にアプリケーション名のディレクトリが生成されるはずです。
存在してますか?

# 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.
# - "/vol_app:ro" means to make "/vol_app" read-only.
# If this is inconvenient, please remove ":ro".
add_volumes /var/app/rollback/volumes/{{PROJECT}}:/vol_app:ro
add_volumes /var/app/volumes/{{PROJECT}}:/vol_data

コメントを日本語にすると:
- /var/app/rollback/volumes/[appli]/vol_app からアクセスできて、読み取り専用になっています
- /var/app/rollback/[appli]/vol_data からアクセスできます。

データベースでしたら、権限でもわかると思いますが rollback 用の /vol_app に入れると読み取り専用になりますので、デフォルトでは書き込みできません。

アップデートの仕組みとしてはアップデート中の書き込みが失いますので、ログや書き込むデータベースを /vol_data にしていただいて、アプリケーションデータ(画像やアプリケーションのコンフィグに関わるデータ)を /vol_app に保存することを推奨します。

また、他のディレクトリを共有する必要がある場合は app.conf も編集できますが、「アプリをArmadilloで実行」 で適用されませんので予め swu をビルドしてインストールする必要があります。デフォルト位置で試していただければと思います

よろしくお願いします。

マルティネ様
お世話になっております。

> デフォルトの 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…

2025年6月23日 18時02分

マルティネです。

> /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 を参照するようになります。

よろしくお願いします

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

今起動中のコンテナは以下のようになっていまして、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…

2025年6月24日 14時24分

マルティネです。

> 今起動中のコンテナは以下のようになっていまして、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 メモリなどで転送できます。

よろしくお願いします。

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

/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…

2025年6月24日 16時26分

マルティネです。

> /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 できます)

よろしくお願いします