shun
2025年4月22日 13時30分
==========
製品型番:Armadillo-610
Debian/ABOSバージョン:3.19.2-at.5
カーネルバージョン:5.10.220
==========
[abos/resources]ディレクトリに置いたファイル(abos/resources/usr/bin/InitProgram ←個人で作成した初期起動用の実行ファイル)をメイン関数で実行するようにして.swuを書き込んだのですが、実行できませんでした。
Armadillo本体にアクセスしてファイルの実態を確認すると、
armadillo:/usr/bin# ./InitProgram -ash: ./InitProgram : not found armadillo:/usr/bin# file ./InitProgram -ash: file: not found armadillo:/usr/bin# ls -l ./InitProgram -rwxr-xr-x 1 root root 307736 Apr 21 17:08 ./InitProgram armadillo:/usr/bin# ls /lib/ /usr/lib/ | grep libstdc++ libstdc++.so.6 libstdc++.so.6.0.32
ファイルの実態はあるのに[not found]と出てしまいます。
原因がわかりましたらご回答の程、よろしくお願いいたします。
ファイル | ファイルの説明 |
---|---|
コメント 2025-04-22 115821.png |
コメント
shun
お世話になっております。
> 1. InitProgram は C 言語のソースコードを make して作成した実行バイナリファイルということでよろしいでしょうか?
> make した場合はどこで make しましたか?ATDE上でしょうか?それともATDE上のArmadillo に転送するコンテナの中でしょうか?
こちらはATDE上のMakefileによってコンパイルした実行ファイルです。
生成した実行ファイルを[abos/resources/usr/bin/]ディレクトリに移動してswuファイルを本体にコピーしました。
#プログラム名 PROGRAM=InitProgram #ターゲット名(PROGRAMから変更があるときのみ) TARGET=../build/InitProgram #インクルードパス USER_INCLUDE= -I include #オブジェクトディレクトリ OBJ_DIR=./common/object #共通部ソースファイルディレクトリ SRC_DIR=./common/src MAINSRCS := $(PROGRAM).c COMSRCS := $(wildcard *.c) SRCS := $(MAINSRCS) $(COMSRCS) OBJS := $(SRCS:%.c=%.o) DEPS := $(OBJS:.o=.d) CFLAGS += -O0 -Wall -Wextra -MMD -MP all: $(TARGET) #ターゲット $(TARGET): $(OBJS) $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ -g -o $@ %.o:%.c $(CC) -c -g $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $< -o $@ .PHONY: clean clean: $(RM) $(OBJS) $(DEPS) $(TARGET) -include $(DEPS)
> 2. InitProgram はABOS上のコンテナの中で実行するべき実行ファイルでしょうか?それともABOS(ホスト)で実行するべき実行ファイルでしょうか?
InitProgramはABOS(ホスト)で実行する予定の実行ファイルです。
こちらの件は旧Armadillo-840mで製品化していたプログラムの移植をしたいと思っており、ABOSで使用されているコンテナを活用しつつ、プログラム内で定義したルートなどの情報はできるだけ変更しないように開発を進めたいと考えております。
> 3. InitProgram が行う具体的な処理をもう少し詳しく教えていただけますしょうか?
①main関数で[/etc/init.d/init.sh ←初回処理スクリプト]を実行します。main関数の処理は以上。
②[/etc/init.d/init.sh]では、弊社のメイン基板からの通信処理モジュール(MainComm)をバックグラウンド実行したのち、メイン基板への通信処理を実行するモジュール(SubComm)を起動します。
/* 一部抜粋 */ # Launch MainToSubComm /usr/bin/MainComm & echo "MainComm End" # Launch Init Module echo "SubComm Start" /usr/bin/SubComm
MainCommとSubCommは、それぞれgdbデバッグ環境上で実行できることは確認しています。
以上、よろしくお願いいたします。
at_satoshi.ohta
太田です。
ATDE(debian)でビルドした実行ファイルを alpine である ABOS 上で実行しようとしており、必要なライブラリがないのでエラーになっていると思われます。
方法としては以下2つが考えられます。
1. alpine コンテナ上で実行ファイルをビルドし、その実行ファイルをABOS上で直接実行する。
2. C 言語プロジェクトを用いてコンテナ内で InitProgram をビルドして、そのコンテナイメージをABOSにインストールする。
InitProgram はコンテナ内で実行されます。
この場合は、config/app.conf に add_args --net=host を設定することでネットワークの情報をホストのABOSとコンテナで共有できるのでルートの情報が必要なだけであればこれで十分なはずです。
ABOSはアットマークテクノとユーザーの管理や責任を分けるためにも、ユーザーが作成するアプリケーションはコンテナの中で実行することを推奨しています。
そのため、2の方法のようにコンテナ内で InitProgram を実行するのが良いかと思います。
どうぞよろしくお願いいたします。
shun
お世話になっております。
> 2. C 言語プロジェクトを用いてコンテナ内で InitProgram をビルドして、そのコンテナイメージをABOSにインストールする。
> InitProgram はコンテナ内で実行されます。
> この場合は、config/app.conf に add_args --net=host を設定することでネットワークの情報をホストのABOSとコンテナで共有できるのでルートの情報が必要なだけであればこれで十分なはずです。
以上のコマンドでホストのABOSとコンテナで共有できたのですが、一部のフォルダ[/var/tmp]が共有されませんでした。
ATDE上の[abos/resources]ディレクトリ下に[/var/tmp/...]を入れております。
drwxr-xr-x 4 root root 1024 Jul 8 2024 app drwxr-xr-x 2 root root 512 Jan 1 1970 at-log drwxr-xr-x 4 root root 1024 Jun 25 2024 cache dr-xr-xr-x 2 root root 1024 Jun 25 2024 empty drwxr-xr-x 1 root root 80 Jul 8 2024 lib drwxr-xr-x 2 root root 1024 Jun 25 2024 local lrwxrwxrwx 1 root root 9 Jan 1 1970 lock -> /run/lock drwxr-xr-x 4 root root 1024 May 9 13:57 log drwxr-xr-x 2 root root 1024 Jun 25 2024 mail drwxr-xr-x 2 root root 1024 Jun 25 2024 opt lrwxrwxrwx 1 root root 4 May 9 16:51 run -> /run drwxr-xr-x 3 root root 1024 Jun 25 2024 spool -rw-r--r-- 1 root root 0 May 9 16:53 test2.txt drwxrwxrwt 1 root root 0 May 9 16:54 tmp
"drwxrwxrwt"の"t"になっているのですが、これについても不明です。
以上、よろしくお願いいたします。
koga
アットマークテクノの古賀(休日モード)です。
shunさん:
>>2. C 言語プロジェクトを用いてコンテナ内で InitProgram をビルドして、そのコンテナイメージをABOSにインストールする。
>>InitProgram はコンテナ内で実行されます。
>>この場合は、config/app.conf に add_args --net=host を設定することでネットワークの情報をホストのABOSとコンテナで共有できるのでルートの情報が必要なだけであればこれで十分なはずです。
>
>以上のコマンドでホストのABOSとコンテナで共有できたのですが、一部のフォルダ[/var/tmp]が共有されませんでした。
>ATDE上の[abos/resources]ディレクトリ下に[/var/tmp/...]を入れております。
コンテナにホスト OS のフォルダ(ディレクトリ)を共有させるには、abos/resources に対象ディレクトリを記述するのではなく、config/app.conf にディレクトリのマウント設定を記述してください。
ディレクトリ共有の設定は、製品マニュアルの「コンテナ起動設定ファイルを作成する」にある「ボリュームマウント」で説明している add_volume を使います:
https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…
次のような記述を追加すると、どうなるでしょうか?
add_volume /var/tmp:/var/tmp
ところで、
drwxr-xr-x 4 root root 1024 Jul 8 2024 app drwxr-xr-x 2 root root 512 Jan 1 1970 at-log drwxr-xr-x 4 root root 1024 Jun 25 2024 cache dr-xr-xr-x 2 root root 1024 Jun 25 2024 empty drwxr-xr-x 1 root root 80 Jul 8 2024 lib drwxr-xr-x 2 root root 1024 Jun 25 2024 local lrwxrwxrwx 1 root root 9 Jan 1 1970 lock ->/run/lock drwxr-xr-x 4 root root 1024 May 9 13:57 log drwxr-xr-x 2 root root 1024 Jun 25 2024 mail drwxr-xr-x 2 root root 1024 Jun 25 2024 opt lrwxrwxrwx 1 root root 4 May 9 16:51 run ->/run drwxr-xr-x 3 root root 1024 Jun 25 2024 spool -rw-r--r-- 1 root root 0 May 9 16:53 test2.txt drwxrwxrwt 1 root root 0 May 9 16:54 tmp
>
>"drwxrwxrwt"の"t"になっているのですが、これについても不明です。
ls -l で表示されるパーミッションの末尾が 't' になっているのは、スティッキービットがセットされていることを示します。
スティッキービットがセットされたディレクトリでは、ディレクトリ以外のユーザーが、そこに作成したファイルを、ファイルを作成したユーザー(つまり、そのファイルのオーナー)以外のユーザーが削除やファイル名の変更をできないようになっており、/tmp や /var/tmp などの一時ファイル用のディレクトリに対してデフォルトで設定されています。
スティッキービットについては、たとえば以下のページが参考になるかと思います:
・スティッキービット
https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%86%E3%82%A3%E3%83%83%E3%8…
・/tmpディレクトリ
https://linuc.org/study/knowledge/548/
shun
お世話になっております。
> >以上のコマンドでホストのABOSとコンテナで共有できたのですが、一部のフォルダ[/var/tmp]が共有されませんでした。
> >ATDE上の[abos/resources]ディレクトリ下に[/var/tmp/...]を入れております。
> コンテナにホスト OS のフォルダ(ディレクトリ)を共有させるには、abos/resources に対象ディレクトリを記述するのではなく、config/app.conf にディレクトリのマウント設定を記述してください。
> 次のような記述を追加すると、どうなるでしょうか?
> add_volume /var/tmp:/var/tmp
以上の記述をconfig/app.confに書き込んでインストールしたところ、前回と変わらず/tmp以降のディレクトリが見つからない状態でした。
armadillo:~# cd /var armadillo:/var# ls -l total 9 drwxr-xr-x 4 root root 1024 Jul 8 2024 app drwxr-xr-x 2 root root 512 Jan 1 1970 at-log drwxr-xr-x 4 root root 1024 Jun 25 2024 cache dr-xr-xr-x 2 root root 1024 Jun 25 2024 empty drwxr-xr-x 1 root root 80 Jul 8 2024 lib drwxr-xr-x 2 root root 1024 Jun 25 2024 local lrwxrwxrwx 1 root root 9 Jan 1 1970 lock -> /run/lock drwxr-xr-x 4 root root 1024 Jan 1 1970 log drwxr-xr-x 2 root root 1024 Jun 25 2024 mail drwxr-xr-x 2 root root 1024 Jun 25 2024 opt lrwxrwxrwx 1 root root 4 May 12 10:59 run -> /run drwxr-xr-x 3 root root 1024 Jun 25 2024 spool -rw-r--r-- 1 root root 0 May 12 11:00 test2.txt drwxrwxrwt 1 root root 0 May 12 11:00 tmp armadillo:/var# ls -l /var/tmp total 0 armadillo:/var#
https://armadillo.atmark-techno.com/forum/armadillo/24992
現在、上記のフォーラムのように[abos/resources]ディレクトリを作成してATDE側からABOSホストに共有したいファイル[/usr/bin/...], [/var/tmp/...]などを追加しています。
上記の[var/tmp/]下にある[test2.txt]もATDE側の[abos/resources/var/tmp/]下に追加したテキストファイルです。
config/app.conf にディレクトリのマウント設定を記述した場合、共有したいファイルは[abos/resources]ではなく、[container/resources]下に置くのが正しいのでしょうか?
よろしくお願いいたします。
at_satoshi.ohta
2025年4月22日 13時51分
太田です。
別スレッドとして立てていただきありがとうございます。
InitProgram について質問させてください。
1. InitProgram は C 言語のソースコードを make して作成した実行バイナリファイルということでよろしいでしょうか?
make した場合はどこで make しましたか?ATDE上でしょうか?それともATDE上のArmadillo に転送するコンテナの中でしょうか?
2. InitProgram はABOS上のコンテナの中で実行するべき実行ファイルでしょうか?それともABOS(ホスト)で実行するべき実行ファイルでしょうか?
3. InitProgram が行う具体的な処理をもう少し詳しく教えていただけますしょうか?
どうぞよろしくお願いいたします。