2014-11-25

OpenBlocks IoT BX1 ハンズオン開催中

OpenBlocks IoT BX1のハンズオンDayを正式にスタートしました。

今週より、BX1本体およびDockBoard(ES版)との組み合わせにてご利用いただけます。

 
天王洲アイル、Samurai Startup Islandにて毎週水曜日(10:00-18:00)に開催。
予約制となりますので、以下の開催概要にそってご予約下さい。
当日でも空いていれば予約可能です。

現在ほぼマンツーマンのハンズオンとなっており、使用できるセットも限られているため、多人数となる場合は、早めにご連絡いただき、機材などの調整をさせてください。


------

「ハンズオンDay」開催概要

  • 実施内容
    当社IoT向けマイクロサーバー「OpenBlocks® IoT BX1」を使用したハンズオンです。
    実際にOpenBlocks® IoT BX1の実機や開発環境に触れながら基本操作の確認や、アプリケーション開発、システム構築に必要となる事項の事前サーベイなどが可能です。

    参考:OpenBlocks® IoT BX1特設サイトURL
    http://openblocks.plathome.co.jp/products/special/bx1_sp/
  • 対象となる方
    IoTのアプリケーション開発や、センサーデバイス接続開発、IoTサービス開発などを検討している方に最適です。
  • 開催スケジュール
    原則、毎週水曜日に実施致します。詳細なスケジュールは下記URLよりご確認下さい。
    http://goo.gl/vUxmwv
  • 参加方法
    機材の都合上事前予約が必要となります。開催スケジュールをご確認のうえ、当社WEBサイトの参加申込フォームよりお申込み下さい。

    参加申込フォームURL
    https://openblocks.plathome.co.jp/form/bx1_handson/input.html
  • 参加費用
    無料です。
  • 開催場所
    Samurai Startup Island
    住所:東京都品川区 東品川2-2-28 Tビル2F
    アクセス:天王洲アイル駅より徒歩5分
    http://samurai-startupisland.asia/access

2014-10-08

OpenBlocks IoT BX1 開発者向け情報など

OpenBlocks IoTファミリ BX1を発表しました。

M2M・IoTシステムの構築に最適な極小サイズのマイクロサーバー「OpenBlocks® IoTファミリ BX1」を発表

OpenBlocksシリーズは、従来より複数のLANポートを持ち小型堅牢かつ汎用のLinux環境を提供するマイクロサーバとして、ネットワークの監視管理、ゲートウェイなど、様々なシーンで利用していただいていましたが、今回のBX1シリーズにおいては、Wifi/3G/BlueTooth(BLE対応)を標準サポートした、無線通信に重点を置いた製品となっています。

発表ではスケルトンカバーに入った製品としてお見せしていますが、まずは内部写真をここに公開します。


カバーは試作品のため、スケルトン仕様となっていますが、製品ではホワイトとなる予定です。


外部コネクタ。上部がオプション有線接続用端子となり、ケーブルを交換することにより、USB(有線LAN含む)、シリアル(RS-232C/RS-485)、GPIO(最大19ポート)に対応します。
下部がSIMスロットです。


標準でUSBケーブルが添付します。本ケーブルはUSB側からの給電と、シリアル通信をサポートしており、PCに接続する場合は、 USBシリアル経由のコンソールとして見えます。


本体基板の裏側です。


本体基板の上部写真です。

本体の仕様は以下の通り。

CPU モデル インテル® Atom™ プロセッサー 500MHz (デュアルコア)
動作速度 500MHz (デュアルコア)
メインメモリ オンボード 1GB (LPDDR3)
FLASH ROM 4GB (eMMC)
内部インターフェイス 3G(W-CDMA)※1
Bluetooth 4.0
Wi-Fi (IEEE802.11a/b/g/n)
外部インターフェイス USB 2.0(Type-A)ケーブル
GPIO (最大19ポート) オプションケーブルにて対応
シリアル 1ポート RS-232C/RS-485
寸法 (mm) 41.6mm(W)x 96mm(D)x 11.3mm(H)(突起部含まず)
電源 DC 5〜48V
出荷時OS Debian GNU/Linux

※1 NTTドコモ FOMA網に対応予定。他通信事業者向けも検討中。

開発環境は、Debian GNU/Linuxを標準でサポートし、従来のOpenBlocksシリーズと同様に、実機ベースでの手早い開発環境をBXでも提供していきたいと考えています。

提供時期ですが、開発者向けに、本体と各種IOを外だし出来るボードをセットにしたDPパッケージを先に提供し(時期は未定)、製品としては2月を予定しています。

展示会の情報などは、以下のページでご案内しています。

特設サイトURL:
http://openblocks.plathome.co.jp/products/special/bx1_sp/

Facebook:

https://www.facebook.com/OpenBlocksIoT



現在、DPパッケージのリリースに前後して、いち早く製品をご覧いただけるよう、ハンズオンdayやハッカソン、アイディアソンなどを企画しておりますので、日程が決まり次第またお知らせします。


2014-08-08

[.tested] OpenECHO [debian Wheezy][AX3][A7][A6]

OpenECHOは、ECHONET LiteをJavaで実装したライブラリであり、以下のサイトで公開されています。


今回は、OpenBlocks A7の内部GPIOポートを用い、ECHONET Lite対応機器として、簡単な実装を行ってみました。

OBDN技術ブログによる動作検証は、該当するデバイスやソフトウェアの動作について、保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks A7 Debian 7.5 kernel:3.2.54

1. ハードウェアの準備


今回は、A7の基板上に実装された内部GPIOポートを利用しました。

(A6の場合は、背面よりGPIOポートが接続可能です。AX3の場合は、GPIOのポートがないため、USB-GPIOアダプタなどを利用する必要があります。 )


実際に何か照明機器を接続するといいのですが、今回は、LEDを抵抗(470Ω)と直列に接続しています。

A7の内部GPIOピンは、以下の配置になっています。

1: MPP17(GPIO_17)
2: MPP7 (GPIO_7) ※PD禁止
3: MPP29 (GPIO_29)
4: MPP28 (GPIO_28)
5: MPP35 (GPIO_35)
6: MPP34 (GPIO_34)
7: MPP40 (GPIO_40)
8: 未使用
9: 外部リセット入力
10: GND

ピンの配置
| 9| 7| 5| 3| 1|
|10| 8| 6| 4| 2|

今回は、P7(GPIO 40)へLEDを接続しました。

2. ソフトウェア (一般照明機器としての設定)


A7を一般照明機器としてセットアップする方法です。

今回は、新たにGPIO回りのライブラリを作成せず、簡単なセットアップで試しました。

・GPIOデバイスの作成

GPIOデバイスは、以下の手順により操作可能となります。
今回、プログラム上では、この設定を行っていませんので、下記の手順を実行した後、評価プログラムを起動させてください。

# cd /sys/class/gpio
# echo 40 > export
# cd gpio40
# echo out > direction

ポートのON/OFF(LED点灯)テストは以下の操作により行います。

# echo 1 > value
# echo 0 > value

・OpenECHOによるサンプルプログラム

今回は、以下のサイトのプログラムの一部を修正して使用しました。

 Howto : ArmadilloでECHONET Lite (まとめ)

ellight.jarのソースパッケージである、ellight.zipを展開して、Netbeans IDE 8.0により修正、ビルドしてください。
今回、A7に搭載されたJREが、

Java(TM) SE Embedded Runtime Environment (build 1.7.0_40-b43, headless)

となりますので、JDKも7を導入して指定しています。


MyLighting.javaを書き換えます。

package ellight;

