[Armadillo-IoT G4] 開封の儀

# 0.はじめに
## 0-1.背景
大変ありがたいことに、Atmark-TechnoさんのWebでも紹介されていたALGYANイベントの
「Armadillo-IoTゲートウェイ G4 LANモデル開発セットを抽選で2名様にプレゼントする企画」に当選しました。 
[Atmark-Technoさんの告知](https://armadillo.atmark-techno.com/events/202205_algyan)
![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/8725e2a8-49b4-6330-831e-c48a81cf3166.jpeg)
以前から[ALGYANさん](https://algyan.connpass.com/)にはハンズオンイベントなどで大変お世話になっているのですが、こんな大物のプレゼント当選は初めてです。
[ALGYAN7周年IoT祭2022](https://algyan.connpass.com/event/244177/)
![ALGYAN告知](https://connpass-tokyo.s3.amazonaws.com/thumbs/24/cc/24cc56f0523180418a86effd121b7744.png)
で、こんな条件がありました。
![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/81b67f32-8be6-e590-7903-1f72f0c0d986.jpeg)

てなわけで、久しぶりのQIITA記事は「Armadillo-IoT G4開封の儀」です。

## 0-2.ALGYANでの實吉さんのプレゼン
ALGYANイベントでの實吉さんのプレゼン資料は以下のように大変興味深い内容でした。
[プレゼン資料](https://www.slideshare.net/TomohiroSaneyoshi/iotalgyan7tharmadillobaseos20220528pdf)
<iframe src="//www.slideshare.net/slideshow/embed_code/key/Ghso0fm4s8fEZ5" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/TomohiroSaneyoshi/iotalgyan7tharmadillobaseos20220528pdf" title="IoT_ALGYAN_7th_ArmadilloBaseOS_20220528.pdf" target="_blank">IoT_ALGYAN_7th_ArmadilloBaseOS_20220528.pdf</a> </strong> from <strong><a href="//www.slideshare.net/TomohiroSaneyoshi" target="_blank">Tomohiro Saneyoshi</a></strong> </div>
<br>

大変興味深い内容だったんですが、、、
- 超盛り沢山なイベントだったので、實吉さんプレゼン時点では既に知恵熱出まくり状態
- 生来くじ運悪いタイプなので、Armadilloプレゼント応募に申し込んだことも忘れてた

ってな訳で、正直言うと「BaseOSに BootloderとOSが２面あるところは、Nerversと同じだなぁ～」くらいの印象しか残ってません m(_ _)m
[Nerves-JP](https://nerves-jp.connpass.com/)
![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/ec352790-c512-0848-228e-dbcdc12c3ba8.png)
そもそもArmadilloってプロが使うやつで、ラズパイで悪戦苦闘してる自分には別世界の話って思いもありましたし・・・
こんな事になるならちゃんと集中して聞いておきたかった(^^;

# 1.開封の儀

ALGYANさんからクロネコヤマトで届きました
![004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/b305d0d5-ec50-1148-1393-91757f0031bf.jpeg)
Armadillo以外にも色々いただきました
![005.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/119280e2-0095-67ae-f528-05bac8d798ef.jpeg)
Armadillo開封しました
![006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/897bcfea-cd6f-13ef-0db8-0f35881edafc.jpeg)

素朴な印象：
- さすがプロの使うやつやぁ〜
- ケースがしっかりしとる
- ケーブルもしっかりしとる
- 電源がゴツい・・・

__はい、物理的に開封しましたよ〜(^^;__<br>

流石にこれで終わりでは申し訳ないので、以下マニュアルをベースに、Armadillo IoT G4の売り(?)のBaseOS やPodmanコンテナにご挨拶するところまでは進めたいと思います。
[Armadillo-IoT ゲートウェイ G4 製品マニュアル](https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-g4/document/armadillo-iotg-g4_product_manual_ja-1.7.0.pdf)
![007.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/37132d89-63a9-c8e6-73c9-9433e118754e.jpeg)

# 2.開発環境(ATDE)で躓く

## 2-1.Windows VMware Player準備
マニュアルp35にこんな記述が・・・
![008.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/d450670b-abf9-1f2c-89dc-d63cfbae2cba.jpeg)
![009.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/881e254c-8f2e-6d49-940b-38442cb3a30d.jpeg)
開発環境(ATDE)はVMware Playerのvmx+vmdkで提供されてるようですが、Macではダメですか・・・
我が家のWindowsマシンは 旧型MacbookのBOOTCAMP環境なのでそっちでトライすることに。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/40a8e885-a82d-8494-0a92-8205a0d91af8.png)
Docker使うようになって、MacでもVirtualBoxはセキュリティ系「やられVM」作る時くらいしか使わなくなってたので、久しぶりにWindows10 + VMware PlayerインストールしてVMware画面見ました。
でもなんで、Mac + VMware Fusionじゃだめなんでしょうね？

## 2-2.ATDEが起動出来ません orz

__ぬうぉおおお__
マニュアルp40に記載のある画面が出てATDEが起動出来ないので、
- マニュアル対処をやってみるが・・・起動しない
- VM割当メモリやグラフィックメモリ割当を増やしたりしてみるが・・・起動しない
![011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/2f5af7b0-4ba6-cd69-13a4-12c290112350.jpeg)

まぁこれは我が家の環境のせいなんでしょうねぇ・・・Appleからも見放されてるLate 2011マシンなので仕方ないです。
かと言ってメインマシンのiMac(こちらはLate 2013^^;) をBOOTCAMP起動する訳にもいかないし。

## 2-3.ATDE使わないご挨拶方法

マニュアル読み進めると、ATDE起動 > GNOME Terminal で minicom使って、USBシリアルアクセスするのが最初のステップのようです。
これならMac screenコマンドでも出来そうです。
![012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79389/8a8c8f4c-a351-6016-cdf7-704ff09e4446.jpeg)

# 3.Macからご挨拶

## 3-1. screenでご挨拶

minicomに設定するパラメータをscreenコマンド引き数で指定するとこんな感じです

```
screen /dev/tty.usbserial-1430 115200,cs8,-parenb,-cstopb
```
ちなみに、/dev/tty.usbserial-1430 ってデバイス名は、USBケーブルの装着前後でlsコマンドで調べています。

```
iMac:~ kenzo$ ls -l /dev/tty.usb*
gls: cannot access '/dev/tty.usb*': No such file or directory
iMac:~ kenzo$ ls -l /dev/tty.usb*
crw-rw-rw- 1 root wheel 18, 2  6  4 10:03 /dev/tty.usbserial-1430
```
で、ログイン画面にご挨拶できました。

```
iMac:~ kenzo$ screen /dev/tty.usbserial-1430 115200,cs8,-parenb,-cstopb
Welcome to Alpine Linux 3.14
Kernel 5.10.52-1-at on an aarch64 (/dev/ttymxc1)

armadillo login: 
```
早速お約束です。

```
rmadillo:~$ cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.14.3
PRETTY_NAME="Alpine Linux v3.14"
HOME_RL="https://alpinelinux.org/"
BG_REPORT_RL="https://bugs.alpinelinux.org/"

armadillo:~$ uname -a
Linux armadillo 5.10.52-1-at #2-Alpine SMP PREEMPT Thu Dec 2 00:04:57 TC 2021 aarch64 GN/Linux
```
LANケーブルを挿してみます。

```
1239.552929] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 1239.559965] fec 30be0000.ethernet eth0: Link is p - 100Mbps/Full - flow control rx/tx

armadillo:~$ ip a
1: lo: <LOOPBACK,P,LOWER_P> mtu 65536 qdisc noqueue state NKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MLTICAST,P,LOWER_P> mtu 1500 qdisc mq state P qlen 1000
    link/ether 00:11:0c:33:00:f4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.3.54/24 brd 192.168.3.255 scope global dynamic noprefixroute eth0
       valid_lft 86328sec preferred_lft 86328sec
    inet6 2400:2412:3020:7700:5a05:92cd:e875:f5d2/64 scope global dynamic noprefixroute 
       valid_lft 14329sec preferred_lft 12529sec
    inet6 fe80::308:e04f:c0cc:b547/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: eth1: <NO-CARRIER,BROADCAST,MLTICAST,P> mtu 1500 qdisc mq state DOWN qlen 1000
    link/ether 00:11:0c:33:00:f5 brd ff:ff:ff:ff:ff:ff
```

sudoコマンドが無いのでlogout & rootでログインしてping確認も出来ました。

```
armadillo:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=117 time=7.473 ms
64 bytes from 8.8.8.8: seq=1 ttl=117 time=7.230 ms
64 bytes from 8.8.8.8: seq=2 ttl=117 time=6.934 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 6.934/7.212/7.473 ms
```

折角rootで入ったのでLチカもやってみます。

```
armadillo:~# echo 0 > /sys/class/leds/led1/brightness
armadillo:~# echo 1 > /sys/class/leds/led1/brightness
```
## 3-2. sshでご挨拶

LANも使えるのでsshd導入して、iMacからsshアクセスすることにします。

再起動時にも使えるようにおまじないも入れます。

```
rc-update add sshd
persist_file /etc/runlevels/default/sshd
```
ご挨拶できました。

```
iMac:~ kenzo$ ssh atmark@192.168.3.54
atmark@192.168.3.54's password: 
Welcome to Alpine!

The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org/>.


Please note this system is READ-ONLY with a read-write overlayfs,
after updating password make sure to save new password with
# persist_file /etc/shadow

You can change this message by editing /etc/motd.
armadillo:~$ 
```

# 4.Podmanコンテナにご挨拶

## 4-1.そもそもPodmanって何？

参考: [Podman](https://www.tohoho-web.com/docker/podman.html)
- Red Hat社が開発したコンテナ管理ツールです。
- コマンド引数は docker コマンドとほぼ互換です。
- root権限が無くても一般ユーザでも利用可能です。

最後のは別途試すとして、まずはdockerコマンドでお馴染みの hello_world からやってみます。

## 4-2. hello_world
```
armadillo:~# podman run docker.io/hello-world:latest
Trying to pull docker.io/library/hello-world:latest...
Getting image source signatures
Copying blob 7050e35b49f5 done  
Copying config 46331d942d done  
Writing manifest to image destination
Storing signatures

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (arm64v8)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```
Dockerコマンドと同じやねー

```
rmadillo:~# podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
armadillo:~# podman ps -a
CONTAINER ID  IMAGE                                 COMMAND     CREATED         STATUS                     PORTS       NAMES
8a427d580a86  docker.io/library/hello-world:latest  /hello      51 seconds ago  Exited (0) 50 seconds ago              agitated_archimedes

armadillo:~# podman image ls
REPOSITORY                     TAG         IMAGE ID      CREATED       SIZE
docker.io/library/hello-world  latest      46331d942d63  2 months ago  15.8 kB
```
これもDockerコマンドと同じ。覚えることが少ないのは助かります(^^;

## 4-3.docker.io/alpine

マニュアル p90 9.1 HowToで　docker.io/alpineが紹介されているので触ってみます。

```
armadillo:~# podman run -it --rm docker.io/alpine ls /
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob b3c136eddcbf done  
Copying config 6e30ab57ae done  
Writing manifest to image destination
Storing signatures
bin    dev    etc    home   lib    media  mnt    opt    proc   root   run    sbin   srv    sys    tmp    usr    var

armadillo:~# podman run -it --rm docker.io/alpine ls /bin
arch           cp             false          ionice         ls             mpstat         pwd            sleep          usleep
ash            date           fatattr        iostat         lsattr         mv             reformime      stat           watch
base64         dd             fdflush        ipcalc         lzop           netstat        rev            stty           zcat
bbconfig       df             fgrep          kbd_mode       makemime       nice           rm             su
busybox        dmesg          fsync          kill           mkdir          pidof          rmdir          sync
cat            dnsdomainname  getopt         link           mknod          ping           run-parts      tar
chattr         dumpkmap       grep           linux32        mktemp         ping6          sed            touch
chgrp          echo           gunzip         linux64        more           pipe_progress  setpriv        true
chmod          ed             gzip           ln             mount          printenv       setserial      umount
chown          egrep          hostname       login          mountpoint     ps             sh             uname
```

ashがあるようなので起動してみます。

```
armadillo:~# podman run -it --rm docker.io/alpine ash
/ # 
/ # cat /etc/os-release 
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.16.0
PRETTY_NAME="Alpine Linux v3.16"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
/ # 
```

めでたくPodmanコンテナにもご挨拶できました。

# 5.終わりに

Armadillo-ioT G4 という素晴らしいプレゼントをいただいたALGYAN様・Atmark-Techno様に改めて感謝です。__ありがとうございます！__

まずは「開封の儀」って事で、Armadillo-IoT G4の BaseOSとPodmanコンテナにご挨拶してみました。
とは言え、BaseOSの2面のBootloderとOSとか、Podmanコンテナの永続化など本当に面白そうな所はこれからです。
ご挨拶が済んだらもう友達なので、じっくり膝付き合わせてお付き合いしたいと思います。

あ、本来はNPUが魅力なはずなので、
[NXP製i.MX 8M Plus搭載](https://armadillo.atmark-techno.com/armadillo-iot-g4)
こんなAWSサンプルにも挑戦してみたいです。(もちろんAzureサンプルがあればそちらも試します:p)
[Armadillo-IoT G4 を用いた物体認識プログラムの動作確認と AWS 各サービスの利用による分析方法](https://armadillo.atmark-techno.com/howto/armadillo_iot_g4-detect-object-and-aws-services/main)

![システム構成図](https://download.atmark-techno.com/sample/armadillo_iot_g4-detect-object-and-aws-services-howto/system.png)

ではでは、開封の儀はここまでです。めでたしめでたし。