Intel Edisonの初期化後 毎回セットアップする作業をひとまとめ

切手大（よりちょっと大きい）のLinuxが動くミニデバイス**Intel Edison**を初期化するため``reboot ota``した直後、Intel Edison用Linux環境セットアップスクリプト相当の実行と、タイムゾーンなどの設定、opkgのリポジトリ設定とアップデート、必要なパッケージのインストールをする、いわゆるプロビジョニングスクリプトを用意しました。

![piandedson.jpg](https://qiita-image-store.s3.amazonaws.com/0/50435/a20bc412-9342-6566-7aea-032baf36ba26.jpeg)
**▲ラズベリーパイ（上）より、ずっとはやい！！**

**プロビジョニング**というのは、からっぽのサーバなどを使える状態にセットアップして設置することです。Intel Edisonも立派なLinuxサーバですので、初期化後に一定の状態に設定できるプロビジョニングが重要だと思います。例えば、Intel Edison Breakoutだけ買ってきてもらって、そこにアプリケーション（できた成果物っていう意味ね）を設置するときは、やっぱり動かすための土台は一定になるようにしなくてはなりませんよね。

今回のスクリプトで、簡単にIntel Edisonをリセット＆プロビジョニングできるようになるので、気軽に開発できます。

## reboot otaでの初期化に関する情報（Rel-1-Maint-WW42時点）

* Intel Edisonのフラッシュストレージ側に、再セットアップ用のファイルを置いておく
  - ↑むしろ開発中は再セットアップ用のファイルを置きっぱなしにしておく
  - ↑置きっぱなしにしていて間違って``reboot ota``しても泣かない（←ヒストリで誤爆する）
* ``/home`` 以下は初期化対象パーティションとは別なので初期化されない
  - rootユーザのホームディレクトリは、``/home/root``なので初期化されない
  - ``reboot ota``する前に/home/root に必要なファイルを入れておくと初期化後に引き継ぐことができる

## 使い方

**Intel Edisonを一度あらかじめセットアップしておき無線LAN情報をコピーしておく必要があります！！**

Intel Edisonをあらかじめセットアップしておき、無線LAN設定が終わって通信できている状態で``cp /etc/wpa_supplicant/wpa_supplicant.conf /home/root``を実行してrootユーザのホームディレクトリにコピーしておき、その後、シリアルコンソールで接続（Edison BreakoutやEdison Arduino Kitの場合はFTDIチップが載っている方のmicroUSBをPCにつないでPuTTYなどでCOMから接続）してrootログイン、`reboot ota`で初期化。空っぽになったEdisonにrootでログイン後、``/home/root``に下記シェルスクリプト``setup.sh``を置いて、``chmod 700 setup.sh``の後``./setup.sh``でセットアップをします。

```sh:setup.sh
#!/bin/sh -x

# =================================================================
#  configure_edison --setup 処理の代わりに設定をする
# =================================================================

# ---------------------------------------------------------------
# 1. hostname
# edisonにHOSTNAMEを設定し、edisonを無線LANアクセスポイント
# にするhostapdにも設定する。さらにBonjourでedison.local
# でアクセスできるようにmDNSを再起動する。
# Bonjourでホスト名アクセスする場合Macは何もいらず、
# WindowsはAppleからBonjourをダウンロードしてインストール、
# LinuxだったらAvahiあたりを入れる。

HOSTNAME="edison"

HOSTNAME_FILE=/etc/hostname
HOSTAPD_FILE=/etc/hostapd/hostapd.conf
echo $HOSTNAME > $HOSTNAME_FILE
hostname -F $HOSTNAME_FILE
sed -i "s/^ssid=.*/ssid=$HOSTNAME/" $HOSTAPD_FILE
systemctl restart mdns
sleep 2

# ---------------------------------------------------------------
# 2. root password
# EdisonはLinuxなのでIoTデバイスだとしてもパスワードが破られるとゾンビ
# ホストとして操られるリスクがあるのでパスワードは必ず設定する

PASSWORD="passw0rdPA55Word"

# chpasswdは、標準入力からユーザ名:パスワードの行を入れるこ
# とでパスワードが設定できるシェルスクリプトによる初期設定
# で便利なコマンド
echo "root:$PASSWORD" | chpasswd

# ---------------------------------------------------------------
# 3. Wi-Fi
# Wi-Fiの設定は、一度configure_edison --wifi で接続が確立できた後の
# /etc/wpa_supplicant/wpa_supplicant.conf を、
# /home/root/wpa_supplicant.conf にコピーしておく。この場合、生で接
# 続パスフレーズが書かれているので注意。

MY_WPASUPP_FILE=/home/root/wpa_supplicant.conf

WPASUPP_FILE=/etc/wpa_supplicant/wpa_supplicant.conf
\cp $WPASUPP_FILE $WPASUPP_FILE.original
\cp $MY_WPASUPP_FILE $WPASUPP_FILE
# wpa_supplicant.confの中にはPreSharedKeyが生で書かれていることがあ
# るので、rootユーザのみ読み書きできるようにする
chmod 600 $WPASUPP_FILE
# Edisonは最初はhostapdによるアクセスポイント機能が動かせるが、Edison
# を無線LANクライアントとして使う場合はhostapdは止める必要がある。自動
# 起動も止める。
systemctl stop hostapd
systemctl disable hostapd
# 無線LANサービスwpa_supplicantを起動する。
# hostapdとは排他利用となる。wpa_supplicantを自動起動にする。
systemctl restart wpa_supplicant
systemctl enable wpa_supplicant
# 下はwpa_supplicantを再起動せずに設定を再読込するコマンド。デバッグ用
#wpa_cli reconfigure
# 無線LANを起動してから安定するまでウェイトが必要
sleep 5
# 起動した無線LANのインタフェース名を取得（wlan0）
WLAN=`wpa_cli ifname | tail -n 1`
# 次の2行はwpa_supplicant.confにSSID接続設定が一つの場合はそのままでOK
wpa_cli list_networks
wpa_cli select_network 0
# 無線LANがネットワークに接続されたので、DHCPで無線LANにIPを設定
udhcpc -i $WLAN -n


# ---------------------------------------------------------------
# 4. sshd
# Edison起動時にUSBデバイスに接続されていたsshdを普通のネットワークデ
# バイスに接続しなおします。

sed -i 's/^BindToDevice=/# BindToDevice=/g' /lib/systemd/system/sshd.socket
sync
systemctl daemon-reload;
systemctl restart sshd.socket

# =================================================================
# Edison 初期設定
# タイムゾーン設定、okpgリポジトリ設定
# =================================================================

# ---------------------------------------------------------------
# Edison LinuxのTimezoneを設定（lsとかで影響するシステムタイムロケー
# ル）以下2行は非推奨
# # rm /etc/localtime;
# # ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# Edisonで採用されているSystemdはtimedatectlでタイムゾーンを設定する
# ちなみにntpdate相当もSystemdで行う
# 別記事： http://qiita.com/CLCL/items/e991e23f4bdbca5ff28b

TIMEZONE="Asia/Tokyo"

timedatectl set-timezone $TIMEZONE

# ---------------------------------------------------------------
# /var/log/journal があふれる対策 日経Linux 2015.1

JURNALD_ADD='SystemMaxUse=4M';
JURNALD_CONF=/etc/systemd/journald.conf
\grep -e "^$JURNALD_ADD" $JURNALD_CONF
if [ $? == 1 ] ; then
  cat << EOS >> $JURNALD_CONF
$JURNALD_ADD
EOS

  systemctl stop systemd-journald
  \rm -rf /var/log/journal/*
  systemctl start systemd-journald
fi

# ---------------------------------------------------------------
# Edison用リポジトリ登録
# http://qiita.com/yoneken/items/1b24f0dd8ae00579a0c2

OPKG_BASEFEEDS=/etc/opkg/base-feeds.conf
if [ ! -s $OPKG_BASEFEEDS ] ; then
  cat << EOS > $OPKG_BASEFEEDS
src/gz all http://repo.opkg.net/edison/repo/all
src/gz edison http://repo.opkg.net/edison/repo/edison
src/gz core2-32 http://repo.opkg.net/edison/repo/core2-32
EOS

fi

OPKG_INTELIOTDK=/etc/opkg/intel-iotdk.conf
if [ ! -s $OPKG_INTELIOTDK ] ; then
  cat << EOS > $OPKG_INTELIOTDK
src intel-iotdk http://iotdk.intel.com/repos/1.1/intelgalactic
src intel-all http://iotdk.intel.com/repos/1.1/iotdk/all
src intel-i586 http://iotdk.intel.com/repos/1.1/iotdk/i586
src intel-x86 http://iotdk.intel.com/repos/1.1/iotdk/x86
EOS

fi

# ---------------------------------------------------------------
# パッケージリストを更新・フルアップグレード
opkg update
opkg upgrade


# =================================================================
# 自分の好きなパッケージを入れよう。
# http://dev.classmethod.jp/hardware/10-edison-package-manager-opkg/
# =================================================================

# ---------------------------------------------------------------
# Git （アカウントとかは自分のに替えよう）
opkg install git
git config --global user.email "hogehoge@example.com"
git config --global user.name "WTASHI-NO-NAMAE"
git config --global color.ui auto

# ---------------------------------------------------------------
# bash
opkg install bash
chsh -s /bin/bash

# ---------------------------------------------------------------
# rsync
opkg install rsync

# ---------------------------------------------------------------
# vim
opkg install vim

# この後githubから成果物をcloneして配置したり、
# npmとかでモジュールを配置したり、
# アプリケーションをkickしたり
# 再起動時の自動起動設定を入れたりするとよい
```

# 説明など

オリジナルのセットアップスクリプト``/usr/bin/configure-edison``は、海外ではすでにインフラエンジニアの共通プログラミング言語として使われているPythonで作られています。Edison自体Pythonでの組み込みアプリケーション開発をサポートしているので、システムデフォルトのプログラミング言語としてのPythonの地位はいよいよ盤石なのかもしれません。

とはいえ、``/usr/bin/configure-edison``の中をのぞくと実のところ平易なスクリプトでシェルを使いコマンドを実行しているので、シェルスクリプトにしちゃえば同じ動作が実現できます。将来Intel Edisonがバージョンアップしたら、おそらく``/usr/bin/configure-edison``も最新版に書き換わっていると思いますので、中をのぞいて変更点を確認し、今回のプロビジョニング用シェルスクリプトも調整する必要があるでしょう……

注意点は、Intel Edison用LinuxのYoctoでSystemdが採用されていますので、sshdなどのおなじみのサービスを再起動するときには``systemctl``を使うこと、時刻合わせもSystemdに組み込まれていること、タイムゾーンの設定までSystemdに組み込まれているので``timedatectl``を使うこと、とにかくSystemdに慣れることだと思います。**いったいなんなんだSystemd！**``localectl``や``hostnamectl``や``loginctl``まである。

# 注意

わりとエラー処理を省略しているので、エラーが出たらその都度直そう。