import com.sonycsl.echo.eoj.device.housingfacilities.GeneralLighting;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MyLighting extends GeneralLighting {
    byte[] mStatus = {0x31};
    byte[] mMode = {0x41};
    byte[] mLocation = {0x00};
    byte[] mVersion = {0x01, 0x01, 0x61, 0x00};
    byte[] mFaultStatus = {0x42};
    byte[] mManufacturerCode = {0x00, 0x00, 0x00}; /* 未定義 */

    @Override
    protected boolean setOperationStatus(byte[] edt) {
        Runtime rt = Runtime.getRuntime();
        Process pr = null;
        try {
            /* LEDをON/OFF */
            if (edt[0] == 0x30)
                pr = rt.exec(new String[]
                             { "/bin/sh", "-c",
                               "echo 1 > /sys/class/gpio/gpio40/value" });
            else if (edt[0] == 0x31)
                pr = rt.exec(new String[]
                             { "/bin/sh", "-c",
                               "echo 0 > /sys/class/gpio/gpio40/value" });
            if (pr != null)
                pr.waitFor();
            /* 状態をECHNET Lite送信 */
            inform().reqInformOperationStatus().send();
        } catch (InterruptedException | IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,
                                                             null, ex);
        }
        return true;
    }

    @Override
    protected byte[] getOperationStatus() {
        try {
            Runtime rt = Runtime.getRuntime();
            /* LEDの点灯状態を取得 */
            Process pr = rt.exec("cat /sys/class/gpio/gpio40/value");
            InputStream is = pr.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String line = br.readLine();
            if (line != null && line.equals("0"))
                mStatus[0] = 0x31;
            else
                mStatus[0] = 0x30;
        } catch (IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE, null, ex);
        }
        return mStatus;
    }

    @Override
    protected boolean setLightingModeSetting(byte[] edt) {
        mMode[0] = edt[0];

        try {
            inform().reqInformLightingModeSetting().send();
        } catch (IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,
                                                             null, ex);
        }
        return true;
    }

    @Override
    protected byte[] getLightingModeSetting() {
        return mMode;
    }

    @Override
    protected boolean setInstallationLocation(byte[] edt) {
        mLocation[0] = edt[0];

        try {
            inform().reqInformInstallationLocation().send();
        } catch (IOException ex) {
            Logger.getLogger(MyLighting.class.getName()).log(Level.SEVERE,
                                                             null, ex);
        }
        return true;
    }

    @Override
    protected byte[] getInstallationLocation() {
        return mLocation;
    }

    @Override
    protected byte[] getStandardVersionInformation() {
        return mVersion;
    }

    @Override
    protected byte[] getFaultStatus() {
        return mFaultStatus;
    }

    @Override
    protected byte[] getManufacturerCode() {
        return mManufacturerCode;
    }
}

ビルドしたパッケージを以下の構成でA7に転送します。

# ls -lsR
.:
total 16
4 -rw-r--r-- 1 root root 1323 Jul 17 13:29 README.TXT
8 -rw-r--r-- 1 root root 5395 Jul 16 17:54 ellight.jar
4 drwxr-xr-x 2 root root 4096 Jul 17 13:29 lib

./lib:
total 1040
1040 -rw-r--r-- 1 root root 1061315 Jul 17 16:02 OpenECHO.jar

起動方法は以下の通りです。

# java -jar ellight.jar

3. ソフトウェア (コントローラ)


コントローラとしては、Kadecot [公開実験版]を利用させてもらいました。
Androidマシンを用意し、PlayStoreよりアプリをダウンロードして使用します。


 Kadecot: 機器のリスト画面



画面の照明機器をクリックすることにより、本体のLEDの点灯制御を行っています。

3. さいごに


今回はOpenECHOを評価するのが目的でしたので、GPIO回りの実装は、最低限動作確認出来る程度のものとなっています。

2014-06-16

[.tested] Wireshark [debian Wheezy][AX3][A7][A6]

GUI版のネットワークアナライザ、WiresharkをOpenBlocks Aシリーズで利用するためのTipsです。

 Wireshark · Go Deep.:

<検証環境>
Debian 7.1 Wheezy
OpenBlocks AX3/4 kernel: 3.2.54
OpenBlocks A7 kernel 3.2.54

<使用機器>
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル)

1. 導入前の準備


OpenBlocks Aシリーズは本体にグラフィック表示機能を持ちません。
X環境を導入するためには、USB VGAディスプレイアダプタを利用するか、X端末ソフトウェアなどを利用する必要があります。

USB VGAディスプレイアダプタについては、以下の記事を参考にしてください。

【.tested】RATOC REX-USBDVI2 ディスプレイアダプタ [Debian Wheezy][AX3][A6]

X端末ソフトウェアの導入方法に関しては、SourceForgeの以下の記事などを参考にしてください。


2. Wiresharkの導入


debianのパッケージを導入します。
 
#aptitude install wireshark

3. 動作確認


メニューより起動するか、xtermなどからwiresharkを直接起動します。

wiresharkは、セキュリティ上のポリシーから、rootで直接起動することを推奨していません。
rootで起動した場合は、以下の警告メッセージが出力されます。



そのため、一般ユーザでログインして、wiresharkを立ち上げることになりますが、 dumpcapというパケットキャプチャプログラムに許可を与える必要があります。
wireshark wikiのページにもありますが、以下の方法で設定します。

# setcap 'CAP_NET_RAW+eip CAP_NET_ADMIN+eip' /usr/bin/dumpcap

ただし、このFile Capabilitiesの仕組みは、aufsでは対応しておらず、aufsによるOpenBlocksのディスク共有モードで利用する場合は、setcapによる許可が与えられません。
( 一つの解決策としては、dumpcapに+sしてしまうという方法もありますが、前提から考えても、お勧めできません)

ユーザモードによる動作を行いたい場合は、aufsではなく、ext4などのファイルシステムでシステムを構成する必要があります。
rootfsの変更方法に関しては、以下の記事にて解説しています。

OpenBlocks Aシリーズ rootfs変更方法 (FlashROMブート) [debian Wheezy][AX3][A7][A6]
 
今回は、ext4にて作成したrootfsに変更することにより、dumpcapのFile Capabilityを変更しました。

表示画面は以下のようになります。



なお、上記の画面は、Xmingを利用し、OpenBlocksにはwiresharkだけをインストールして使用しています。

4. さいごに


今回は、wiresharkの利用方法についてご紹介しました。
GUIを使用しない場合、tsharkもdebianのパッケージとして提供されていますので、お試しください。

2014-06-09

[.tested] Planex GW-450D 無線LANアダプタ [AX3][A7][A6]

Planex GW-450Dは、802.11ac/n/a/g/bに対応したUSB無線LANアダプタです。
GW-450Dは、写真の小型のタイプと、稼働式アンテナのついたGW-450D KATANAがありますが、アンテナ以外は同一の設計の製品と思われます。
Openblocks AX3およびA7での動作検証を行いました。


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks AX3/4 Debian 7.5 kernel: 3.2.54
OpenBlocks A7 Debian 7.5 kernel:3.2.54

1. 対応ドライバと事前準備


GW-450Dは、MediaTek MT7610Uを採用しており、現在AX3およびA7/A6に搭載されたカーネル3.2.54ではサポートされていません。
Planex社の以下のページにおいて、開発者向け情報が公開されています。

開発者向け情報|無線LAN USBアダプタ|プラネックス:

ドライバのソースコードは、上記のページよりダウンロードできますが、今回はチップセットメーカであるMediaTek社のホームページよりダウンロードし、OpenBlocks向けにビルドしました。

・カーネル構築環境の導入

本ドライバは、ビルドする際に、カーネルの構築環境を参照するため、build-essentialsによる開発環境の構築のみでは、ドライバのビルドが出来ません。
以下の手順を参考に、カーネルのソースを導入し、make modules_installまでを行っておく必要があります。

カーネルのカスタマイズ手順について(非公式版) [AX3][A6]

・ソースコードの入手と展開

以下のページの、7610U USBよりファイルをダウンロードして下さい。

Downloads - MediaTek:

ダウンロードしたファイルは以下の手順で解凍してください。

# tar jxfv mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
# cd mt7610u_wifi_sta_v3002_dpo_20130916

common/rtusb_dev_id.cを編集します。
同じバージョンのドライバパッケージを使用する場合は、以下のdiff出力をpatch適用して下さい。
アップデートにより内容が変更されている場合は、参考にして書き換えてください。

