ElixirでIoT#1.0：IoTボードへのLinux環境の準備

# はじめに

どうもこんにちは．
IoT歴は組込みと呼ばれている時代から数えれば10年超えですが，自称は変わらず「組込マー」だと思い込んでいます．

[fukuoka.ex](https://fukuokaex.connpass.com/)という福岡のElixir/Phoenixコミュニティにて場違いなIoT芸を披露したら，名古屋出身の京都人らしく**ややウケ**を獲得しました^^;
そこで登壇した内容「巷を賑わせている新しめの関数型言語ElixirをIoTボードで動かしたらどうなんの？」を，季節外れの[Advent Calendar](https://qiita.com/advent-calendar/2017/elixir-or-phoenix)にて連載することになりました．

[ElixirでIoT：連載目次](https://qiita.com/takasehideki/items/8f43f1853ce88cbbe82e)
　|> [ElixirでIoT#1.1：IoTボードへのElixir環境の構築とEEloTツールキットの紹介](https://qiita.com/takasehideki/items/fc570ae92a895caed213)
　|> [ElixirでIoT#1.2：いろいろ分かるベンチマークを整備してみる](https://qiita.com/takasehideki/items/e1dcb4058c7d0b51d554)
　|> [ElixirでIoT#1.3：IoTボードで動いた！Phoenixが立った！性能評価と考察](https://qiita.com/takasehideki/items/0aa644639f81c2ad0bbc)
　|> [ElixirでIoT#2.1：Nervesって何者？ラズパイでLチカできんの！？](https://qiita.com/takasehideki/items/94820516ec95b85bae32)

本記事では，Advent Calendarでの連載に先立って，使用したIoTボードの紹介とLinux環境の構築方法についてお送りします．なお，今回のElixir成分はゼロです．

# IoTボードの選定

連載におけるIoTボードの定義は
**「きびきびとLinuxが動いてさくっとネットに繋がるモノ」**
とします．異論は認めます．

今回は，私の手元に転がっていた3種類のIoTボードを使ってみました．

- [Raspberry Pi 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)
    - 使いやすさが自慢のIoT時代の風雲児です．とりあえず買ってみて動かしてみた方も多いかと思います．
    - 低価格なのに64-bit CPUが4-coreも載っていたり無線LANが標準搭載だったりで，下手なラップトップより性能が高くなるなんてこともあります．
    - 今回は，[Raspbian Stretch with Desktop 4.9](https://www.raspberrypi.org/downloads/raspbian/)というDebianベースのラズパイ純正OSと，[Ubuntu MATE 16.04](https://ubuntu-mate.org/raspberry-pi/)の２種類を試してみました．
- [ODROID-XU3](http://www.hardkernel.com/main/products/prdt_info.php?g_code=g140448267127)
    - 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](https://odroid.in/ubuntu_16.04lts/)を使いました．本ボードはスマホ向けなところもあるので，Androidを使っても面白かったかもしれません．
- [ZYBO](https://japan.xilinx.com/products/boards-and-kits/1-4azfte.html)
    - Xilinx社のZynq-7000というデバイスが搭載されています．2-coreのプロセッサ（32-bit）に加えて，書き換え可能なハードウェア回路であるFPGAがオンチップでSoCとして集積されています．
    - 今回は，Xillybus社が公開している[Xillinux-2.0](http://xillybus.com/xillinux)を使いました．Ubuntu 16.04 LTSベースで，プロセッサ-FPGA間のデータ通信を効率化するための通信インタフェースおよびFIFOバッファがハードウェアIPとして含まれています（今回はFPGA自体を使いませんが^^;

詳しいスペックのサマリは下記のとおりです．プロセッサアーキテクチャとかOSの違いがElixir性能にどう効いてくるのか，非常に楽しみですね．


| Board | OS | Core | Memory | Network |
|:---|:---|:---|:---|:---|
| [Raspberry Pi 3 Model B](https://www.raspberrypi.org/products/raspberry-pi-3-model-b/) | [Raspbian Stretch with Desktop 4.9](https://www.raspberrypi.org/downloads/raspbian/) / [Ubuntu MATE 16.04](https://ubuntu-mate.org/raspberry-pi/) | 4x 1.2GHz Cortex-A53 (64-bit) | 1GB LPDDR2 | 150Mbps 2.4GHz 802.11b/g/n WiFi |
| [ODROID-XU3](http://www.hardkernel.com/main/products/prdt_info.php?g_code=g140448267127) | [ubuntu-16.04-mate-odroid-xu3-20170731](https://odroid.in/ubuntu_16.04lts/) | 4x 2.0GHz Cortex-A15 + 4x 1.4GHz Cortex-A7 (32-bit) | 2GB LPDDR3 | 300Mbps 2.4GHz 802.11n/g/b WiFi |
| [ZYBO](https://japan.xilinx.com/products/boards-and-kits/1-4azfte.html) | [Xillinux-2.0](http://xillybus.com/xillinux) | 2x 650MHz Cortex-A9 (32-bit) | 512MB DDR3 | 1GBit Ethernet PHY |


# Linux環境の構築

基本的には，microSDを用意して，各所からダウンロードしてきたカーネルイメージファイル（.img）を焼くだけです．

## SDカードの選定

SDカードは，最低でもSDHC/Class 10を選びましょう．転送速度もなるべく速いものがよいです．カーネルイメージのサイズも大きいですし後々にいろいろインストールすることを考えると，容量は最低でも8GBは欲しいところです．

私は[Panasonic RP-SMGB64GJK](https://panasonic.jp/sd/p-db/RP-SMGB64GJK.html)を使っています．下手したらボードよりも高くつくのがIoTのツラいところですが，ここをケチると運用時にボード動作が重くなったり＞突然の死＜を招いたりしますので，社内／家庭内稟議を頑張りましょう．

## カーネルイメージの書き込み

母艦PCがLinuxまたはMacの場合は，`dd`または`ddrescue`を使ってSDカードにカーネルイメージを焼きます．Windowsの場合は[Win32DiskImager](https://itdecoboconikki.com/2017/03/05/win32diskimager/)を使います．

`dd`は遅いし途中経過が表示されないと不安な方は，`ddrescue`がオススメです．SDカードのマウント位置`/dev/sdb`はご自身の環境に合わせてください．

```sh
$ sudo dd bs=4M if=<image_file>.img of=/dev/sdb
# または
$ sudo ddrescue <image_file>.img /dev/sdb
```

詳しい手順は[こちらの記事](https://qiita.com/takanemu/items/8fa157688efe0d4b01a6)や[こちらの記事](https://tech.nosuz.jp/2016/05/install-raspbian-jessie/)も参考にしてください．


なお，ZYBO/Xillinuxの場合は，FATの16MBボリュームに`boot.bin`と`devicetree.dtb`もコピーする必要があります．これらのファイルには，ブートローダやFPGAイメージファイル，カーネルのデバイスツリーが含まれます．プログラマブルSoCならではの面白くツラいところです．
詳しい手順や解説は[こちらの記事](http://marsee101.blog19.fc2.com/blog-entry-2812.html)を参考にしてください．

## Linuxの追加設定

IoTボードにmicroSD，ディスプレイ，キーボード等の周辺機器を接続して起動すれば，Linuxが立ち上がるのが観測できます．

周辺機器をいちいち繋ぎ変えてもよいですが，やっぱりSSH接続でリモート操作できるとなにかと便利です．
[SDカードのパーティションを拡張](http://yamada.daiji.ro/blog/?p=382)したり，リモート接続のために[起動時にSSHサーバを自動起動](https://teratail.com/questions/62910)したり[起動時にWiFi自動接続できるように](http://dorapon2000.hatenablog.com/entry/2016/09/17/075920)したり，[SSHアクセス用のユーザを作成してsudoersに追加](https://qiita.com/soushiy/items/fabe64ec382a007a753c)したり，いろいろ環境を整えていきましょう．


# おわりに

机に広げた実験環境はこんな感じです．配線まみれで汚い，，，
![IMG_9716-min.jpg](https://qiita-image-store.s3.amazonaws.com/0/240349/159b12a8-c27f-86c0-3423-9dde1339d1f0.jpeg)

[Elixir or Phoenix Advent Calendar 2017](https://qiita.com/advent-calendar/2017/elixir-or-phoenix)への投稿をお楽しみに！！

# 参考ページ

- [Linux(Ubuntu)で、RaspberryPiのSDカードをインストールする方法](https://qiita.com/takanemu/items/8fa157688efe0d4b01a6)
- [ヘッドレスRASPBERRY PIにRASPBIAN(JESSIE)をインストール](https://tech.nosuz.jp/2016/05/install-raspbian-jessie/)
- [Win32DiskImagerのインストールと使い方](https://itdecoboconikki.com/2017/03/05/win32diskimager/)
- [FPGAの部屋：ZYBOでXillinuxを起動してみる](http://marsee101.blog19.fc2.com/blog-entry-2812.html)