Armadilloフォーラム

ATDE9(VirtualBox)でのc言語クロスコンパイル

k.sato

2025年1月24日 13時18分

佐藤と申します。
お世話になっております。

VirtualBox Oracle VM VirtualBox 7.0.22
ATDE9 atde9-amd64-20240925.ova
Alpine Linuxルートファイルシステムビルドツール build-rootfs-v3.18-at.10
上記の環境で作業しています。

●ライブラリが見つからないエラー
https://armadillo.atmark-techno.com/forum/armadillo/14009#comment-12363
上記を参考に下記を行ったのですが

$ tar xf build-rootfs-v3.16-at.7.tar.gz
$ cd build-rootfs-v3.16-at.7/submodules/containers
$ sudo ./build.sh
...
atmark@atde9:~/build-rootfs-v3.18-at.10/submodules/containers$ sudo ./build.sh 
[sudo] atmark のパスワード:
Sending build context to Docker daemon   5.12kB
Step 1/9 : ARG arch=amd64
Step 2/9 : ARG version=3.15
Step 3/9 : FROM docker.io/${arch}/alpine:${version}
 ---> 221b68f97ccb
Step 4/9 : RUN apk update && apk upgrade && apk add alpine-sdk && rm -f /var/cache/apk/*
 ---> Using cache
 ---> d22ba0dc55a3
Step 5/9 : RUN adduser -D builder && adduser builder abuild
 ---> Using cache
 ---> a30338176c0b
Step 6/9 : ARG at_version
 ---> Using cache
 ---> cb90464092a2
Step 7/9 : RUN sed -i -e "1i@atmark http://download.atmark-techno.com/alpine/v${at_version}/atmark" 	   -e "1ihttp://download.atmark-techno.com/alpine/v${at_version}/atmark" /etc/apk/repositories
 ---> Using cache
 ---> 7bbf3c813eca
Step 8/9 : COPY atmark-601a0e69.rsa.pub /etc/apk/keys/
 ---> Using cache
 ---> b635430d594b
Step 9/9 : COPY atmark-62b116af.rsa.pub /etc/apk/keys/
 ---> Using cache
 ---> 3e18364e0436
Successfully built 3e18364e0436
Successfully tagged alpine-3.18-x86_64:latest
Sending build context to Docker daemon   5.12kB
Step 1/9 : ARG arch=amd64
Step 2/9 : ARG version=3.15
Step 3/9 : FROM docker.io/${arch}/alpine:${version}
3.18: Pulling from arm32v7/alpine
no matching manifest for linux/amd64 in the manifest list entries
Sending build context to Docker daemon   5.12kB
Step 1/9 : ARG arch=amd64
Step 2/9 : ARG version=3.15
Step 3/9 : FROM docker.io/${arch}/alpine:${version}
3.18: Pulling from arm64v8/alpine
no matching manifest for linux/amd64 in the manifest list entries
atmark@atde9:~/build-rootfs-v3.18-at.10/submodules/containers$ sudo docker image ls
REPOSITORY           TAG       IMAGE ID       CREATED       SIZE
alpine-3.18-x86_64   latest    3e18364e0436   2 hours ago   263MB
amd64/alpine         3.18      221b68f97ccb   2 weeks ago   7.36MB

上記のように「alpine-3.18-armv7」のイメージが表示されません。

何がおかしいのでしょうか?

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

コメント

at_reika.yamazaki

2025年1月24日 17時46分

お世話になっております。山崎です。

arch の指定方法に変更があったため、こちらの対応が必要です。
お手数をおかけして申し訳ありませんが、現在の最新版である build-rootfs-v3.20-at.7.tar.gz をご使用いただくか、
もしくは build.sh をご使用のディレクトリに入れ替えて実行していただけますでしょうか?
入れ替えて実行する場合の手順は以下になります。

wget https://armadillo.atmark-techno.com/files/downloads/armadillo-640/tool/build-rootfs-v3.20-at.7.tar.gz
tar xf build-rootfs-v3.20-at.7.tar.gz
cp build-rootfs-v3.20-at.7/submodules/containers/build.sh <ご使用の build-rootfs ディレクトリのパス>/submodules/containers/build.sh
cd <ご使用の build-rootfs ディレクトリのパス>/submodules/containers/
./build.sh

そのあと "podman images" を実行すると "localhost/alpine-3.20-armv7" が現れると思います。
上記確認できた場合は "docker" コマンドは "podman" コマンドに置き換えてご使用いただくのが良いと思います。
以上、どうぞよろしくお願いいたします。

山崎様

佐藤です。
返信が遅くなり申し訳ございません。

> arch の指定方法に変更があったため、こちらの対応が必要です。
> お手数をおかけして申し訳ありませんが、現在の最新版である build-rootfs-v3.20-at.7.tar.gz をご使用いただくか、
> もしくは build.sh をご使用のディレクトリに入れ替えて実行していただけますでしょうか?
> 入れ替えて実行する場合の手順は以下になります。

> wget https://armadillo.atmark-techno.com/files/downloads/armadillo-640/tool/build-rootfs-v3.20-at.7.tar.gz
> tar xf build-rootfs-v3.20-at.7.tar.gz
> cp build-rootfs-v3.20-at.7/submodules/containers/build.sh <ご使用の build-rootfs ディレクトリのパス>/submodules/containers/build.sh
> cd <ご使用の build-rootfs ディレクトリのパス>/submodules/containers/
> ./build.sh

> そのあと "podman images" を実行すると "localhost/alpine-3.20-armv7" が現れると思います。
> 上記確認できた場合は "docker" コマンドは "podman" コマンドに置き換えてご使用いただくのが良いと思います。

/build-rootfs-v3.18-at.10/submodules/containersのbuild.shをbuild-rootfs-v3.20-at.7のbuild.shに差し替え

 ./build.sh

を実行しました。

atmark@atde9:~/build-rootfs-v3.18-at.10/submodules/containers$ sudo podman image ls
REPOSITORY                     TAG     IMAGE ID      CREATED      SIZE
localhost/alpine-3.20-aarch64  latest  0e6f8e3f880a  3 days ago   236 MB
localhost/alpine-3.20-armv7    latest  4cb183c9e97c  3 days ago   162 MB
localhost/alpine-3.20-x86_64   latest  d46c952356d0  3 days ago   246 MB
docker.io/amd64/alpine         3.20    e29df9b510ff  2 weeks ago  8.09 MB
docker.io/arm32v7/alpine       3.20    f92558a1b22b  2 weeks ago  5.4 MB
docker.io/arm64v8/alpine       3.20    f4194d9e8c10  2 weeks ago  9.12 MB

このようにalpine-3.20-armv7が表示されるのですが、v3.18-at.10のディレクトリへコピーしてもこうなるのが正しいのでしょうか?

また、VSCodeで作成するpythonプロジェクトのDockerfileでFROM docker.io/${ARCH}/alpine:3.18を指定していたのですが、
上記のようにalpine-3.20-armv7の環境となってしまうとDockerfileのバージョンも合わせなければならないものなのでしょうか?

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

at_dominique.m…

2025年1月28日 9時31分

横からすみません、マルティネです。

> このようにalpine-3.20-armv7が表示されるのですが、v3.18-at.10のディレクトリへコピーしてもこうなるのが正しいのでしょうか?

containersディレクトリの build.sh を実行すると build-rootfs からコピーしたプロジェクトのバージョンがビルドされますが、build_rootfs.sh から実行すると必要な 3.18 バージョンもビルドされるはずですので 3.20 のイメージを無視(あるいは削除)してもいいです。

> また、VSCodeで作成するpythonプロジェクトのDockerfileでFROM docker.io/${ARCH}/alpine:3.18を指定していたのですが、
> 上記のようにalpine-3.20-armv7の環境となってしまうとDockerfileのバージョンも合わせなければならないものなのでしょうか?

alpine 3.18 はもう今年の5月でメインテナンスが切れますので理想と言えば更新していただくことを推奨しますが(rootfsの方も)、VSCode プロジェクトで使うコンテナと build-rootfs で使うコンテナと関係ありませんので、アップデートのタイミングは別でも問題ありません。

ただし、vscode プロジェクトでコンテナをビルドする際に今回の「no matching manifest for linux/amd64 in the manifest list entries」エラーも発生する可能性があります(dockerhub のイメージの変更によるエラーですので)。
エラーが発生する場合は同じく vscode project のスクリプトの更新が必要になると思いますので、その際にまた問い合わせください。

よろしくお願いします

マルティネ様

佐藤です。
回答が遅くなって申し訳ございません。

> > また、VSCodeで作成するpythonプロジェクトのDockerfileでFROM docker.io/${ARCH}/alpine:3.18を指定していたのですが、
> > 上記のようにalpine-3.20-armv7の環境となってしまうとDockerfileのバージョンも合わせなければならないものなのでしょうか?
> alpine 3.18 はもう今年の5月でメインテナンスが切れますので理想と言えば更新していただくことを推奨しますが(rootfsの方も)、VSCode プロジェクトで使うコンテナと build-rootfs で使うコンテナと関係ありませんので、アップデートのタイミングは別でも問題ありません。
承知しました。
ありがとうございます。

> ただし、vscode プロジェクトでコンテナをビルドする際に今回の「no matching manifest for linux/amd64 in the manifest list entries」エラーも発生する可能性があります(dockerhub のイメージの変更によるエラーですので)。
> エラーが発生する場合は同じく vscode project のスクリプトの更新が必要になると思いますので、その際にまた問い合わせください。
エラーが発生したら、再度問い合わせます。

atmark@atde9:~/build-rootfs-v3.18-at.10/submodules/containers$ sudo podman image ls
REPOSITORY                     TAG     IMAGE ID      CREATED      SIZE
localhost/alpine-3.20-aarch64  latest  0e6f8e3f880a  3 days ago   236 MB
localhost/alpine-3.20-armv7    latest  4cb183c9e97c  3 days ago   162 MB
localhost/alpine-3.20-x86_64   latest  d46c952356d0  3 days ago   246 MB
docker.io/amd64/alpine         3.20    e29df9b510ff  2 weeks ago  8.09 MB
docker.io/arm32v7/alpine       3.20    f92558a1b22b  2 weeks ago  5.4 MB
docker.io/arm64v8/alpine       3.20    f4194d9e8c10  2 weeks ago  9.12 MB

上記のようにalpine-3.20-armv7が生成されましたので

●ライブラリが見つからないエラー
https://armadillo.atmark-techno.com/forum/armadillo/14009#comment-12363

$ sudo docker run -it --name a6edev --platform "linux/armhf" --mount type=bind,src="$PWD",target=/home/builder/atmark alpine-3.16-armv7 /bin/sh

これを今回のalpine-3.20-armv7で行いたいです。

$ sudo docker run -it --name a640dev --platform "linux/armhf" --mount type=bind,src="$PWD",target=/home/builder/atmark alpine-3.20-armv7 /bin/sh

上記を試してみましたがコンテナを作成して移動しません。
localhost/alpine-3.20-armv7dockerpodmanに変更してみましたがダメでした。

どういうコマンドを打てばよいでしょうか?

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

at_dominique.m…

2025年2月6日 10時41分

マルティネです。

> localhost/alpine-3.20-armv7dockerpodmanに変更してみましたがダメでした。

podman/docker が混ざってしまって分かりにくい状態になってすみません。

詳細から説明すると
* podman でビルドしたイメージは docker で利用できません。さらに、podman は sudo podman と podman の環境もちがいますので、コマンド実行時にどの環境を利用するかを把握する必要があります。
* そこで、ATDE9 でインストール可能な podman のバージョンは docker と違う --platform 引数の処理を行ってるので、今回はコマンドを簡単に差し替えできません。

--platform引数を削除すれば alpine-3.20-armv7 のイメージを使えると思いますが、build rootfs の都合でビルドしたコンテナにこだわる必要ありません。(docker に sudo が必要なため、podman もインストールされてる場合は build-rootfs 内で podman を利用するようにしましたが、同じコンテナを使う必要はありません)

状況は分かってませんので、お手数ですがまずは目的から改めて教えていただけますでしょうか。

C言語で開発を行いたいのであれば、VSCode プロジェクトで「C project」の作成は可能ですが、こちらでは目的を果たせないでしょうか?
C project の Dockerfile では debian をデフォルトで使ってますが、container/Dockerfile を変更すれば alpine も利用可能です(FROM の行の更新と apt-get の RUN 命令を「apk add ${PACKAGES}に変更すれば)
バイナリを直接に Armadillo Base OS ホスト側にコピーすることを推奨しませんが、こちらの alpine コンテナでビルドした物は Armadillo Base OS でも実行可能です。

よろしくお願いします

マルティネ様

佐藤です。
> 状況は分かってませんので、お手数ですがまずは目的から改めて教えていただけますでしょうか。
VSCode プロジェクトでは「python project」を作成しています。
snmpのGET、SETを行うため、net-snmpをクロスコンパイルして
実行ファイルだけ「python project」の「my_project/container/resources」内に配置したいです。

旧環境ではこの方法で一緒に.swuに固めインストールし
snmpのSET、GETの動作確認まで出来ていました。

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

at_dominique.m…

2025年2月6日 16時31分

マルティネです

> > 状況は分かってませんので、お手数ですがまずは目的から改めて教えていただけますでしょうか。
> VSCode プロジェクトでは「python project」を作成しています。
> snmpのGET、SETを行うため、net-snmpをクロスコンパイルして
> 実行ファイルだけ「python project」の「my_project/container/resources」内に配置したいです。
>
> 旧環境ではこの方法で一緒に.swuに固めインストールし
> snmpのSET、GETの動作確認まで出来ていました。

なるほど、ABOS側ではなく別のコンテナの resources としてコピーしたかったですね。

snmpget/snmpset の標準コマンドのままでしたら、python app project の package リストに「net-snmp-tools」を追加したら snmpget/set コマンドがインストールされますが、標準のコマンドではなく自分の snmpget/set (何か手を加えた物)をインストールしたいでよろしいでしょうか?

python project では「ビルドコンテナ」の概念がないので、確かに厄介ですね。
バイナリをコピーするままでよろしければ、ABOS用の alpine-3.20-armv7 ではなく、python project のコンテナでコードを実行してください

イメージとしては以下のとおり

# python project はおそらく sudo 無しの podman 環境にあるので、その確認
atde$ podman image list
localhost/python-app-project-1.2.2          latest         3384a10f6805  10 months ago  417 MB
# それを起動します
atde$ podman run -it --name a640dev --replace -v "$PWD":/work localhost/python-app-project-1.2.2:latest /bin/sh
# コンテナの中で必要なパッケージをインストールして /work に成果物をコピーする
/ # apk add ...
/# cp ... /work/

いかがでしょうか。

よろしくお願いします。

佐藤です。

> snmpget/snmpset の標準コマンドのままでしたら、python app project の package リストに「net-snmp-tools」を追加したら snmpget/set コマンドがインストールされますが、標準のコマンドではなく自分の snmpget/set (何か手を加えた物)をインストールしたいでよろしいでしょうか?
その通りです。

今までは下記の手順でnet-snmpのクロスコンパイルを行っていました。

※ コンテナインスタンスの作成
sudo docker run -it --name a640dev --platform "linux/armhf" --mount type=bind,src="$PWD",target=/home/builder/atmark alpine-3.18-armv7 /bin/sh
※ 次回からコンテナを起動し移動
sudo docker start a640dev && sudo docker exec -it a640dev /bin/sh
※ クロスコンパイルしたいソースが置いてあるディレクトリへ移動
/ # cd /home/builder/atmark/cross_compile/net-snmp-5.8/
※ net-snmpのビルド
/home/builder/atmark/armadillo_alpine/net-snmp-5.8 # make

net-snmpのソースをvscodeで修正してもコピーする手間がかからないので。

現環境でも同じようなことはできますか?

> # python project はおそらく sudo 無しの podman 環境にあるので、その確認
> atde$ podman image list
> localhost/python-app-project-1.2.2          latest         3384a10f6805  10 months ago  417 MB
> # それを起動します
> atde$ podman run -it --name a640dev --replace -v "$PWD":/work localhost/python-app-project-1.2.2:latest /bin/sh
> # コンテナの中で必要なパッケージをインストールして /work に成果物をコピーする
> / # apk add ...
> /# cp ... /work/

上記を試してみましたが、/home/builder/までしか見られません。
target=/home/builder/atmarkなどがpodmanのオプションでも使用できれば同じことが出来そうな気がしますが...

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

at_dominique.m…

2025年2月7日 9時35分

マルティネです。

> 現環境でも同じようなことはできますか?

できますが、手間なだけではなく、パッケージを使わないとセキュリティの修正等も適用しづらくなりますので、net-snmp のソースに手を加えたならともかく、標準のままでしたらパッケージを利用できますのでそちらを推奨します。
https://osv.dev/list?q=net-snmp&ecosystem=Alpine に公開されてる去年の脆弱性は snmpd の方が対象らしいなので snmpget/set を使うだけでしたらすぐには困らないと思いますが、脆弱性は出てますしちゃんと維持されているソフトウェアなので更新しやすい体制がいいかと)

> target=/home/builder/atmarkなどがpodmanのオプションでも使用できれば同じことが出来そうな気がしますが...

前のコマンドの「--mount type=bind,src="$PWD",target=/home/builder/atmark」と新しいコマンドの「-v "$PWD":/work」はマウント先が違いますので、-v (--volume) オプションを調整するか /work ディレクトリで作業してください。

よろしくお願いします

佐藤です。

> 前のコマンドの「--mount type=bind,src="$PWD",target=/home/builder/atmark」と新しいコマンドの「-v "$PWD":/work」はマウント先が違いますので、-v (--volume) オプションを調整するか /work ディレクトリで作業してください。
ありがとうございます。

podman run -it --name a640dev --replace -v "$PWD":/home/builder/atmark localhost/alpine-3.20-armv7 /bin/sh
cd /home/builder/atmark/cross_compile/net-snmp-5.8/

上記とすることで/home/builder/atmark/に移動し自身で修正したnet-snmp-5.8をビルドすることができました。