diff -u rtusb_dev_id.c.orig rtusb_dev_id.c
--- rtusb_dev_id.c.orig 2014-06-09 15:18:30.209980000 +0900
+++ rtusb_dev_id.c      2014-06-09 15:19:43.299980000 +0900
@@ -36,6 +36,7 @@
 /* module table */
 USB_DEVICE_ID rtusb_dev_id[] = {
 #ifdef MT76x0
+       {USB_DEVICE(0x2019,0xab31)}, /* MT7610U */
        {USB_DEVICE(0x148F,0x7610)}, /* MT7610U */
        {USB_DEVICE(0x0E8D,0x7610)}, /* MT7610U */
        {USB_DEVICE_AND_INTERFACE_INFO(0x0E8D, 0x7630, 0xff, 0x2, 0xff)}, /* MT7630U */

os/linux/config.mkを編集し、wpa_supplicantのサポートをyにします。

# diff -u config.mk.orig config.mk
--- config.mk.orig      2014-06-09 15:22:00.759980000 +0900
+++ config.mk   2014-06-09 15:22:17.039980000 +0900
@@ -23,12 +23,12 @@

 # Support Wpa_Supplicant
 # i.e. wpa_supplicant -Dralink
-HAS_WPA_SUPPLICANT=n
+HAS_WPA_SUPPLICANT=y


 # Support Native WpaSupplicant for Network Maganger
 # i.e. wpa_supplicant -Dwext
-HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
+HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=y

 #Support Net interface block while Tx-Sw queue full
 HAS_BLOCK_NET_IF=n

変更後、make および installを行います。

# make install

README_STA_usbを参考に、コンフィギュレーションファイルをコピーします。

# mkdir /etc/Wireless/RT2870STA
# cp RT2870STA.dat  /etc/Wireless/RT2870STA/RT2870STA.dat

A7の場合は、デバイスをUSBポートに差し込めば認識するのですが、AX3の場合は、ubootが設定したvmallocのサイズの関係で、ドライバがvmallocに失敗したというメッセージを出し、起動しません。
起動時に一旦ubootに入り、

# openblocks> setenv miscargs vmalloc=200M

として、拡張する必要がありました。

デバイスは、/dev/ra0となります。

ra0       Link encap:Ethernet  HWaddr 00:22:cf:e2:4d:39
          inet addr:192.168.10.95  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::222:cfff:fee2:4d39/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:247723 errors:9 dropped:0 overruns:0 frame:0
          TX packets:1591 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:62913475 (59.9 MiB)  TX bytes:128084 (125.0 KiB)

起動時に立ち上がらない場合は、
/etc/modulesに
mt7650u_sta
を追加してください。

2. wpasupplicantパッケージの導入および設定


以下の記事を参照して下さい。

[.tested] Logitec LAN-W150N/U2WH(BK) 無線LANアダプタ [AX3]

以下の通り、クライアントモードでの動作を確認しました。

# iwconfig ra0
ra0       Ralink STA  ESSID:"******"  Nickname:"MT7610U_STA"
          Mode:Managed  Frequency=2.412 GHz  Access Point: 00:1D:73:C2:F4:00
          Bit Rate=108 Mb/s
          RTS thr:off   Fragment thr:off
          Encryption key:9394-8D4B-D889-F2A3-0EF7-E943-73A8-719C [3]   Security mode:open
          Link Quality=64/100  Signal level:-73 dBm  Noise level:-73 dBm
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

3. さいごに


今回は、クライアント接続のみのテストとしています。
AP化に関しては、hostapdが本アダプタをサポートしておらず、また、realtek社の様に専用のhostapdの配布もされていないため、今回は特に追いかけていません。
新たな情報が入り次第、追記させていただきます。

[.tested] Planex GW-450S 無線LANアダプタ [AX3][A7][A6]

Planex GW450Sは、802.11ac/n/aに対応した5GHz帯専用のUSB無線LANアダプタです。
Openblocks AX3およびA7での動作検証を行いました。


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks AX3/4 Debian 7.5 kernel: 3.2.54
OpenBlocks A7 Debian 7.5 kernel:3.2.54

1. 対応ドライバと事前準備


GW-450Sは、Reaktek 8811AUを採用しており、現在AX3およびA7/A6に搭載されたカーネル3.2.54ではサポートされていません。
Planex社の以下のページにおいて、開発者向け情報が公開されています。

開発者向け情報|無線LAN USBアダプタ|プラネックス:

ドライバのソースコードをこのページのリンクからダウンロードし、OpenBlocks向けにビルドする必要があります。
(2014/06/06現在、Reaktek社の製品情報ページからは8811Uの情報が検索出来ません)

Realtek社のチップセットに関しては、以下の記事で行った手順にて検証作業を行います。

[.tested] Planex GW-USValue-EZ/GW-USWExtreme/GW-USNano2 無線LANアダプタ [AX3][A6]

・カーネル構築環境の導入

本ドライバは、ビルドする際に、カーネルの構築環境を参照するため、build-essentialsによる開発環境の構築のみでは、ドライバのビルドが出来ません。
以下の手順を参考に、カーネルのソースを導入し、make modules_installまでを行っておく必要があります。

カーネルのカスタマイズ手順について(非公式版) [AX3][A6]

・ソースコードの入手と展開

展開には、unzipが必要となります。

# aptitude install unzip

上記、Planex社の開発者向け情報より、Linux版のソースコードを入手します
ダウンロードしたファイルは以下の手順で解凍してください。

# unzip gw-450s_driver_linux_v424.zip
# cd gw-450s_driver_linux_v424
# unzip RTL8811AU_linux_v4.2.4_9533.20131209.zip

このパッケージは、ターゲットが対応する機器ならば、作成されたディレクトリへ移動し、
install.shによりインストールが行えるのですが、Openblocksは対応機器にありませんので、
以下の手順によりドライバパッケージのコンパイルおよびインストールを行います。

# cd RTL8811AU_linux_v4.2.4_9533.20131209
# cd driver
# tar xvzf rtl8811AU_linux_v4.2.4_9533.20131209.tar.gz
# cd rtl8811AU_linux_v4.2.4_9533.20131209

Makefileを編集します。
同じバージョンのドライバパッケージを使用する場合は、以下のdiff出力をpatch適用して下さい。
アップデートにより内容が変更されている場合は、参考にして書き換えてください。

# diff -u Makefile.orig Makefile
--- Makefile.orig       2014-06-06 10:02:14.427254000 +0900
+++ Makefile    2014-06-06 10:05:18.947254000 +0900
@@ -52,7 +52,8 @@
 CONFIG_LOAD_PHY_PARA_FROM_FILE = y
 CONFIG_ODM_ADAPTIVITY = n

-CONFIG_PLATFORM_I386_PC = y
+CONFIG_PLATFORM_I386_PC = n
+CONFIG_PLATFORM_OBS_ARM = y
 CONFIG_PLATFORM_ANDROID_X86 = n
 CONFIG_PLATFORM_JB_X86 = n
 CONFIG_PLATFORM_ARM_S3C2K4 = n
@@ -709,6 +710,17 @@
 CROSS_COMPILE ?=
 KVER  := $(shell uname -r)
 KSRC := /lib/modules/$(KVER)/build
+MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
+INSTALL_PREFIX :=
+endif
+
+ifeq ($(CONFIG_PLATFORM_OBS_ARM), y)
+EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN
+SUBARCH := $(shell uname -m | sed -e s/i.86/i386/)
+ARCH ?= arm
+CROSS_COMPILE ?=
+KVER  := $(shell uname -r)
+KSRC := /lib/modules/$(KVER)/build
 MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
 INSTALL_PREFIX :=
 endif

また、本デバイスのデバイスIDをドライバソースコードに追加する必要があります。
os_dep/linux/usb_intf.cを編集し、RTL8821Aの項目にデバイスIDを追加登録してください。

#ifdef CONFIG_RTL8821A
        /*=== Realtek demoboard ===*/
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0811),.driver_info = RTL8821},/* Default ID */
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x0821),.driver_info = RTL8821},/* Default ID */
        {USB_DEVICE(USB_VENDER_ID_REALTEK, 0x8822),.driver_info = RTL8821},/* Default ID */
        /*=== Customer ID ===*/
        {USB_DEVICE(0x7392, 0xA811),.driver_info = RTL8821}, /* Edimax - Edimax */
        {USB_DEVICE(0x04BB, 0x0953),.driver_info = RTL8821}, /* I-O DATA - Edimax */
        {USB_DEVICE(0x2001, 0x3314),.driver_info = RTL8821}, /* D-Link - Cameo */
        {USB_DEVICE(0x2001, 0x3318),.driver_info = RTL8821}, /* D-Link - Cameo */
        {USB_DEVICE(0x0E66, 0x0023),.driver_info = RTL8821}, /* HAWKING - Edimax */
        {USB_DEVICE(0x2019, 0xAB32),.driver_info = RTL8821}, /* Planex - Abocom */
