kitamura-a
2022年10月26日 19時27分
お世話になっております。
●内容
・armadilloーIoT G4にてUDPソケット通信が動作できない為、解決したいと考えております。
・仮想環境(Virtual Box)ではホストCPU経由で外部PCと通信動作できるが、
その実行ファイルをarmadilloーIoT G4に持っていくと通信動作ができない。といった状況です。
仮想環境(Virtual Box)で動作する為、アプリケーション自体の問題ではないと推測していますが
armadilloーIoT G4側の設定、及び使用している環境での問題は何か考えられますでしょうか。
●開発環境
・仮想環境(Virtual Box)上のATDE9環境にて、Qtデザイナー5.15にてアプリケーションを作成しております。
・コンテナを起動し、ATDE9にある上記で作成した実行ファイルをArmadillo G4に転送し動作確認しております。
・Armadillo IoT G4本体にはeth0に静的IPアドレス 192.168.100.113を設定しています。このコネクタと通信を試している。
・eth1にも静的IPアドレス192.168.1.xxを設定している。
・テスト環境は、外部のPC端末から1秒間隔でデータ(8バイト程度)を送信し、データを受信したら
アプリケーションで表示させている画面を変化させるというプログラムで確認しています。
・確認したこと
コンテナ上でwgetやpingコマンドにてホストPC、及び仮想環境(Virtual Box)と通信はできている
コンテナの起動時にUDPに必要とされる記述をおこなっている(下記参照)。しかしながら追記前と変化なし。
●Podman コマンドでコンテナ起動(ポート 50241を追加)
----------------------------------------------------------------------
podman run -it --name=demo16 \
--publish=50241:50241/udp \
--env=XDG_RUNTIME_DIR=/tmp \
--env=QT_QPA_PLATFORM=wayland \
--volume=/sys:/sys \
--volume=/dev:/dev \
--volume=/run/udev:/run/udev \
--volume=/opt/firmware:/opt/firmware \
--privileged \
localhost/myimg:3 /bin/bash
よろしくお願いいたします。
コメント
kitamura-a
回答ありがとうございます。
同じディレクトリに、udp.confを作成しコマンドを実行した結果を下に追加します(添付も同様)。
結果的にはエラーが出ているようですが、この内容で状況は判断できますでしょうか。
armadillo:/etc/atmark/containers# podman_start -v udp
Starting 'udp'
eval podman run -d --name 'udp' --replace --log-opt max-size=1mb --restart=on-failure --pull='missing' '--publish=50241:50241/udp' 'docker.io/alpine' 'sleep' 'infinity'
Trying to pull docker.io/library/alpine:latest...
Error: initializing source docker://alpine:latest: pinging container registry registry-1.docker.io: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 127.0.0.1:53: server misbehaving
error: Could not start 'udp'
ファイル | ファイルの説明 |
---|---|
WS000081.JPG |
at_dominique.m…
マルティネです。
> Trying to pull docker.io/library/alpine:latest...
> Error: initializing source docker://alpine:latest: pinging container registry registry-1.docker.io: Get "https://registry-1.docker.io/v2/": dial tcp: lookup registry-1.docker.io on 127.0.0.1:53: server misbehaving
すみません、確認してませんでしたが、手元の Armadillo にインターネットにアクセスできないんですね?(DNSサーバーが変というエラーはちょっと不明ですが…)
これでは確認しにくいので、添付したファイルを armadillo にコピーして、「podman load -i alpine.tar」で一時的のストレージへイメージを追加していただければ podman_start が通るはずです。
お手数ですが、よろしくお願いします。
ファイル | ファイルの説明 |
---|---|
alpine.tar | docker.io/alpine:latest コンテナイメージ |
kitamura-a
回答ありがとうございます。
以下の手順で実行しました(添付写真と同様)が、メッセージはこない状態です。
podman_start -v udp でのエラーは無くなっているように見えました。
podman_start -v udpの時、こちらに添付していただいた内容とは少し違うので気にはなっています(添付参照)。
手順
---------------------------------------------------------------
・いただいた[alpine.tar]をG4にコピー。
・podman load -i alpine.tar コマンド実施。
・podman_start -v udp を実行(エラー等は出ていない)。
・podman exec -i udp nc -l -p 50241 を実行。
・仮想環境VBのATDE9から、date | nc -u 192.168.100.113 50241 を実行。
(G4ターミナルには何も出ない状態)
-------------------------------------------------------------------
開発時はインターネットにアクセスは可能です(もう一方のLANにて設定しており、環境構築の際に使用していました)。
最終的なリリース時はローカル(インターネットなし)で構築したいと考えております。
ファイル | ファイルの説明 |
---|---|
WS000082.JPG |
at_makoto.sato
kitamura-a
at_dominique.m…
kitamura-aさん
> こちらで試しましたが、状況は変わりませんでした。
ありがとうございます。
これで完全にネットワークの問題であることを確認できましたので、次の確認に進めます。
一旦 podman を止めて、armadillo の方でいくつかの確認をお願いします。
ネットワークを使えない前提で、パッケージの追加は少し面倒になりますが、よろしくお願いします。添付にした tcpdump-4.99.1-r3.apk.tar を armadillo にコピーしていただいて、以下のコマンドを実効していただけますでしょうか。
`ip route` と `tcpdump` コマンドの出力をお願いします。
# フォーラムで .apk を添付できないので .tar ファイルに入れて、その展開が必要です。 armadillo:~# tar xvf tcpdump-4.99.1-r3.apk.tar tcpdump-4.99.1-r3.apk # パッケージのインストール自体です。ネットワークを使わないようにオプションが必要です。 armadillo:~# apk add --no-network --force-broken-world ./tcpdump-4.99.1-r3.apk WARNING: Ignoring https://download.atmark-techno.com/alpine/v3.16/atmark: No such file or directory WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.16/main: No such file or directory WARNING: Ignoring https://dl-cdn.alpinelinux.org/alpine/v3.16/community: No such file or directory (1/1) Installing tcpdump (4.99.1-r3) Executing busybox-1.35.0-r17.trigger OK: 166 MiB in 219 packages # ネットワーク設定の確認です。kitamura-aさんの場合は eth1 も載ってるはずです。 armadillo:~# ip route default via 172.16.0.1 dev eth0 src 172.16.1.71 metric 100 172.16.0.0/16 dev eth0 scope link src 172.16.1.71 metric 100 # tcpdump でパケットをログしてみます。そのコマンドを実効してから、 # 再び ATDE から「date | nc -u 192.168.100.113 50241」を実効してみてください。 armadillo:~# tcpdump -i any -n port 50241 tcpdump: data link type LINUX_SLL2 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes 08:35:45.425047 eth0 In IP 172.16.69.20.33574 > 172.16.1.71.50241: UDP, length 29 #確認が終わった際に ctrl + C で終了させます ^C 1 packet captured 2 packets received by filter 0 packets dropped by kernel
そこで、tcpdump で何も表示されない場合は ATDE と Armadillo の間に何かつながらない理由がありますので、ネットワーク設定の確認が必要です。
ここでパケットが表示された場合は、ip route の出力によって解決方法が異なる場合もありますので、後ほどの返事で再び案内します。
よろしくお願いします
ファイル | ファイルの説明 |
---|---|
tcpdump-4.99.1-r3.apk_.tar | alpine リポジトリに入ってる tcpdump パッケージです。 |
kitamura-a
回答ありがとうございます。
開通しました。
ご説明いただいたコマンドを入力してパケットを受信できました。
(ポートと試験方法は少し変更しましたが、今回の手順によって初めて受信できました。)
引き続きよろしくお願いいたします。
ファイル | ファイルの説明 |
---|---|
20221028_log.txt |
at_dominique.m…
kitamura-a
> 添付していただいたログがよく分かりませんが、受信ができたようで何よりです。
すいません。添付内容を間違えていたようでした。実際は下記の通りになりました。
たとえば、これをコンテナ起動内のアプリケーションで実施する場合は、コンテナごとに同様の操作、インストールが必要であるということでしょうか。
また、現状はコンテナ起動時に
podman run -it --name=demo \
--publish=50241:50241/udp \
といったudpの部分を追加しているのですが、これも必要ということでしょうか。
UDP受信ができた時のログ
---------------------------------------------------------------------------------------------
armadillo:/etc/atmark/containers# tcpdump -i any -n port 50041
tcpdump: data link type LINUX_SLL2
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
09:24:54.100631 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:55.120653 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:56.140620 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:57.160315 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:58.180586 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:24:59.200530 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
09:25:00.220493 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
^C
7 packets captured
7 packets received by filter
0 packets dropped by kernel
at_dominique.m…
> たとえば、これをコンテナ起動内のアプリケーションで実施する場合は、コンテナごとに同様の操作、インストールが必要であるということでしょうか。
tcpdump は調査のためのツールです。
受信ができたのは、nc -u -l か自分のアプリケーションでできたように理解しましたので、tcpdump がもう不要です。
ご自分のコンテナをインストールして、起動時に --publish=50241:50241/udp の様なオプションを設定すれば大丈夫です。
私が案内した apk add のコマンドでは、g4 のメモリオーバーレーでしかインストールされてませんので、Armadilloを再起動させれば tcpdump のコマンドが消えます。
> また、現状はコンテナ起動時に
> podman run -it --name=demo \
> --publish=50241:50241/udp \
>
> といったudpの部分を追加しているのですが、これも必要ということでしょうか。
はい、/udp の部分も必要です。 `--publish=50241:50241` だけを設定した場合は tcp の 50241 ポートを意味しますので、間違った場合には受信できません。
よろしくお願いします。
kitamura-a
度々すみません。
> ここでパケットが表示された場合は、ip route の出力によって解決方法が異なる場合もありますので、後ほどの返事で再び案内します。
ip routeの結果を添付し忘れたので下記に添付しておきます。
>後ほどの返事で再び案内します。
先に回答しました実際にコンテナで使用する方法と合わせてお教えいただけると助かります。
よろしくお願い致します。
ip routeコマンドの結果log
-------------------------------------------------------------------
ip route
default via 192.168.1.253 dev eth1 metric 101
10.88.0.0/16 dev podman0 scope link src 10.88.0.1
192.168.1.0/24 dev eth1 scope link src 192.168.1.211 metric 101
192.168.100.0/24 dev eth0 scope link src 192.168.100.113 metric 100
at_dominique.m…
> >後ほどの返事で再び案内します。
> 先に回答しました実際にコンテナで使用する方法と合わせてお教えいただけると助かります。
こちらこそ分かっておらず、すみません。
tcpdumpでパケットを確認できましたが、まだアプリケーションでは確認できてないということでよろしいですね?
それでは、tcpdump の行をもう一度確認してみましょう:
09:24:59.200530 eth0 B IP 192.168.100.41.50241 > 192.168.100.255.50041: UDP, length 10
これでは、192.168.100.41 を物デバイス(ATDE?)の 50241 ポートから、eth0 の broadcast アドレス(192.168.100.255)の ポート50041へ通信しているように見えます。
そこで:
- 受信側のポート設定は 50241 ではなく、 50041 にするべきです。
- podman では broadcast アドレスをデフォルトのネットワークでは使えませんので、host のネットワークを使う必要があります。その場合は --publish のオプションも不要になりますが、コンテナからなんでも出きるようになりますので unicast の場合は publish を使ってください。
以下のコマンドで確認できると思います:
# 必要な場合にはまた podman load で前回の alpine.tar をロードしてください armadillo:~# podman run --rm -ti --network=host docker.io/alpine nc -vulp 50041 listening on [::]:50041 ... connect to [::ffff:172.16.255.255]:50041 from [::ffff:172.16.69.20]:41840 ([::ffff:172.16.69.20]:41840) Fri 28 Oct 15:23:55 JST 2022 # ctrl+c で停止してください ^Cpunt!
nc で確認を取れましたら、自分が開発したアプリケーションでも確認してください。
よろしくお願いします
kitamura-a
回答ありがとうございます。
armadillo上で確認した結果を添付します。
下記①、②どちらも確認は取れています。
しかし、コンテナを起動してその中のアプリケーションを実行して起動した場合には動作が確認できておりません。
そこでコンテナの実行方法や指定の方法に何かあるのではないかな(ATDE9上で①と通信ができることもあり)と推測していますが、この辺りの仕組みがはっきりわかっていない為、お問い合わせをしているという次第です。
ご確認お願い致します。
①ハードウェア(192.168.100.41)からグローバル(192.168.100.255)で、aa 55 30 30 30 32 52 02 a5 5a という10バイトのデータを送信してG4が受信できた結果
-----------------------------------------------------------------------------------------------------------------------
armadillo:/etc# podman run --rm -ti --network=host docker.io/alpine nc -vulp 50041
listening on [::]:50041 ...
connect to [::ffff:192.168.100.255]:50041 from [::ffff:192.168.100.41]:50241 ([::ffff:192.168.100.41]:50241)
・0002Rペ^Cpunt!
armadillo:/etc#
②バーチャルボックス ATDE9(192.168.100.200)から date | nc -u 192.168.100.113 50041 というコマンドを送信してG4が受信できた結果
-----------------------------------------------------------------------------------------------------------------------
armadillo:/etc# podman run --rm -ti --network=host docker.io/alpine nc -vulp 50041
listening on [::]:50041 ...
connect to [::ffff:192.168.100.113]:50041 from [::ffff:192.168.100.200]:53023 ([::ffff:192.168.100.200]:53023)
2022年 10月 28日 金曜日 15:58:27 JST
kitamura-a
at_dominique.m…
kitamura-aさん
自作のアプリケーションでのUDP受信通信動作確認ができました。 (グローバルに送信していたものをG4のIPアドレス192.168.100.113にのみ送信に変更した)
基本的な質問になりますが、G4側は相手からのグローバル送信は受信できないということですか。
コンテナを --network=host
で起動した場合はグローバル送信(broadcast の .255アドレス)あてのパケットでも受信できるはずです。
--publish
の制限でG4のIPアドレス以外のパケットはコンテナに転送されませんが、 --network=host
の場合はG4のネットワークをそのまま使ってますので普通に受信できます。
そちらのログでも、以下の行にちゃんと「192.168.100.255」アドレスへの接続ができています:
connect to [::ffff:192.168.100.255]:50041 from [::ffff:192.168.100.41]:50241 ([::ffff:192.168.100.41]:50241)
なので、自分のアプリケーションでも使えるはずです。自分のアプリケーションの podman コマンドをもう一度確認して、 --publish
を使わずに --network=host
を使ってください。
(/etc/atmark/containers/*.conf の場合は「 add_ports
」を使わず、「 set_network host
」でネットワークを設定してください)
よろしくお願いします。
kitamura-a
at_dominique.m…
2022年10月27日 8時33分
kitamura-aさん、
お世話になっています。
> ●内容
> ・armadilloーIoT G4にてUDPソケット通信が動作できない為、解決したいと考えております。
armadillo側で UDP で listen しても、パケットを受信できていないということでよろしでしょうか?
とりあえず一番シンプルなコンテナで試してから、自分のアプリケーションに少しずつ近づいていきたいと思います。
私の環境では、以下のコンテナで受信できていますが、そちらも同じコマンドで確認できていますか?
これで受信ができていたら、アプリケーションに何か問題あるかもしれませんので、確認の上もうちょっと詳しく教えてください。
これで受信できなかった場合には問題を探す必要がありますね。詳しいコマンドをその時に教えますので、また聞いてください。
よろしくお願いします。