はじめに
どうもこんにちは.
IoT歴は組込みと呼ばれている時代から数えれば10年超えですが,自称は変わらず「組込マー」だと思い込んでいます.
fukuoka.exという福岡のElixir/Phoenixコミュニティにて場違いなIoT芸を披露したら,名古屋出身の京都人らしくややウケを獲得しました^^;
そこで登壇した内容「巷を賑わせている新しめの関数型言語ElixirをIoTボードで動かしたらどうなんの?」を,季節外れのAdvent Calendarにて連載することになりました.
ElixirでIoT:連載目次
|> ElixirでIoT#1.1:IoTボードへのElixir環境の構築とEEloTツールキットの紹介
|> ElixirでIoT#1.2:いろいろ分かるベンチマークを整備してみる
|> ElixirでIoT#1.3:IoTボードで動いた!Phoenixが立った!性能評価と考察
|> ElixirでIoT#2.1:Nervesって何者?ラズパイでLチカできんの!?
本記事では,Advent Calendarでの連載に先立って,使用したIoTボードの紹介とLinux環境の構築方法についてお送りします.なお,今回のElixir成分はゼロです.
IoTボードの選定
連載におけるIoTボードの定義は
「きびきびとLinuxが動いてさくっとネットに繋がるモノ」
とします.異論は認めます.
今回は,私の手元に転がっていた3種類のIoTボードを使ってみました.
-
Raspberry Pi 3 Model B
- 使いやすさが自慢のIoT時代の風雲児です.とりあえず買ってみて動かしてみた方も多いかと思います.
- 低価格なのに64-bit CPUが4-coreも載っていたり無線LANが標準搭載だったりで,下手なラップトップより性能が高くなるなんてこともあります.
- 今回は,Raspbian Stretch with Desktop 4.9というDebianベースのラズパイ純正OSと,Ubuntu MATE 16.04の2種類を試してみました.
-
ODROID-XU3
- Samsung Exynos 5422が搭載されています.arm社の提唱するbig.LITTEと呼ばれるプロセッサアーキテクチャを採用していて,高性能なコア(Cortex-A15)と電力効率の良いコア(Cortex-A7)が4個ずつ載っていて,さらに動的電圧周波数制御(DVFS: Dynamic Voltage and Frequency Scaling)ができます.コアはいずれも32-bitで,命令セットに互換性があります.
- つまるところ,アプリの稼働状況に応じてコアの動作周波数やプロセスの動作コアを変更できて,自由自在に省電力スケジューリングを実現できます.
- 今回は,公式のサポートWikiで公開されているubuntu-16.04-mate-odroid-xu3-20170731を使いました.本ボードはスマホ向けなところもあるので,Androidを使っても面白かったかもしれません.
-
ZYBO
- Xilinx社のZynq-7000というデバイスが搭載されています.2-coreのプロセッサ(32-bit)に加えて,書き換え可能なハードウェア回路であるFPGAがオンチップでSoCとして集積されています.
- 今回は,Xillybus社が公開しているXillinux-2.0を使いました.Ubuntu 16.04 LTSベースで,プロセッサ-FPGA間のデータ通信を効率化するための通信インタフェースおよびFIFOバッファがハードウェアIPとして含まれています(今回はFPGA自体を使いませんが^^;
詳しいスペックのサマリは下記のとおりです.プロセッサアーキテクチャとかOSの違いがElixir性能にどう効いてくるのか,非常に楽しみですね.
Board | OS | Core | Memory | Network |
---|---|---|---|---|
Raspberry Pi 3 Model B | Raspbian Stretch with Desktop 4.9 / Ubuntu MATE 16.04 | 4x 1.2GHz Cortex-A53 (64-bit) | 1GB LPDDR2 | 150Mbps 2.4GHz 802.11b/g/n WiFi |
ODROID-XU3 | ubuntu-16.04-mate-odroid-xu3-20170731 | 4x 2.0GHz Cortex-A15 + 4x 1.4GHz Cortex-A7 (32-bit) | 2GB LPDDR3 | 300Mbps 2.4GHz 802.11n/g/b WiFi |
ZYBO | Xillinux-2.0 | 2x 650MHz Cortex-A9 (32-bit) | 512MB DDR3 | 1GBit Ethernet PHY |
Linux環境の構築
基本的には,microSDを用意して,各所からダウンロードしてきたカーネルイメージファイル(.img)を焼くだけです.
SDカードの選定
SDカードは,最低でもSDHC/Class 10を選びましょう.転送速度もなるべく速いものがよいです.カーネルイメージのサイズも大きいですし後々にいろいろインストールすることを考えると,容量は最低でも8GBは欲しいところです.
私はPanasonic RP-SMGB64GJKを使っています.下手したらボードよりも高くつくのがIoTのツラいところですが,ここをケチると運用時にボード動作が重くなったり>突然の死<を招いたりしますので,社内/家庭内稟議を頑張りましょう.
カーネルイメージの書き込み
母艦PCがLinuxまたはMacの場合は,dd
またはddrescue
を使ってSDカードにカーネルイメージを焼きます.Windowsの場合はWin32DiskImagerを使います.
dd
は遅いし途中経過が表示されないと不安な方は,ddrescue
がオススメです.SDカードのマウント位置/dev/sdb
はご自身の環境に合わせてください.
$ sudo dd bs=4M if=<image_file>.img of=/dev/sdb
# または
$ sudo ddrescue <image_file>.img /dev/sdb
詳しい手順はこちらの記事やこちらの記事も参考にしてください.
なお,ZYBO/Xillinuxの場合は,FATの16MBボリュームにboot.bin
とdevicetree.dtb
もコピーする必要があります.これらのファイルには,ブートローダやFPGAイメージファイル,カーネルのデバイスツリーが含まれます.プログラマブルSoCならではの面白くツラいところです.
詳しい手順や解説はこちらの記事を参考にしてください.
Linuxの追加設定
IoTボードにmicroSD,ディスプレイ,キーボード等の周辺機器を接続して起動すれば,Linuxが立ち上がるのが観測できます.
周辺機器をいちいち繋ぎ変えてもよいですが,やっぱりSSH接続でリモート操作できるとなにかと便利です.
SDカードのパーティションを拡張したり,リモート接続のために起動時にSSHサーバを自動起動したり起動時にWiFi自動接続できるようにしたり,SSHアクセス用のユーザを作成してsudoersに追加したり,いろいろ環境を整えていきましょう.
おわりに
Elixir or Phoenix Advent Calendar 2017への投稿をお楽しみに!!