#endif

変更後、make および installを行います。

# make install

デバイスをUSBポートに差し込めば認識します。
デバイスは、/dev/wlan0となります。

起動時に立ち上がらない場合は、
/etc/modulesに
8821au
を追加してください。

本ドライバは、そのままmake するとデバッグメッセージをconsoleに表示しますので、console作業等で気になる場合は、include/autoconf.hにおいて、DEBUGもしくはDBGと書かれたdefine行をコメントアウトすることにより抑止出来ます。

2. wpasupplicantパッケージの導入および設定


以下の記事を参照して下さい。

[.tested] Logitec LAN-W150N/U2WH(BK) 無線LANアダプタ [AX3]

本製品は5GHz帯専用の製品ですので、AP側も対応したものを使用する必要があります。

以下の通り、クライアントモードでの動作を確認しました。

# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 00:22:cf:eb:8d:2b
          inet addr:192.168.10.107  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: fe80::222:cfff:feeb:8d2b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19492 errors:0 dropped:3063 overruns:0 frame:0
          TX packets:2187 errors:0 dropped:4 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:172328795 (164.3 MiB)  TX bytes:4108434 (3.9 MiB)

# iwconfig wlan0
wlan0     IEEE 802.11an  ESSID:"******"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:5.18 GHz  Access Point: 00:1D:73:C2:F2:A0
          Bit Rate:150 Mb/s   Sensitivity:0/0
          Retry:off   RTS thr:off   Fragment thr:off
          Encryption key:****-****-****-****-****-****-****-****   Security mode:open
          Power Management:off
          Link Quality=48/100  Signal level=56/100  Noise level=0/100
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

3. さいごに


今回は、クライアント接続のみのテストとしています。
AP化や、WPSボタンの使用方法に関しては、前回の記事を参考に試してみてください。

2014-05-14

[.tested] express + socket.ioによるWebSocket実装方法について [debian Wheezy][AX3][A7][A6]

前回インストールした、node.js上でexpressおよびsocket.ioを使用した、Websocket通信のテストを行ってみました。
Aシリーズでのnode.jsのビルド方法については、前回の記事を参考にしてください。

[.tested] node.js [debian Wheezy][AX3][A7][A6]

<検証環境>
Debian 7.1 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A7 Ketnel 3.2.40

<使用機器>
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル)

1. 導入前の準備


express 4.0以降、雛形を作成するexpressコマンドは分離されているため、express-generatorをインストールします。

# sudo npm install -g express-generator

2. socket.ioのサンプルプログラムの作成


下記の記事を参考に、chatのサンプルプログラムをexpress 4.0向けに導入してみました。


雛形を作成します。

# express -e sample

以下、sampleというディレクトリに雛形が作成されます。

package.jsonを以下の内容に修正します。
  socket.ioを追加することにより、npm installによりsocket.ioも組み込まれます。

{
  "name": "application-name",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "express": "~4.0.0",
    "static-favicon": "~1.0.0",
    "morgan": "~1.0.0",
    "cookie-parser": "~1.0.1",
    "body-parser": "~1.0.0",
    "debug": "~0.7.4",
    "ejs": "~0.8.5",
    "socket.io": "~*"
  }
}

bin/wwwにchatプログラム本体を記述します。
// add以下が追加される部分です。

#!/usr/bin/env node
var debug = require('debug')('my-application');
var app = require('../app');

app.set('port', process.env.PORT || 3000);

var server = app.listen(app.get('port'), function() {
  debug('Express server listening on port ' + server.address().port);
}); 

// add start
var socketIO = require('socket.io');
// クライアントの接続を待つ(IPアドレスとポート番号を結びつけます)
var io = socketIO.listen(server);

// クライアントが接続してきたときの処理
io.sockets.on('connection', function(socket) {
  console.log("connection");
  // メッセージを受けたときの処理
  socket.on('message', function(data) {
    // つながっているクライアント全員に送信
    console.log("message");
    io.sockets.emit('message', { value: data.value });
  });
  
  // クライアントが切断したときの処理
  socket.on('disconnect', function(){
    console.log("disconnect");
  });
});

クライアントサイドとして、views/index.ejsを作成します。

<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript">
var socket = io.connect('http://接続するサーバのURLまたはIPアドレス:3000');
socket.on('connect', function(msg) {
  console.log("connet");
  document.getElementById("connectId").innerHTML = 
    "あなたの接続ID::" + socket.socket.transport.sessid;
  document.getElementById("type").innerHTML = 
    "接続方式::" + socket.socket.transport.name;
});

// メッセージを受けたとき
socket.on('message', function(msg) {
  // メッセージを画面に表示する
  document.getElementById("receiveMsg").innerHTML = msg.value;
});

// メッセージを送る
function SendMsg() {
  var msg = document.getElementById("message").value;
  // メッセージを発射する
  socket.emit('message', { value: msg });
}
// 切断する
function DisConnect() {
  var msg = socket.socket.transport.sessid + "は切断しました。";
  // メッセージを発射する
  socket.emit('message', { value: msg });
  // socketを切断する
  socket.disconnect();
}
</script>

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>

  <h1>socket.ioのサンプルプログラム</h1>
  <div id="connectId"></div>
  <div id="type"></div>
  <br>
  <input type="text" id="message" value="">
  <input type="button" value="メッセージを送る" onclick="SendMsg()">
  <input type="button" value="切断する" onclick="DisConnect()">
  <div id="receiveMsg"></div>

  </body>
</html>

必要なパッケージをインストールします。

# npm install

3. 動作確認


サーバを起動します。

# ./bin/www

Webブラウザを立ち上げ、以下のURLまたはIPアドレスを指定してアクセスしてください。

http://サーバのURLまたはIPアドレス:3000

複数のブラウザ画面を立ち上げ、相互に入力した文字が表示されることを確認してください。


4. さいごに


上記の手順により、Aシリーズ上でビルドしたnode.jsのsocket.ioモジュールによるWebSocket通信の確認を行いました。

今回は、express 4の場合、functionの定義方法などが異なるため、参考にしたサイトより、必要な部分だけを抜き出して利用させていただきました。

2014-05-09

[.tested] node.js [debian Wheezy][AX3][A7][A6]

node.jsはサーバサイドのJavaScriptインタプリタです。
今回は、node.jsのOpenBlocks Aシリーズへの導入を行いました。

<検証環境>
Debian 7.1 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A7 Ketnel 3.2.40

<使用機器>
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル)

1. 導入前の準備


node.jsは、公式サイトからソースコードをダウンロードしてビルドを行います。
そのため、開発環境のインストールを行っておく必要があります。

OpenBlocks における開発環境構築手順について [debian Wheezy][AX3][A7][A6]

検索などをすると、npmのインストールのためにcurlを入れる事例などありますが、現状では、node.jsのインストールによりnpmもインストールされますので必要ありません。

2. node.jsのビルド


node.jsの公式サイトより最新のソースパッケージを入手してください。


以下の例は、2014/05/09時点での最新のバージョンです。

# wget http://nodejs.org/dist/v0.10.28/node-v0.10.28.tar.gz

展開します。

# tar xvzf node-v0.10.28.tar.gz
# cd node-v0.10.28

一般的には、ここでconfigureしてmakeするだけなのですが、Aシリーズの場合は、以下のパラメータを指定する必要があります。

AX3の場合

