Armadilloフォーラム

[ABOS] ホスト側のABOSにコピーした実行ファイルが実行できない

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

at_satoshi.ohta

2025年4月22日 13時51分

太田です。

別スレッドとして立てていただきありがとうございます。
InitProgram について質問させてください。

1. InitProgram は C 言語のソースコードを make して作成した実行バイナリファイルということでよろしいでしょうか?
make した場合はどこで make しましたか?ATDE上でしょうか?それともATDE上のArmadillo に転送するコンテナの中でしょうか?

2. InitProgram はABOS上のコンテナの中で実行するべき実行ファイルでしょうか?それともABOS(ホスト)で実行するべき実行ファイルでしょうか?

3. InitProgram が行う具体的な処理をもう少し詳しく教えていただけますしょうか?

どうぞよろしくお願いいたします。

お世話になっております。
> 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

2025年4月22日 17時48分

太田です。

ATDE(debian)でビルドした実行ファイルを alpine である ABOS 上で実行しようとしており、必要なライブラリがないのでエラーになっていると思われます。

方法としては以下2つが考えられます。

1. alpine コンテナ上で実行ファイルをビルドし、その実行ファイルをABOS上で直接実行する。

2. C 言語プロジェクトを用いてコンテナ内で InitProgram をビルドして、そのコンテナイメージをABOSにインストールする。
InitProgram はコンテナ内で実行されます。
この場合は、config/app.conf に add_args --net=host を設定することでネットワークの情報をホストのABOSとコンテナで共有できるのでルートの情報が必要なだけであればこれで十分なはずです。

ABOSはアットマークテクノとユーザーの管理や責任を分けるためにも、ユーザーが作成するアプリケーションはコンテナの中で実行することを推奨しています。
そのため、2の方法のようにコンテナ内で InitProgram を実行するのが良いかと思います。

どうぞよろしくお願いいたします。

お世話になっております。
> 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"になっているのですが、これについても不明です。

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

アットマークテクノの古賀(休日モード)です。

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/

お世話になっております。

> >以上のコマンドでホストの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]下に置くのが正しいのでしょうか?

よろしくお願いいたします。