OpenBlocks IoTのEdison内のYoctoをupdateする

[OpenBlocks IoT](http://openblocks.plathome.co.jp/products/obs_iot/)はIntel Edisonを実装しており、i386なLinuxサーバとして使うことが出来ます

OpenBlocks IoTはEdison内に標準で入っているYocto Linuxと、ぷらっとホーム社が実装したDebian GNU/Linuxの２つのOSが入っています

しかもDebian側にも2つの起動モードが存在するため、3つの使いかたができます。整頓すると以下のようになります

```
boot --+-------------- Yocto
       |
       +- Debian --+-- RAMディスクモード
                   |
                   +-- ストレージモード
```

2つのOSが入っているというのは地味に使い勝手がよく、片方のOS(特にDebian側)をダメにしてしまっても、Yocto側からの回復作業が可能になります

注: **アップデートすると Yocto が rootfs(`/dev/mmcblk0p8`) を+40MBくらい消費してしまい、Debian側で使用するinitramfs(`ramdisk-wheezy.obsbx1.img.gz`)を rootfs に保存できなくなり、Debianが起動できなくなくなる可能性があります。結果的にOpenBlocks IoTをダメにしてしまう可能性がありますが、まったく無保証です**


各モードへの移行方法
--------------------

Yoctoのアップデートの前に、各モードへの移行方法を確認しておきます

```
boot -(A)------------- Yocto
       |
       +- Debian -(B)- RAMディスクモード
                   |
                   +-- ストレージモード
```

- (A)の分岐はOpenBlocks IoTの電源ON直後に行います。デフォルトはDebianです
- (B)の分岐は `/dev/mmcblk0p10` のディスクラベルの有無で行われます

### (A)の分岐: OpenBlocks IoTでYoctoの起動 ###

シリアルコンソール接続した状態でOpenBlocks IoTの電源をONにします
(もしくは、すでに起動中のOSでrebootをかけます)

電源ONから2~3秒すると下記のように表示されるため Enterキー等を入力してください

```
Hit any key to stop autoboot:  0 
```

すると、U-Bootのプロンプトに移行します

```
Hit any key to stop autoboot:  0 
boot > 
```

この状態で `run bootYocto` を実行すると Yocto が起動します

```
boot > run bootYocto
```

Yoctoには ID: root Password: なし でログインできます
停止/再起動 は  `halt` / `reboot` でそれぞれできます

### (B)の分岐: RAMディスクモードでの起動 ###

そのうち書きます

要するに `/dev/mmcblk0p8` 内の `/ramdisk-wheezy.obsbx1.img.gz` をinitramfsとして起動して、それで終わりなのがRAMディスクモード

ディスクラベル `DEBIAN` と割り当てられているパーティションをaufsでマウントするのがストレージモード


作業概要;
---------

1. `/dev/disk/by-partlabel/update` (= `/dev/mmcblk0p9`) を vfat でフォーマット
2. Edison firmware image file (edison-image-**.zip) を取得、 `/dev/mmcblk0p9` へ unzip
3. `reboot ota`

仕組みとしては `reboot ota` をすると `/dev/mmcblk0p9` に展開されているイメージファイルを使ってアップデートが実行されます

その後、更新後のYocto上から、ぷらっとホーム社が用意しているDebianが起動できるようにリカバリー作業をすれば終わりです

2015/11/08時点での最新 "edison-image-ww25.5-15" はインストールが出来ませんでしたので、その一つ前の "edison-image-ww18-15" を使用します


Yoctoのネットワーク設定
-----------------------

### Wi-Fi ###

`configure_edison --wifi` でインタラクティブにWi-Fi設定が出来ます

※ぶっちゃけ、古い EdisonのFirmwareでは、Wi-Fi接続の性能が良くありません。Debian側でfirmwareを取得するほうが簡単かもしれません

### 有線LAN ###

USB Etherアダプタが使えるはずなのですが、ブランドを選ぶようです
認識されれば `ip link` コマンドに `enp0s17u1u4` のようなデバイスが見えるはずですので `udhcpc -i enp0s17u1u4` 等でIP設定してください

[Intel EdisonをUSB Ethernet経由で有線LAN接続 - Qiita](http://qiita.com/nmatsui/items/3db9fab678b89c62723d)	


Yocto上でのイメージファイル取得
-------------------------------

wgetが使えます

```
root@edison:~# cd /home
root@edison:~# wget http://downloadmirror.intel.com/25028/eng/edison-image-ww18-15.zip
```

Debian上でのイメージファイル取得
--------------------------------

Yocto上の `/home` は実際は `/dev/mmcblk0p10` ですので、ここに保存すればOKです

RAMディスクモードなら下記のとおりです

```
# mount /dev/mmcblk0p10 /mnt
# cd /mnt
# http://downloadmirror.intel.com/25028/eng/edison-image-ww18-15.zip
```

Firmwareのunzipと`reboot ota`
-----------------------------

Yocto上で行います

```
root@edison:~# mkfs.vfat -F32 -I /dev/disk/by-partlabel/update
root@edison:~# mkdir -p /update
root@edison:~# mount -t vfat /dev/disk/by-partlabel/update /update
root@edison:~# unzip -x /home/edison-image-ww18-15.zip -d /update
root@edison:~# reboot ota
```

`reboot ota` で再起動がかかり、次回起動時に更新処理が実行され、また再起動がかかります

更新されると Yocto上での `/etc/version` が下記のように変わります

更新前;

```
root@edison:~# cat /etc/version 
edison-weekly_build_56_2014-08-20_15-54-05
```

更新後;

```
root@edison:~# cat /etc/version 
weekly-146
```

`/dev/disk/by-partlabel/update` = `/dev/mmcblk0p9` です
ちなみに、Edisonをストレージとしてマウントすると見えるのがこの `/dev/mmcblk0p9` になります


Debianのリカバリー作業
----------------------

更新時に `/dev/mmcblk0p8` が初期されてしまいDebianが起動できなくなるため、起動処理に失敗→ループに陥りますので、次の方法で回復します

Yocto上で行います
作業としては bzImage と ramdisk-wheezy.obsbx1.img.gz を `/dev/mmcblk0p8` に保存するだけです

Wi-Fi設定は `configure_edison --wifi` で行えます(これも初期化されてます)。また、firmwareが更新されたことでWi-Fi接続性のも向上しています

```
# mount /dev/disk/by-partlabel/rootfs /mnt
# cd /mnt
# wget ftp://ftp.plathome.co.jp/pub/BX1/wheezy/3.10.17-9/bzImage
# wget ftp://ftp.plathome.co.jp/pub/BX1/wheezy/3.10.17-9/ramdisk-wheezy.obsbx1.img.gz
# reboot
```

`/dev/disk/by-partlabel/rootfs` = `/dev/mmcblk0p8` です

あとがき
-------

もう、Yoctoでもいいんじゃないか？opkgとかあるしさ。


参考ページ
==========

* [OpenBlocks IoT BX1 セルフ開発環境構築 - 技術ガイド - OBDN - 開発者向け情報 | OpenBlocks](http://openblocks.plathome.co.jp/support/guide/bx1/self_env.html)
* [Flashing Intel Edison using only serial connection and wifi](https://gist.github.com/skvark/794217634c5024da9052)
* [Intel® Edisonを使ってみる−セットアップ編②（Firmwareアップデート）− | Workpiles](http://workpiles.com/2015/07/intel-edison-setup2/)
* [Edisonを文鎮から復帰する (Oct 2015版) - Qiita](http://qiita.com/key/items/900bfc6dc6b660c50e2f)
* [Intel Edison買いました - BSD小僧の日記](http://www.tokuda.net/diary/0849)