# ./configure --without-snapshot --with-arm-float-abi=hard

A7/6の場合

# ./configure --without-snapshot

また、A7/6の場合、一部のソースコードを修正する必要があります。

# vi deps/v8/src/arm/macro-assembler-arm.cc

以下のイタリック表記の3行を追加してください。

// We always generate arm code, never thumb code, even if V8 is compiled to
// thumb, so we require inter-working support
#if defined(__thumb__) && !defined(USE_THUMB_INTERWORK)
#error "flag -mthumb-interwork missing"
#endif

// ADD THESE THREE LINES TO macro-assembler-arm.cc

#if !defined(CAN_USE_THUMB_INSTRUCTIONS)
# define CAN_USE_THUMB_INSTRUCTIONS 1
#endif


// We do not support thumb inter-working with an arm architecture not supporting
// the blx instruction (below v5t).  If you know what CPU you are compiling for
// you can use -march=armv7 or similar.
#if defined(USE_THUMB_INTERWORK) && !defined(CAN_USE_THUMB_INSTRUCTIONS)
# error "For thumb inter-working we require an architecture which supports blx"
#endif

上記の修正および、configureの実行を行った後、makeを実行し、インストールします。

# make
# make install


3. 動作確認その他


インストール後、nodeコマンドを実行し動作を確認してください。

# node -v
v0.10.28

前述しましたが、npmは同時にインストールされます。


プロジェクト毎に必要なモジュールはインストールされますので、特にグローバルにインストールする必要はないようです。

*) 2014/05/12 expressに関しての記述は削除しました。

2014-04-25

[.tested] Tomcat7の導入について [debian Wheezy][AX3][A7][A6]

Apache Tomcatの導入方法について、若干のTipsも交えてご紹介します。



<検証環境>
Debian 7.1 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A7 Ketnel 3.2.40
OpenBlocks A6 kernel: 3.2.40

<使用機器>
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A6 DPパッケージ (DPパッケージのみjavaライセンス付きでの出荷をしています)

1.Tomcat 7 のインストール


Apache Tomcat 7は、Debian Wheezyのパッケージとしても用意されていますが、合わせてOpenJDK6を導入してしまいます。
OpenBlocksシリーズは、Oracle Javaを標準搭載していますので(A6はDPモデルのみ)、Tomcatのパッケージのみを公式のサイトよりダウンロードしてインストールすることをおすすめします。

Apache Tomcat

# wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/tomcat/tomcat-7/v7.0.53/bin/apache-tomcat-7.0.53.tar.gz

/usr/localの下に展開します。

# tar zxpvf apache-tomcat-7.0.53.tar.gz -C /usr/local

setenv.shを作成します。

# vi /usr/local/apache-tomcat-7.0.53/bin/setenv.sh

下記の内容を記述してください。

#!/bin/bash
JRE_HOME=/usr/lib/jre
JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"

JAVA_OPTSの設定は、linuxの/dev/randumの仕様によるもので、特にOpenBlocks A7の場合において、再起動時の環境ノイズの再収集時間に起因する起動遅延を解消するものです。
randomを使用する場合は、上記の記述を削除してください。(A7の場合30分程度、AX3の場合はばらつきがあり、20秒程度で立ち上がる場合もあれば、6分かかる場合もありました)

2. 動作確認および開発環境の構築について


手動での立ち上げは以下の様に行ってください。


# /usr/local/apache-tomcat-7.0.53/bin/startup.sh

ブラウザで動作確認をする場合は、以下のURLとなります。

http://URLまたはIPアドレス:8080


2014-04-23

[.tested] RXTXによるjavaのシリアル通信について [debian Wheezy][AX3][A7][A6]

RXTXライブラリを使用したjavaのシリアル通信を行う際のパッケージ導入方法について説明します。

<検証環境>
Debian 7.1 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A7 Ketnel 3.2.40
OpenBlocks A6 kernel: 3.2.40

<使用機器>
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A6 DPパッケージ (DPパッケージのみjavaライセンス付きでの出荷をしています)

1. RXTXライブラリおよびlibrxtxSerialのインストール


それぞれ、Debainのパッケージによりインストールします。

# aptitude install librxtx-java
# aptitude install libserializer-java

RXTXライブラリを以下の場所にコピーします。

# cp /usr/share/java/RXTXcomm.jar /usr/lib/jre/lib/ext/

librxtxSerialを以下の場所にコピーします。

# cp /usr/lib/jni/librxtxSerial-2.2pre1.so /usr/lib/jre/lib/arm/librxtxSerial.so

2. 動作確認および開発環境の構築について


RXTXによるシリアル通信を行うのであれば、上記のセットアップにより、基本的には、他のプラットフォーム上で開発したclassファイルやjarファイルを実行できるかと思います。

OpenBlocks上で開発も行う場合は、一つの方法としては、Debianのパッケージより、java7-jdkなどを導入する方法があります。( 導入されるのはopenjdkです )

# aptitude install java7-jdk

java7-jdkにも、librxtxSerialが含まれますので、こちらを使用する場合は、libserializer-javaの導入の必要はありません。

作成したプログラムは、以下のようにjavacにてクラスファイルに変換してください。

# javac -cp /usr/lib/jre/lib/ext/RXTXcomm.jar test.java

2014-04-18

OpenBlocks Aシリーズ rootfs変更方法 (SSD(SATA)ブート) [debian Wheezy][AX3][A7][A6]

OpenBlocks Aシリーズのカーネルの起動をSSD(SATA)から行う方法について

本機能は、OpenBlocksの機能の一部として実装されているものですが、当社の提供する標準のパッケージ構成ではないため、動作の保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
Debian 7.1 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A7 Ketnel 3.2.40
OpenBlocks A6 kernel: 3.2.40

<使用機器>
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A6 DPパッケージ (もしくは、SSD搭載モデル)

1. SSDの準備


SSDを用意します。もし、標準構成でDEBIANのラベルを設定済みでしたら、ラベルを削除し、本体を再起動してください。

# e2label /dev/sda1 ""

再起動後、ラベルを/に変更します。
を再起動してください。

# e2label /dev/sda1 /

ファイルシステムは、現在のAシリーズはすべてext4を採用していますが、ubootがカーネルの起動を行うドライブは、ext3までしか対応していません。
再フォーマットが必要な場合は、以下の通り、ext3などを使用してください。

# mke2fs -j -L "/" /dev/sda1

2. debootstrapによるrootfsの作成と修正


rootfs は、以下の記事と同様に、debootstrapで作成しました。詳細については、以下の記事を参考にしてください。

OpenBlocks Aシリーズ rootfs変更方法 (FlashROMブート) [debian Wheezy][AX3][A7][A6]

3. SSDブート用のファームウェアの作成


SSDブート用ファームウェアは、LinuxであればPCでもAシリーズでも作成することができます。
  1. FTPサイトよりSSDブート用のラムディスクイメージを取ってきます。

    A6/A7 : ftp://ftp.plathome.co.jp/pub/ssdlinux/1.0.0-LATEST/arm-obsa6/installation/ramdisk.image-extboot.obsa6.gz

    AX3 : ftp://ftp.plathome.co.jp/pub/ssdlinux/1.1.0-LATEST/arm-obsax3/installation/ramdisk.image-extboot.obsax3.gz

  2.  FTPサイトよりカーネルを取ってきます。

    A6 : ftp://ftp.plathome.co.jp/pub/OBSA6/wheezy/3.2.40-3/zImage

    A7 : ftp://ftp.plathome.co.jp/pub/OBSA7/wheezy/3.2.40-4/zImage

    AX3 : ftp://ftp.plathome.co.jp/pub/OBSAX3/wheezy/3.2.40-4/zImage
  3. uboot-mkimageパッケージをインストールします。

    # apt-get install uboot-mkimage

    
    
  4. mkimageコマンドでSSDブート用ファームウェアを作成します。

    AX3の場合(A6/A7ではラムディスク名とファームウェア名を変更します)

    # mkimage -n "コメント(日付やバージョンなど)" -A arm -O linux -T multi -C none -a 0x8000 -e 0x8000 -d zImage:ramdisk.image-extboot.obsax3.gz uImage.initrd-extboot.obsax3

  5. rootfsの/bootにSSDブート用ファームウェアをコピーします。

    AX3でSSDがsda1の場合

    # mount /dev/sda1 /mnt
    # cp uImage.initrd-extboot.obsax3 /mnt/boot
    # umount /mnt

  6. rootfsとするパーティションのラベルを"/"にします。

    rootfsが/dev/sda1の場合

    # e2label /dev/sda1 /
3. ブート方式の切り替え


ユーザーズマニュアルを参考に、本体のDIP SW3をONにして立ち上げます。(SATA起動)
SATA起動に切り替えた場合のconsoleメッセージは以下の通りです。

U-Boot 1.1.4 (Feb  5 2014 - 12:38:30)
Plat'Home version: 1.2.13 A7 (Base: Marvell version: 3.5.9)

U-Boot code: 00600000 -> 0067FFF0  BSS: -> 006CF480

Soc: 88F6282 A1CPU running @ 600Mhz L2 running @ 300Mhz
SysClock = 300Mhz , TClock = 200Mhz

DRAM (DDR3) CAS Latency = 6 tRP = 5 tRAS = 15 tRCD=5
DRAM CS[0] base 0x00000000   size 256MB
DRAM CS[1] base 0x10000000   size 256MB
DRAM CS[2] base 0x20000000   size 256MB
DRAM CS[3] base 0x30000000   size 256MB
DRAM Total size   1GB  16bit width
Addresses 8M - 0M are saved for the U-Boot usage.
Mem malloc Initialization (8M - 7M): Done
NAND:256 MB
POST:  mac verify Eth0 PASSED Eth1 PASSED

CPU : Marvell Feroceon (Rev 1)

Streaming disabled
Write allocate disabled

Module 0 is RGMII

USB 0: host mode
USB 1: host mode
USB 2: host mode
USB 3: host mode
Net:   egiga0, egiga1
Hit any key to stop autoboot:  0

Run Boot Selection Script

*** SW 1 IS OFF ***

*** SW 2 IS OFF ***

*** SW 3 IS ON, Boot from SATA ***


Reset IDE:
Marvell Serial ATA Adapter
Integrated Sata device found
[0 0 0]: Enable DMA mode (6)
  Device 0 @ 0 0:
Model: ADATA SSD S396 30GB                    Firm: 3.3.2    Ser#: 02501132500100000227
            Type: Hard Disk
            Supports 48-bit addressing
            Capacity: 30533.8 MB = 29.8 GB (62533296 x 512)


Loading ...

2926770 bytes read
Bootargs: ramdisk_size=8192 root=LABEL=/ vmalloc=200M rootdelay=7 mtdparts=nand_mtd:0x1c0000@0x0(uboot)

ro,0x2c0000@0x1c0000(env),0x160000@0x480000(test)ro,0x540000@0x5e0000(conf),0x3d40000@0xb20000(linux),0x9660000@0x4860000

(user),0x2140000@0xdec0000(opt) console=ttyS0,115200
## Booting image at 02000000 ...
   Image Name:   OBS-A7-3.2.40-4
   Created:      2014-04-18   2:37:42 UTC
   Image Type:   ARM Linux Multi-File Image (uncompressed)
   Data Size:    2926706 Bytes =  2.8 MB
   Load Address: 00008000
   Entry Point:  00008000
   Contents:
   Image 0:  2542808 Bytes =  2.4 MB
   Image 1:   383886 Bytes = 374.9 kB
   Verifying Checksum ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
Initializing cgroup subsys cpuset
Initializing cgroup subsys cpu
Linux version 3.2.40 (root@release-firmware) (gcc version 4.7.2 (Debian 4.7.2-4) ) #1 Fri Mar 7 16:24:48 JST 2014
CPU: Feroceon 88FR131 [56251311] revision 1 (ARMv5TE), cr=00053977
CPU: VIVT data cache, VIVT instruction cache
Machine: Plat'Home OpenBlocks A7
Memory policy: ECC disabled, Data cache writeback
BUG: mapping for 0xf4000000 at 0xf4000000 overlaps vmalloc space
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 260096
Kernel command line: ramdisk_size=8192 root=LABEL=/ vmalloc=200M rootdelay=7 mtdparts=nand_mtd:0x1c0000@0x0(uboot)

ro,0x2c0000@0x1c0000(env),0x160000@0x480000(test)ro,0x540000@0x5e0000(conf),0x3d40000@0xb20000(linux),0x9660000@0x4860000

(user),0x2140000@0xdec0000(opt) console=ttyS0,115200
PID hash table entries: 4096 (order: 2, 16384 bytes)
Dentry cache hash table entries: 131072 (order: 7, 524288 bytes)
Inode-cache hash table entries: 65536 (order: 6, 262144 bytes)
Memory: 1024MB = 1024MB total
Memory: 1033400k/1033400k available, 15176k reserved, 229376K highmem

電源を入れ直すか、bootと入力して起動してください。

4. 補足


SATA起動は、ext3以前のファイルシステムをサポートしており、現状では、ext4でフォーマットされたドライブからの起動が出来ません。
rootfsをext4で使用したい場合は、起動用のパーティションとして、/dev/sda1を、rootfs用のパーティションとして/dev/sda2を別に作成して使用してください。


2014-04-17

OpenBlocks Aシリーズ rootfs変更方法 (FlashROMブート) [debian Wheezy][AX3][A7][A6]

OpenBlocks AシリーズにおいてrootfsをSSDに変更する手順を記述します。

OpenBlocks Aシリーズでは、ディスクレス運用のためのRAMディスクモードと、ストレージ併用モードを標準的にサポートしています。
(それぞれのモードについては、以下の記事を参照してください。)

OpenBlocksの動作モードについて

ストレージ併用モードにおいて、SSDなどのストレージデバイスはaufs(squeezeベースまではunion)によるマウントを行っていますが、aufsによる共有モードではなく、SSDに構築したrootfsを直接マウントして使用することも可能です。

また、カーネル自体も、フラッシュROMからだけでなく、SSDなどのストレージデバイスからの起動も行えます。

今回は、フラッシュROMから起動し、SSD側で用意したrootfsをマウントする方法について解説します。

rootfsはDebian, Fedora, Ubuntuなど好きなものをあらかじめ作成して使用しますが、今回は、debootstarapを用いてDebian wheezyパッケージを作成し、OpenBlocks独自のハードウェア制御を追加した、標準のファームウェアパッケージと同等の機能を持つものを作成しました。

本機能は、OpenBlocksの機能の一部として実装されているものですが、当社の提供する標準のパッケージ構成ではないため、動作の保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
Debian 7.1 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A7 Ketnel 3.2.40
OpenBlocks A6 kernel: 3.2.40

<使用機器>
OpenBlocks AX3 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A7 DPパッケージ (もしくは、SSD搭載モデル)
OpenBlocks A6 DPパッケージ (もしくは、SSD搭載モデル)

1. SSDの準備


SSDを用意します。もし、標準構成でDEBIANのラベルを設定済みでしたら、ラベルを削除し、本体を再起動してください。

# e2label /dev/sda1 ""

再起動後、ラベルを/に変更します。
を再起動してください。

# e2label /dev/sda1 /

ファイルシステムは、現在のAシリーズはすべてext4を採用しています。
もし、新たにフォーマットする場合は、以下のコマンドをご使用下さい。

# mkfs.ext4 -L "/" /dev/sda1

2. debootstrapによるrootfsの作成と修正


SSDを/mntにマウントして、rootfsを作成しますが、標準のファームウェアパッケージにはdebootstrapが含まれていたいため、debootstrapをインストールする必要があります。
なお、ファームウェアをRAMディスクモードで起動した後、ネットワークの設定を行う必要があります。

# aptitude update
# aptitude install debootstrap 

インストールしたパッケージを保存する場合は、以下のflashcfgコマンドにて行ってください。

# flashcfg -S 

SSDを/mntにmountします。

# mount /dev/sda1 /mnt

debootstrapにより、rootfsを作成します。

# debootstrap --exclude=ed,nano --arch armel wheezy /mnt http://ftp.jp.debian.org/debian

/mnt/etc/inittabのT0のパラメータを修正します。

T0:23:respawn:/sbin/getty -L ttyS0 115200 vt100

chrootしてrootパスワードを変更します。

# chroot /mnt
# passwd root
# exit 

ファームウェアから必要なファイルをコピーし、モジュール構成を更新します。

# cp -R /lib/modules /mnt/lib
# cp /usr/sbin/runled /mnt/usr/sbin
# cp /usr/sbin/pshd /mnt/usr/sbin
# depmod -a


fstabを編集します。
ext4の場合は、以下の通り。ext3の場合はdiscardは不要です。

# vi /mnt/etc/fstab

/dev/sda1       /               ext3    defaults        notime, discard
proc            /proc           proc    defaults        0 0
#none           /tmp            tmpfs   size=64m        0 0
#cgroup         /sys/fs/cgroup  cgroup  defaults        0 0

/etcの下のinit関連のファイルをコピーします。
 
# cp /etc/init.d/pshd /mnt/etc/init.d
# cp /etc/init.d/runled /mnt/etc/init.d

# cd /mnt/etc/rc0.d
# ln -s ../init.d/pshd K01pshd
# ln -s ../init.d/runled K01runled

# cd /mnt/etc/rc2.d
# ln -s ../init.d/pshd S99pshd
# ln -s ../init.d/runled S99runled

# cd /mnt/etc/rc6.d
# ln -s ../init.d/pshd K01pshd
# ln -s ../init.d/runled K01runled

# cp /etc/init.d/.depend.start /mnt/etc/init.d
# cp /etc/init.d/.depend.stop /mnt/etc/init.d

/etc/apt/sources.listをコピーします。

# cp /etc/apt/sources.lst /mnt/etc/apt

3. ubootのパラメータ変更と起動


OpenBlocks本体を再起動します。
起動時にコンソール上でキーボードを押すとubootのプロンプトが表示されます。

openblocks> printenv root
root=/dev/ram
openblocks> setenv root /dev/sda1
openblocks> saveenv
Saving Environment to Flash...

電源を入れ直すか、bootと入力して起動してください。

なお、rootfsをUSBストレージなどで構築した場合、 USBストレージの初期化の時間の関係で、マウントエラーが起きます。その場合は、rootdelayパラメータで調整してください。

システムを元に戻す場合は、rootに/dev/ramを設定します。

openblocks> setenv root /dev/ram
openblocks> saveenv
Saving Environment to Flash...


2014-04-08

[.tested] SnortによるIPS構築 その1 [debian Wheezy][AX3][A7]

Snortはオープンソースのネットワーク型IDSであり、IPSとしても利用することが可能です。
また、周辺ツールを利用することにより、Webでのアラート検索を行うことも可能です。
Snortは、debian wheezyのパッケージにも含まれて居ますが、今回は、IPSでの利用も考慮し、最新のバージョンのソースコードよりsnort本体をビルドする方法をご紹介します。


Snort


OBDN技術ブログによる動作検証は、該当するソフトウェアの動作の保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks AX3/4 Debian 7.1 kernel: 3.2.40 JモデルまたはDPモデル

1. Snort最新版のビルド


以下の手順は、基本的な開発環境が導入済みであることを前提としています。
(手順に関しては、右のタグにあるソフトウェア動作検証より記事をリンクしています)

debianパッケージから必要なライブラリをインストール

# aptitude install bison flex libpcre3 libpcre3-dev libssl-dev libnetfilter-queue-dev

以下、snortの最新のバージョンのビルドに必要な、一部の新しいバージョンのライブラリを用意します。

linpcap


# wget http://www.tcpdump.org/release/libpcap-1.5.3.tar.gz
# tar zxvf libpcap-1.5.3.tar.gz
# cd libpcap-1.5.3
# ./configure --prefix=/usr --enable-shared
# make
# make install

lindnet


# wget https://libdnet.googlecode.com/files/libdnet-1.12.tgz
# tar zxvf libdnet-1.12.tgz
# cd libdnet-1.12.tgz
# ./configure --prefix=/usr --enable-shared
# make
# make install

snortおよびdaqパッケージのインストール

www.snort.orgからsnortおよびdaqの最新のソースコードを入手して下さい。

daq-2.0.2

# tar -zxvf daq-2.0.2.tar.gz
# cd  daq-2.0.0
# ./configure
# make
# make install
# cd /usr/local/lib
# ldconfig -v /usr/local/lib

snort-2.9.6.0

# tar -zxvf snort-2.9.6.0.tar.gz
# cd snort-2.9.4.5
# ./configure --enable-sourcefire
# make
# make install
# cd /usr/local/lib
# ldconfig -v /usr/local/lib

2. 設定


snort.orgでアカウント作成

https://www.snort.org/account/oinkcode
で、’Generate code’ とするとOinkcodeが発行されるのでコードを控えておきます。

Snortルールの入手と展開

Snortルールを入手します。

# wget http://www.snort.org/reg-rules/snortrules-snapshot-2960.tar.gz/<Oinkcode> -O snortrules-snapshot-2960.tar.gz

/etc/snortに展開します。

# mkdir /etc/snort
# cd /etc/snort/
# tar zxvf /usr/local/src/snortrules-snapshot-2955.tar.gz
# cp ./etc/* .
# cp /usr/local/src/snort-2.9.5.6/etc/* .
# rm /etc/snort/Makefile*

空のホワイトリスト、ブラックリストを作成します。

# touch /etc/snort/rules/white_list.rules /etc/snort/rules/black_list.rules

snortユーザの追加、パーミッションの変更

# groupadd -g 40000 snort
# useradd snort -u 40000 -d /var/log/snort -s /sbin/nologin -c SNORT_IDS –g snort
# cd /etc/snort
# chown -R snort:snort *

/etc/snort/snort.confを編集し、/etc/snortなど、設定ファイルのパスの変更、対象ネットワークアドレスなどを変更します。

2. 動作テスト


以下のオプションにて動作テストを行います。
# snort -T -i eth0 -u snort -g snort -c /etc/snort/snort.conf

3.さいごに


今回は、snortをOpenBlocks Aシリーズでビルドする手順を説明しました。
次回にて、IPSとしての設定、Webからのアラートの監視方法などについてご紹介する予定です。

2014-03-24

[.tested] OpenBlocks A7 3Gモデル 動作検証SIMカード一覧 (2014/3/24update) [debian Wheezy][A7]

マイクロサーバ技術課にて行った、OpenBlocks A7 3GモデルのSIMカードの動作検証結果です。


○:OK、×:NG、-:未検証

動作OK

プロバイダ名 プラン 通信速度 回線 SMS
DoCoMo Xiデータプランにねん 128kbps docomo
dti Serverman SIM LTE 150kbps
NTTコム Arcstar Universal One モバイル M2M 100kbps
IIJmio プリペイドパック 下り150Mbps上り50Mbps
ミニマムスタート 200kbps
bmobile U300 300kbps
NTTPC Master’s ONE モバイル M2M (PDP=IP) 128kbps
Master’s ONE モバイル M2M (PDP=PPP)

動作NG

 

備考


PDPタイプは以下の通り

PDPタイプ


認証 IPアドレス配布 備考
PPP pppサーバ pppサーバ 情報をpppサーバで一元管理できる
IP RAN dhcpサーバ 情報が分散している
※ RAN Radio Access Network

--
2014/3/24 検証結果を更新しました。

2014-02-27

OpenBlocks における開発環境構築手順について [debian Wheezy][AX3][A7][A6]

Debian Wheezy環境でのソフトウェア評価記事に関してのインデックスを右のタグから飛べるソフトウェア動作検証のページにまとめました。

また、当ブログでは、OpenBlocksの開発環境はすでにあるものとして記事を書いてきましたが、DPモデルではない、SSDオプションとの組み合わせや、USBおよびeSATA(AX3モデルのみ)の外付けストレージデバイスを使用した場合の環境構築方法にいての一連の手順を、本記事にまとめて上記ページよりリンクしておきます。

1. ストレージデバイスの用意


本体内蔵のSSDオプションを用意するか、もしくは、USB,eSATA(AX3のみ)ポートにストレージデバイスを接続します。

<内蔵ハーフサイズSSD>

<内蔵2.5inchSSD>

 <外付けUSBデバイス例>

2.パーティションの設定とフォーマット


fdiskによりパーティションを作成します。

# fdisk /dev/sda
Using /dev/sda
Command (m for help): o
Command (m for help): n
Partition type
   e   extended
   p   primary partition (1-4)
p
First cylinder  (default 0cyl): (Enter key)
Last cylinder or +size or +sizeMB or +sizeKB  (default 991cyl): (Enter key)
Warning: You requested a partition from 0cyl to 991cyl.
The closest location we can manage is 0cyl to 990cyl.  Is this still acceptable to you?
   y   Yes
   n   No
y
Command (m for help): w
Information: Don't forget to update /etc/fstab, if necessary.

Writing all changes to /dev/sda.

mke2fsによりフォーマットを行い、ボリュームラベルとしてDEBIANを設定します。

# mke2fs -j -L DEBIAN /dev/sda1
mke2fs 1.42.5 (29-Jul-2012)
Filesystem label=DEBIAN
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
991232 inodes, 3964030 blocks
198201 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4060086272
121 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done.

2. 起動後の確認


以下の例では、内蔵のSSD(/dev/sda)が接続された状態で、外付けのUSBメモリにボリュームラベルとしてDEBIANを設定していますので、/dev/sdb1が使用されています。

# mount
/dev/root on / type ext2 (rw,relatime,errors=continue,user_xattr,acl)
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=51132k,mode=755)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev type tmpfs (rw,relatime,size=10240k,mode=755)
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=102260k)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620)
/dev/sdb1 on /.rw type ext3 (rw,relatime,errors=continue,user_xattr,acl,barrier=1,data=ordered)
aufs on /etc type aufs (rw,relatime,si=57e9d387)
aufs on /bin type aufs (rw,relatime,si=57e9d987)
aufs on /home type aufs (rw,relatime,si=57e9de87)
aufs on /lib type aufs (rw,relatime,si=57e9df87)
aufs on /sbin type aufs (rw,relatime,si=57e9dc87)
aufs on /usr type aufs (rw,relatime,si=57e9d287)
aufs on /var type aufs (rw,relatime,si=57e9d687)
aufs on /root type aufs (rw,relatime,si=57e9d087)
aufs on /opt type aufs (rw,relatime,si=57e9d887)
aufs on /srv type aufs (rw,relatime,si=57e9db87)
aufs on /media type aufs (rw,relatime,si=45009587)

3. 環境の設定


一連の手順はユーザマニュアルに記載があります。
私がいつも行う手順は以下の通りです。

ネットワークの設定

# vi /etc/network/interfaces

DHCPによりアドレスを取得する場合

auto eth0
iface eth0 inet dhcp

固定アドレスを割り振る場合 ( アドレスはお使いのものに置き換えます)

auto eth0
iface eth0 inet static
     address 192.168.254.254
     network 192.168.254.0
     netmask 255.255.255.0
     broadcast 192.168.254.255
     gateway 192.168.254.1

設定後再起動するか、ifdown / ifup コマンドでネットワークインターフェースの設定を反映させます。

インストール可能なパッケージ情報の更新


#aptitude update


インストール済みパッケージの更新


#aptitude safe-upgrade

インストール済みのdebianの各種パッケージおよび、本体ファームウェアについても最新のものがリリースされていれば更新されます。

タイムゾーンの設定

# dpkg-reconfigure tzdata

ロケールの設定

# aptitude install locales
# dpkg-reconfigure locales

特にポリシーがないならば、ja_JP.UTF-8で設定しておくことをお勧めします。
また、日本語の扱いなどが必要ないならば、デフォルトのままでも構いません。

4. 開発環境の構築


 よく利用されるツール一式をインストールします。

# tasksel install standard

開発ツール一式をインストールします。(debianのパッケージ開発ツール)

# aptitude install build-essential

Webアプリケーションなどを構築する際のLAMP環境、Ruby環境などについては別途必要なものをインストールしてください。
いくつかのパッケージのインストール手順に関しては、本blogでも事前準備として記述していますので、参考にして下さい。

5. さいごに


今回は、ディスク共有モードでの一連の開発を行うための環境構築について説明をしました。
RAMディスクモードにおいて、ファームウェアや各種ランタイムプログラムを再構築する手順に関しては、以下の記事において解説しています。

OpenBlocks ファームウェア作成ガイドをgithubにて公開しました


2014-02-25

[.tested] RATOC REX-USB56 USBモデム [debian Wheezy][AX3][A7]

REX-USB56は、USB接続のアナログモデムです。 
OpenBlocks Aシリーズでの接続検証を行いました。


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
Debian 7.0 Wheezy
OpenBlocks AX3/4 kernel: 3.2.40
OpenBlocks A7 kernel: 3.2.40

<使用機器>
OpenBlocks AX3
OpenBlocks A7
REX-USB56

1. 対応ドライバと事前準備


本デバイスは、Conexant USB MODEM CX93010 chipを採用しており、cdc_acm driverでサポートされています。
本デバイスを使用するための特別な設定は必要ありません。

dmesgの出力

usb 1-1.1: new full-speed USB device number 7 using orion-ehci
usb 1-1.1: New USB device found, idVendor=0572, idProduct=1321
usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.1: Product: USB Modem
usb 1-1.1: Manufacturer: Conexant
usb 1-1.1: SerialNumber: 24680246
cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device

lsusbの出力
# lsusb
Bus 001 Device 007: ID 0572:1321 Conexant Systems (Rockwell), Inc.

minicomにより、ATコマンドの受付を確認しました。

2. PPP接続の方法 (接続未確認)


接続は、他のモバイル通信アダプタと同様、pppconfigで設定を行います。

pppconfigをインストールします。

# aptitude install pppconfig

pppconfigの設定は以下の通りです。

Provider Name  xxx
Configure Nameservers (DNS)  Dynamic
Authentication Method for test  PAP
User Name  アカウント名(*1)
Password  パスワード(*1)
Speed  115200
Pulse or Tone  Tone
Phone Number
 xxx-xxx-xxxxx
Choose Modem Config Method  No
Select Modem Port  Manual
Manually Select Modem Port  /dev/ttyACM0

(*1) プロバイダより提供されたアカウント名、パスワードを使用してください。
(*2) プロバイダより提供された番号を使用してください。

eth0や他のインタフェースが有効になっている場合は、/etc/ppp/peers/xxxに、以下の行を加えることにより、defaultrouteが変更されます。

replacedefaultroute


一般的には、上記の設定で接続出来るはずです。

はずです、と書いたのは、現在当社もしくは私個人には、アナログのダイヤルアップ接続先の契約がないことと、当社の電話回線の設定で、0088番で始まる契約フリーな接続サービスへの発呼も出来ないことが原因です。

そのため、本デバイスの通信機能に関しては、次項の通り、fax送信により行いました。

3. efaxによるfax送信による検証


REX-USB56は、G3 FAXにも対応していますので、efaxにより設定を行いました。

efaxをインストールします。

# aptitude install efax

efaxの設定は、送信のテストのみのため、最低限の設定のみ行っています。


 :
DEV=ttyACM0
 :
FROM="+81 3 3xxx xxxx"

NAME="PLAT'HOME OBDN_Magazine"

TELCVT='sed -e s/+81 */0/'            # JP

DIALPREFIX="P"



postscript形式のファイルを用意し、送信してみます。

#fax send -v <発信先電話番号> test.ps

psファイルは、ghostscriptなどを使用してpdfファイル等から変換してもいいでしょう。

上記の手順にてfax送信を行い、受信を確認しました。

4. さいごに


 今回は、モデムの各種設定や、発呼、fax送信までの確認を行いました。
 検証としては、不完全な状況ですが、お貸出の期限もあるため、今回はここまでとします。