Quantcast
Channel: OBDNマガジン
Viewing all 98 articles
Browse latest View live

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

$
0
0


Planex GW-USHyper300は、802.11b/g/nに対応したUSB無線LANアダプタです。
Openblocks AX3およびA6での動作検証を行いました。


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


<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8

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

本デバイスは、RTL8192SUを使用しており、AX3/A6とも、標準のカーネルパッケージでは対応していません。
そのため、Realtek社のWebページより、ドライバのソースコードパッケージを入手し、ビルドして検証を行いました。

Software: Drivers & Utilities / RTL8192SU

RTL8192CUの、Linux Kernel 2.6.18~2.6.38 and Kernel 3.0.2 の項目にあるリンクからドライバパッケージをダウンロードします。
ダウンロードしたファイルは以下の手順で解凍してください。

# unzip RTL819xSU_usb_linux_v2.6.6.0.20120405.zip

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

# cd rtl8712_8188_8191_8192SU_usb_linux_v2.6.6.0.20120405
# cd driver
# tar xvzf rtl8712_8188_8191_8192SU_usb_linux_v2.6.6.0.20120405.tar.gz
# cd rtl8712_8188_8191_8192SU_usb_linux_v2.6.6.0.20120405


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

# diff -u Makefile.orig Makefile
--- Makefile.orig       2012-10-10 17:30:21.830000038 +0900
+++ Makefile    2012-10-10 17:31:01.710000037 +0900
@@ -11,7 +11,8 @@

 CONFIG_MP_INCLUDED              =       y

-CONFIG_PLATFORM_I386_PC         =       y
+CONFIG_PLATFORM_I386_PC         =       n
+CONFIG_PLATFORM_ARM_OBS         =       y
 CONFIG_PLATFORM_ANDROID_X86     =       n
 CONFIG_PLATFORM_ARM_S3C         =       n
 CONFIG_PLATFORM_ARM_PXA         =       n
@@ -85,6 +86,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_ARM_OBS), 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


次に、includeディレクトリに移動し、autoconf.hを編集します。
同じバージョンのドライバパッケージを使用する場合は、以下のdiff出力をpatch適用して下さい。
アップデートにより内容が変更されている場合は、参考にして書き換えてください。
(#define CONFIG_IOCTL_CFG80211 1 の行を削除するだけです)

# diff -u autoconf.h.orig
autoconf.h
--- autoconf.h.orig     2012-10-12 16:30:45.560000077 +0900
+++ autoconf.h  2012-10-12 16:30:59.050000077 +0900
@@ -33,7 +33,7 @@
 #undef  CONFIG_RTL8716


-#define CONFIG_IOCTL_CFG80211  1
+//#define CONFIG_IOCTL_CFG80211        1

 #ifdef CONFIG_IOCTL_CFG80211
 #define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER


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

# make install

ドライバは、
/lib/modules/2.6.31/kernel/drivers/net/wireless/
の下にコピーされ、depmod -aされます。
不要になり、削除する場合は、8192cu.koを削除し、depmod -aして下さい。

デバイスをUSBポートに差し込めば認識します。
dmesgは以下の通りです。

usb 1-1: new high speed USB device number 2 using ehci_marvell
usb 1-1: New USB device found, idVendor=2019, idProduct=ed18
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: GW-USH300N
usb 1-1: Manufacturer: PLANEX COMMUNICATIONS INC.
usb 1-1: SerialNumber: 00e04c000001
==DriverVersion: v2.6.6.0.20120405==
register rtl8712_netdev_ops to netdev_ops

8712_usb_endpoint_descriptor(0):
bLength=7
bDescriptorType=5
bEndpointAddress=83
wMaxPacketSize=200
bInterval=0

8712_usb_endpoint_descriptor(1):
bLength=7
bDescriptorType=5
bEndpointAddress=4
wMaxPacketSize=200
bInterval=0

8712_usb_endpoint_descriptor(2):
bLength=7
bDescriptorType=5
bEndpointAddress=6
wMaxPacketSize=200
bInterval=0

8712_usb_endpoint_descriptor(3):
bLength=7
bDescriptorType=5
bEndpointAddress=d
wMaxPacketSize=200
bInterval=0

8712u : USB_SPEED_HIGH
nr_endpoint=4
Boot from EFUSE
Autoload OK!!
CustomerID = 0x   0
MAC Address from efuse= 0-22-cf-46-2e-d3
usbcore: registered new interface driver r871x_usb_drv


デバイスは、

/dev/wlan0

となります。

2. wpasupplicantパッケージの導入およびインタフェースの設定

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

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

上記のドライバにより、AX3、A6においてクライアントモードでの動作を確認しました。
iwconfigでは、以下の様に表示されます。

# iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"*****"  Nickname:"rtl_wifi"
          Mode:Managed  Frequency:2.452 GHz  Access Point: **:**:**:C2:F4:00
          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=38/100  Signal level=38/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モードでの検証について

APモードに関しては、上記のパッケージにはhostapdのパッケージは含まれていないため、検証を行っていません。
同メーカの製品では、以下の検証記事において、realtek社から提供されるhostapdパッケージの検証を行っています。 

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

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



OpenBlocks AX3でVyattaを動かす(ビルド編)

$
0
0
◆はじめに

VyattaはVyatta社が開発しているソフトウェアルータです。有償版もありますが、Vyatta COREと呼ばれるものはオープンソースとして公開されています。有償版に比べてWebベースのGUIが無い等はありますがオープンソース版でも多くの機能を使うことはできます。Vyattaは主にIntelプロセッサ向けに開発されていますが、ARMアーキテクチャのOpenBlocks AX3でオープンソース版のVyatta CORE 6.4を動かすこと目指し、今回は各パッケージのビルドまでを行います。


◆Vyattaソースコード取得

まずはVyattaのソースコードを取得します。ソースコードの取得にはgitが必要になるのでgitをインストールします。
 $ su
 # aptitude install git-core
 # exit
次にソースコードを取得します。
今回は執筆時点での最新のリリース版のVyatta CORE 6.4を利用します。
このバージョンはoxnardというブランチ名で開発されています。
 $ git clone http://git.vyatta.com/build-iso.git
 $ cd build-iso
 $ git checkout --track -b oxnard origin/oxnard
READMEファイルにビルド方法が記載されているので参考にします。
基本的にIntelプロセッサ向けに書かれていますのでARMでは多少変更する部分があります。


◆aptで必要なパッケージを導入する

まずは必要debianパッケージをインストールします。
インストール用のスクリプトがありますのでそれを実行します。
$ su
# sh ./setup-pkg-build 
400パッケージほどダウンロードされインストールされますのでかなり時間がかかります。
まだ不足しているパッケージがあるので追加でインストールします。
 # aptitude install python-central indent parted dosfstools ntp fakechroot uboot-mkimage libattr1-dev automake libsensors4-dev libboost-filesystem1.42-dev libapt-pkg-dev
このときlibsensors-devとconflictするので削除することになります。

i386やamd64ではビルド時にpackages.vyatta.comからパッケージを取得します。そのためvyatta-pubkey.gpgのインストールが必要となるのですが、armel用のパッケージはpackaegs.vyatta.comには存在しないため自前で準備する必要があります。そのため今回はvyatta-pubkey.gpgのインストールは不要となります。


◆サブモジュール群のビルド

ここからサブモジュール群のビルドに入ります。
Intel向けだとすでにビルドされたバイナリをサイトからaptで入手できますがARM向けは存在しないので自力でコンパイルする必要があります。

まずはサブモジュールを初期化します。
 $ git submodule init
次はgit submodule updateを行うのですが、その前にnfctがgitで取得できないため.git/configから以下を削除します。
ちなみにnfctはconntrack-toolsで生成されます。
 [submodule "pkgs/nfct"]
        url = http://git.vyatta.com/nfct.git
同様に.gitmoduleから以下を削除します。
 [submodule "pkgs/nfct"]
         path = pkgs/nfct
         url = http://git.vyatta.com/nfct.git

 $ git rm --cached pkgs/nfct
全てのサブモジュールを取得します。
 $ git submodule update
各モジュールのブランチをoxnardに変更します。
 $ git submodule foreach git checkout --track -b oxnard origin/oxnard
サブモジュールのビルドは基本的にはTOPディレクトリ(build_iso直下)でmake <サブモジュール名>
で行います。またエラーになった場合など一度クリアしたい場合にはmake clear-<サブモジュール名>とします。
例えばサブモジュール名がhogeの場合には以下のようになります。
 $ make hoge         (hogeのビルド)
 $ make clear-hoge   (hogeのクリア)
まずはビルド時に必要となるライブラリ等のビルドおよびインストールを行います。

squashfs-toolsをビルドしインストールします。
 $ make squashfs
 $ su
 # dpkg -i pkgs/squashfs-tools_4.1+vyatta-7+oxnard1_armel.deb
 # cat >| /etc/apt/preferences.d/squashfs-tools <<EOF
 Package: squashfs-tools
 Pin: version 4.*
 Pin-Priority: 1001
 EOF
 # exit
Debian squeezeには存在しないlibnet0 libsablot0をインストールするためにlennyのレポジトリを一時的に登録します。
 $ su
 # echo "deb http://archive.debian.org/debian/ lenny contrib main non-free" > /etc/apt/sources.list.d/lenny.list
 # aptitude update
 # aptitude install libnet0 libnet0-dev libsablot0 libsablot0-dev
 # rm /etc/apt/sources.list.d/lenny.list
 # exit
libmnlをビルドおよびインストールします。
 $ make libmnl
 $ su
 # dpkg -i pkgs/libmnl-dev_1.0.3-6_armel.deb \
           pkgs/libmnl0_1.0.3-6_armel.deb
 # exit
libcapをビルドおよびインストールします。
 $ make libcap
 $ su
 # dpkg -i pkgs/libcap-dev_2.19-3+vyatta2+oxnard1_armel.deb \
           pkgs/libcap2_2.19-3+vyatta2+oxnard1_armel.deb 

 # cat >| /etc/apt/preferences.d/libcap-dev <<EOF
 Package: libcap-dev
 Pin: version 2.*
 Pin-Priority: 1001
 EOF
 # cat >| /etc/apt/preferences.d/libcap2 <<EOF
 Package: libcap2
 Pin: version 2.*
 Pin-Priority: 1001
 EOF
iptablesをビルドおよびインストールします。
 $ make iptables
 $ su
 # dpkg -i pkgs/iptables-dev_1.4.10+vyatta+2+oxnard2_armel.deb \
           pkgs/iptables_1.4.10+vyatta+2+oxnard2_armel.deb
net-snmpをビルドおよびインストールします。
 $ make net-snmp
 $ su
 # dpkg -i pkgs/libsnmp-base_5.6.1.1-vyatta+7+oxnard6_all.deb \
           pkgs/libsnmp-python_5.6.1.1-vyatta+7+oxnard6_armel.deb \
           pkgs/libsnmp-dev_5.6.1.1-vyatta+7+oxnard6_armel.deb \
           pkgs/libsnmp-perl_5.6.1.1-vyatta+7+oxnard6_armel.deb \
           pkgs/libsnmp15_5.6.1.1-vyatta+7+oxnard6_armel.deb
daqをビルドおよびインストールします。
 $ make daq
 $ su
 # dpkg -i pkgs/libdaq-dev_0.3-2+vyatta3+oxnard1_armel.deb \
           pkgs/libdaq0_0.3-2+vyatta3+oxnard1_armel.deb
libnetfilter-conntrackをビルドおよびインストールします。
 $ make libnetfilter-conntrack
 $ su
 # dpkg -i pkgs/libnetfilter-conntrack3_1.0.0-1+vyatta10+oxnard4_armel.deb \
           pkgs/libnetfilter-conntrack3-dbg_1.0.0-1+vyatta10+oxnard4_armel.deb \
           pkgs/libnetfilter-conntrack-dev_1.0.0-1+vyatta10+oxnard4_armel.deb
libnetfilter-cthelperをビルドおよびインストールします。
 $ make libnetfilter-cthelper
 $ su
 # dpkg -i pkgs/libnetfilter-cthelper_1.0.1-5_armel.deb
libnetfilter-cttimeoutをビルドおよびインストールします。
 $ make libnetfilter-cthelper
 $ su
 # dpkg -i pkgs/libnetfilter-cttimeout_0.2+oxnard4_armel.deb
libnetfilter-queueをビルドおよびインストールします。
 $ make libnetfilter-cthelper
 $ su
 # dpkg -i pkgs/libnetfilter-queue-dev_1.0.1-2_armel.deb \
           pkgs/libnetfilter-queue1_1.0.1-2_armel.deb  
vyatta-cfgをビルドおよびインストールします。
 $ make vyatta-cfg
 $ su
 # dpkg -i pkgs/libvyatta-cfg-dev_0.99.73+oxnard6_armel.deb \
   pkgs/libvyatta-cfg1_0.99.73+oxnard6_armel.deb 
ここまででビルドに必要なパッケージのインストールは終わりました。
次からはパッケージのビルドだけ行います。Linuxカーネル(linux-image)は厄介なので後回しにして
Linuxカーネル以外の残りのパッケージをビルドします。
最終的に使用されるパッケージリストは livecd/config.vyatta/chroot_local-packageslists/vyatta-full.list
に記載されているので、このリストに記載されているもの以外は除外しています。

また一部コンパイルが通らないパッケージ(vyatta-cfg-systemとvyatta-biosdevname)
があるので修正します。
vyatta-cfg-system
grub-pcは不要なので削除します。また、ハイパバイザの判定にIntel Processor用アセンブラを使用している
部分を削除します。
 diff --git a/debian/control b/debian/control
 index 0b06b26..7396100 100644
 --- a/debian/control
 +++ b/debian/control
 @@ -52,7 +52,6 @@ Depends:  acpid,
   apt-transport-https,
   hostapd (>= 1:0.6.9-3),
   cpufrequtils,
 - grub-pc (>= 1.98+20100804),
   libcap2-bin (>= 2.19)
  Pre-Depends: bash-completion
  Suggests: util-linux (>= 2.13-5),
 diff --git a/src/hypervisor_vendor.c b/src/hypervisor_vendor.c
 index 0a44756..9bcef8b 100644
 --- a/src/hypervisor_vendor.c
 +++ b/src/hypervisor_vendor.c
 @@ -43,6 +43,7 @@
   */
  #define HYPERVISOR_INFO_LEAF   0x40000000
  
 +#if 0
  static inline void
  cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx,
  unsigned int *ecx, unsigned int *edx)
 @@ -64,6 +65,7 @@ cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx,
   "=d" (*edx)
  : "1" (op), "c"(0));
  }
 +#endif
  
  
  /* Use CPUID instruction to find hypervisor vendor.
 @@ -72,6 +74,7 @@ cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx,
   */
  static const char *get_hypervisor_cpuid(void)
  {
 +#if 0
  unsigned int eax = 0, ebx = 0, ecx = 0, edx = 0;
 char hyper_vendor_id[13];
  
 @@ -95,6 +98,7 @@ static const char *get_hypervisor_cpuid(void)
  else if (!strncmp("VMwareVMware", hyper_vendor_id, 12))
  return "VMware";
  else
 +#endif
  return NULL;
  }
vyatta-biosdevname
仮想マシンかどうかの判定の部分でIntel Processor用アセンブラを用いている部分があるので削除します。
 diff --git a/src/bios_dev_name.c b/src/bios_dev_name.c
 index e2f8454..a5b5fdd 100644
 --- a/src/bios_dev_name.c
 +++ b/src/bios_dev_name.c
 @@ -104,6 +104,7 @@ parse_opts(int argc, char **argv)
                 opts.prefix = "em";
  }
  
 +/*
  static u_int32_t
  cpuid (u_int32_t eax, u_int32_t ecx)
  {
 @@ -114,6 +115,7 @@ cpuid (u_int32_t eax, u_int32_t ecx)
         : "%ebx", "%edx");
      return ecx;
  }
 +*/
  
  /*
    Algorithm suggested by:
 @@ -125,9 +127,11 @@ running_in_virtual_machine (void)
  {
      u_int32_t eax=1U, ecx=0U;
  
 +/*
      ecx = cpuid (eax, ecx);
      if (ecx & 0x80000000U)
         return 1;
 +*/
      return 0;
  }
 以上の修正後に、以下のコマンドでビルドを実行します。
 $ make barnyard2 conntrack-tools initramfs-tools iproute ipset
 $ make live-initramfs lldpd netplug ntp pmacct ppp squidguard linux-firmware
 $ make vyatta-base vyatta-bash vyatta-busybox vyatta-conntrack
 $ make vyatta-conntrack-sync vyatta-cfg-dhcp-relay
 $ make vyatta-cfg-dhcp-server vyatta-cfg-firewall
 $ make vyatta-cfg-op-pppoe vyatta-cfg-qos vyatta-cfg-quagga vyatta-cfg-system
 $ make vyatta-cfg-vpn vyatta-cluster vyatta-config-migrate
 $ make vyatta-dhcp3-client vyatta-idp-snort vyatta-ipv6-rtradv vyatta-keepalived vyatta-nat vyatta-op
 $ make vyatta-op-dhcp-server vyatta-op-firewall vyatta-op-qos vyatta-op-quagga vyatta-op-vpn vyatta-op-xml
 $ make vyatta-openvpn vyatta-quagga vyatta-ravpn vyatta-snort vyatta-util vyatta-wanloadbalance
 $ make vyatta-webgui vyatta-webproxy vyatta-wireless vyatta-wirelessmodem
 $ make vyatta-netflow vyatta-biosdevname vyatta-lldp vyatta-zone vyatta-config-mgmt


◆OpenBlocks AX3対応のvyatta用Linuxカーネルをビルド

最後にLinuxカーネルパッケージ linux-imageをビルドします。
準備としてオリジナルのLinuxカーネルからOpenBlocks AX3用の差分を抽出します。
OpenBlocks AX3のカーネルにはunionfsのパッチが適用されています。また、vyattaのカーネルにもunionfsのパッチが適用されています。そこでオリジナルのLinuxカーネルにunionfsのパッチを適用してその後に差分をとるという手順にします。

まずはOpenBlocks AX3用のカーネルを取得します。
 $ cd ~
 $ wget ftp://ftp.plathome.co.jp/pub/OBSAX3/squeeze/3.0.6-4/source/linux-3.0.6-20120820-1.tar.gz
 $ tar zxf linux-3.0.6-20120820-1.tar.gz
 $ mv linux-3.0.6 linux-3.0.6.obsax3
次にオリジナルのカーネル3.0.6とunionfs用の差分を取得し差分を適用します。
 $ wget ftp://ftp.ne.jp/Linux/kernel.org/linux/kernel/v3.x/linux-3.0.6.tar.xz
 $ wget http://download.filesystems.org/unionfs/unionfs-2.x/unionfs-2.5.11_for_3.0.18.diff.gz
 $ tar Jxf linux-3.0.6.tar.xz
 $ cd linux-3.0.6
 $ zcat ../unionfs-2.5.11_for_3.0.18.diff.gz |patch -s -p1
 (ここで一ヶ所rejectされるので手動でパッチをあてます。)
 $ cd ..
OpenBlocks AX3用の差分を抽出します。
 $ diff -urN linux-3.0.6 linux-3.0.6.obsax3 > linux-3.0.6.obsax3.diff
準備ができたのでvyattaのlinux-imageのビルドに戻ります。
まずは準備したOpenBlocks AX3用の差分を適用します。
 $ cd build-iso/pkgs/linux-image
 $ patch -s -p1 < ~/DIFF-3.0.6 
 1 out of 5 hunks FAILED -- saving rejects to file arch/arm/kernel/smp.c.rej
 1 out of 2 hunks FAILED -- saving rejects to file drivers/tty/tty_ldisc.c.rej
 2 out of 10 hunks FAILED -- saving rejects to file fs/splice.c.rej
 The next patch would delete the file include/linux/namei.h.orig,
 which does not exist!  Assume -R? [n] 
 Apply anyway? [n] 
 1 out of 1 hunk ignored
 1 out of 2 hunks FAILED -- saving rejects to file include/linux/socket.h.rej
 1 out of 1 hunk FAILED -- saving rejects to file kernel/printk.c.rej
 3 out of 11 hunks FAILED -- saving rejects to file net/bridge/br_fdb.c.rej
rejectされた箇所を順番に確認していきます。
arch/arm/kernel/smp.c.rej
           手動で差分を適用します。
drivers/tty/tty_ldisc.c.rej
           tty_ldisc_reinit()関数への差分は不要なようなので適用しません。
fs/splice.c.rej
           該当部分を以下のように修正しました。
        int ret, more;

        ret = buf->ops->confirm(pipe, buf);
        if (!ret) {
                more = (sd->flags & SPLICE_F_MORE) ? MSG_MORE : 0;

                if (sd->len < sd->total_len)
                         more |= MSG_SENDPAGE_NOTLAST;
                ret = file->f_op->sendpage(file, buf->page, buf->offset,
                                           sd->len, &pos, more);
        }

        return ret;

include/linux/socket.h.rej
           MSG_KERNSPACE, MSG_NOCATCHSIGはMarvellが追加したもののようで、
           MSG_SENDPAGE_NOTLASTとconflictしてしまします。
           そこで番号を以下のように変更します。
   #define MSG_KERNSPACE   0x200000
   #define MSG_NOCATCHSIG  0x400000

kernel/printk.c.rej
           手動で差分を適用します。
net/bridge/br_fdb.c.rej
           手動で差分を適用します。


続いてlinux-imageのarmel用build設定をします。
 $ cd ~/build-iso/pkgs/linux-image
 $ mkdir debian/arch/armel
 $ touch debian/arch/armel/config

debian/arch/armel/defines.obsax3-vyatta を以下のように作成します。
 $ vi debian/arch/armel/defines.obsax3-vyatta 
 [base] 
 flavours: obsax3-vyatta 
 kernel-arch: arm 
 kernel-header-dirs: arm 
 [obsax3-vyatta_build] 
 image-file: arch/arm/boot/zImage 
 [obsax3-vyatta_description] 
 hardware: OpenBlocks AX3
 hardware-long: OpenBlocks AX3
 [obsax3-vyatta_image] 
 recommends: uboot-mkimage 
 check-size: 2097080
 [obsax3-vyatta] 
 class: arm 
 longclass: arm and compatible 

armel archを追加します。
 $ vi debian/arch/defines
 arches:
  i386 amd64 armel

次にconfigを生成します。
まずはOpenBlocks AX3のデフォルトconfigをコピーしmenuconfigは必要な設定を追加します。
 $ cp arch/arm/configs/obsax3_defconfig .config
 $ make menuconfig
 (以下を追加しました)
 CONFIG_NETFILTER_NETLINK_CTHELPER=m
 CONFIG_NF_CONNTRACK_TIMEOUT=y
 CONFIG_NF_CT_NETLINK_TIMEOUT=m
 CONFIG_IP_SET_BITMAP_IP=m
 CONFIG_IP_SET_BITMAP_IPMAC=m
 CONFIG_IP_SET_BITMAP_PORT=m
 CONFIG_IP_SET_HASH_IP=m
 CONFIG_IP_SET_HASH_IPPORT=m
 CONFIG_IP_SET_HASH_IPPORTIP=m
 CONFIG_IP_SET_HASH_IPPORTNET=m
 CONFIG_IP_SET_HASH_NET=m
 CONFIG_IP_SET_HASH_NETPORT=m
 CONFIG_IP_SET_LIST_SET=m
 CONFIG_IP_VS_FTP=m
 CONFIG_IP_NF_MATCH_IPP2P=m
 CONFIG_SQUASHFS=y
 CONFIG_SQUASHFS_XATTR=y
 CONFIG_SQUASHFS_LZO=y
 CONFIG_SQUASHFS_XZ=y
 CONFIG_SQUASHFS_EMBEDDED=y
 CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3
生成された .configを必要な場所にコピーします。
 $ cp .config debian/arch/armel/config.obsax3-vyatta
次にbuild-flavour.shを実行してdebian/controlファイルを生成するのですが、その前に生成されるcontrolファイルのSection: adminがSection: kernelになるようにtemplateファイルに修正を加えます。
これをしないと後ほどパッケージビルド時にエラーが起こります。
 $ for f in debian/templates/control.image.*
   do
     sed -i -e 's/^Section: admin/Section: kernel/' $f
   done
kernel flavour の準備をします。最後にエラーがでますが無視して問題ありません。
 $ ./debian/bin/build-flavour.sh obsax3-vyatta

 (snip)
 This target is made to fail intentionally, to make sure
 that it is NEVER run during the automated build. Please
 ignore the following error, the debian/control file has
 been generated SUCCESSFULLY.
 exit 1
 make[1]: *** [debian/control-real] Error 1
 make[1]: Leaving directory `/home/ono/build-iso/pkgs/linux-image'
 make: *** [debian/control] Error 2

ようやくlinux-imageパッケージ生成の準備ができましたのでビルドします。

 $ cd ~/build-iso
 $ make linux-image


◆まとめ

今回はOpenBlocks AX3上でVyatta CORE 6.4のサブモジュールのビルドを行いました。次回はLIVE ISOイメージを作成して実際にOpenBlocks AX3で起動させてみます。

[.tested] Planex BT-Micro3H2X Bluetooth+無線LANコンポアダプタ [AX3][A6]

$
0
0


Planex BT-Micro3H2Xは、Bluetooth3.0+HSおよび、Wifi 802.11b/g/nに対応したコンポタイプのアダプタです。Openblocks AX3およびA6での動作検証を行いました。


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


<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8

1. 対応ドライバと事前準備
本デバイスは、BluetoothにCSR8510、WifiにRealtek8192CUを使用しています。2つのデバイスは、1つの複合デバイスとしてではなく、内部にHubを介して接続されていますので、それぞれにドライバを組み込みます。(内部Hubは接続階数にカウントされます)

本作業解説に入る前に、先に結果だけを書きます。
Wifi部の8192CUは、以下の手順による動作を確認しました。
( AX3のカーネル3.0.6およびcompat-wirelessに含まれる8192cu.koでは動作しません。)
Bluetooth部のCSR8510は、デバイスの認識を確認しましたが、bluezによる一連の操作での検証では、うまく動作していません。

・Wifi部のドライバ導入方法
Realtek社のWebページより、ドライバのソースコードパッケージを入手し、ビルドして検証を行いました。

Software: Drivers & Utilities / RTL8192CU

RTL8192CUの、Linux Kernel 2.6.18~2.6.38 and Kernel 3.0.8 の項目にあるリンクからドライバパッケージをダウンロードします。
ダウンロードしたファイルは以下の手順で解凍してください。

# unzip RTL819xC_USB_linux_v3.4.4_4749.20120806.zip

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

# cd RTL8188C_8192C_USB_linux_v3.4.4_4749.20120806/
# cd driver
# tar xvzf rtl8188C_8192C_usb_linux_v3.4.4_4749.20120730.tar.gz
# cd rtl8188C_8192C_usb_linux_v3.4.4_4749.20120730

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

# diff -u Makefile.orig Makefile
--- Makefile.orig       2012-10-10 13:02:18.721606504 +0900
+++ Makefile    2012-10-10 13:02:31.901614134 +0900
@@ -36,7 +36,8 @@
 CONFIG_RTL8192CU_REDEFINE_1X1 =n
 CONFIG_WAKE_ON_WLAN                            =       n

-CONFIG_PLATFORM_I386_PC = y
+CONFIG_PLATFORM_I386_PC = n
+CONFIG_PLATFORM_OBS_ARM = y
 CONFIG_PLATFORM_TI_AM3517 = n
 CONFIG_PLATFORM_ANDROID_X86 = n
 CONFIG_PLATFORM_ARM_S3C2K4 = n
@@ -254,6 +255,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


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

# make install

ドライバは、
/lib/modules/2.6.31/kernel/drivers/net/wireless/
の下にコピーされ、depmod -aされます。
不要になり、削除する場合は、8192cu.koを削除し、depmod -aして下さい。
なお、ダウンロードしたパッケージは標準状態では非常に多くのデバッグメッセージを出しますので、
気になる場合は、include/autocong.hの一連のデバッグ関係のdefineをコメントアウトしてください。

デバイスをUSBポートに差し込めば認識します。
dmesgは以下の通りです。

usb 1-1: new high speed USB device number 2 using ehci_marvell
usb 1-1: New USB device found, idVendor=05e3, idProduct=0608
usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0
usb 1-1: Product: USB2.0 Hub
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 4 ports detected
usb 1-1.2: new high speed USB device number 3 using ehci_marvell
usb 1-1.2: New USB device found, idVendor=2019, idProduct=1201
usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.2: Product: BT-Micro3H2X Wireless LAN
usb 1-1.2: Manufacturer: Realtek
usb 1-1.2: SerialNumber: 00e04c000001
usb 1-1.4: new full speed USB device number 4 using ehci_marvell
usbcore: registered new interface driver rtl8192cu


デバイスは、

/dev/wlan0

となります。

・Bluetooth部のドライバ導入方法
bluetoothドライバは、AX3、A6ともに、カーネルパッケージにドライバが含まれており、AX3、A6ともに出荷状態で有効になっています。

dmesgでは以下の様に表示されます。

usb 1-1: new high speed USB device number 2 using ehci_marvell
usb 1-1: New USB device found, idVendor=05e3, idProduct=0608
usb 1-1: New USB device strings: Mfr=0, Product=1, SerialNumber=0
usb 1-1: Product: USB2.0 Hub
hub 1-1:1.0: USB hub found
hub 1-1:1.0: 4 ports detected
usb 1-1.2: new high speed USB device number 3 using ehci_marvell
usb 1-1.2: New USB device found, idVendor=2019, idProduct=1201
usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1.2: Product: BT-Micro3H2X Wireless LAN


usb 1-1.4: New USB device found, idVendor=0a12, idProduct=0001
usb 1-1.4: New USB device strings: Mfr=0, Product=2, SerialNumber=0
usb 1-1.4: Product: CSR BS8510
Bluetooth: Generic Bluetooth USB driver ver 0.6
usbcore: registered new interface driver btusb


2. wpasupplicantパッケージの導入およびインタフェースの設定

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

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

上記のドライバにより、AX3、A6においてクライアントモードでの動作を確認しました。

3. hostapdによるAP設定

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

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

reaktekのドライバパッケージに付属したhostapdによりAP構築し、接続を確認しました。

4. Bluetoothでの接続検証

以下の記事と同様の操作により接続検証を行いましたが、ペアリングの段階でほぼ失敗します。

【.tested】Logitec製 Bluetoothアダプタ (LBT-UAN03C1BK) [AX3]

これはドライバによる問題であるのか、bluezによる問題であるのかの切り分けが出来ていません。
本インタフェースは、gnomeによるパネルでのペアリングは出来ますので、simple-agentを使用しなければリトライによりペアリングは完了すると思れます。
また、ペアリングの段階で不安定であるため、マウス、キーボードでのテストはまだ行っていません。

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

$
0
0


Planex GW-USDual300は、802.11b/g/nに対応したUSB無線LANアダプタです。
Openblocks AX3およびA6での動作検証を行いました。


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


<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8

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

本デバイスは、Realtek社のWebページの情報から推測するにRTL8192DUを使用しています。
RTL8192DUは、AX3およびA6の標準カーネルパッケージでは対応していません。
そのため、Realtek社のWebページより、ドライバのソースコードパッケージを入手し、ビルドして検証を行いました。

Software: Drivers & Utilities / RTL8192DU-VC

RTL8192DU-VCの、Linux Driver for Kernel 2.6.18~2.6.38 and 3.0.2 の項目にあるリンクからドライバパッケージをダウンロードします。
ダウンロードしたファイルは以下の手順で解凍してください。

# unzip RTL8192DU_linux_v4.0.0_4074.20120518.zip

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

# cd RTL8192DU_linux_v4.0.0_4074.20120518
# cd driver
# tar xvzf rtl8192DU_linux_v4.0.0_4074.20120518.tar.gz
# cd rtl8192DU_linux_v4.0.0_4074.20120518


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

# diff -u Makefile.orig Makefile
--- Makefile.orig       2012-10-09 16:32:27.130006123 +0900
+++ Makefile    2012-10-09 16:33:53.650006092 +0900
@@ -36,7 +36,8 @@
 CONFIG_RTL8192CU_REDEFINE_1X1 = n
 CONFIG_INTEL_WIDI = n

-CONFIG_PLATFORM_I386_PC = y
+CONFIG_PLATFORM_I386_PC = n
+CONFIG_PLATFORM_ARM_OBS = y
 CONFIG_PLATFORM_ANDROID_X86 = n
 CONFIG_PLATFORM_ARM_S3C2K4 = n
 CONFIG_PLATFORM_ARM_PXA2XX = n
@@ -219,6 +220,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_ARM_OBS), 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


変更後、make / installを行います。

# make install

ドライバは、
/lib/modules/$(KVER)/kernel/drivers/net/wireless/
の下にコピーされ、depmod -aされます。
不要になり、削除する場合は、8192du.koを削除し、depmod -aして下さい。

デバイスをUSBポートに差し込めば認識します。
dmesgは以下の通りです。

usb 1-1: new high speed USB device number 5 using ehci_marvell
usb 1-1: New USB device found, idVendor=2019, idProduct=4903
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: 802.11n NIC
usb 1-1: Manufacturer: Realtek
usb 1-1: SerialNumber: 00e04c000001
rtw driver version=v4.0.0_4074.20120518
Build at: Oct  5 2012 16:08:47
register rtw_netdev_ops to netdev_ops
CHIP TYPE: RTL8192D

usb_endpoint_descriptor(0):
bLength=7
bDescriptorType=5
bEndpointAddress=81
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_in = 1

usb_endpoint_descriptor(1):
bLength=7
bDescriptorType=5
bEndpointAddress=2
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_out = 2
nr_endpoint=2, in_num=1, out_num=1

USB_SPEED_HIGH
ReadChipVersion8192D 0xF0 = 0x4411635
Normal CHIP!!!
usb_dvobj_init(): pbuddy_padapter == NULL, Set pbuddy_padapter
EEPROM type is E-FUSE
====> ReadAdapterInfo8192D
Boot from EFUSE, Autoload OK !
E-CUT!!!
EEPROMVID = 0x2019
EEPROMPID = 0x4903
EEPROMCustomerID : 0x00
EEPROMSubCustomerID: 0x00
MAC Address from EFUSE = 00:22:cf:78:3e:78
Is D/E cut,Internal PA0 0 Internal PA1 0
PHY_SetPAMode mode 1, c9 = 0x0 cc = 0xff interface index 0
hal_ReadMacPhyModeFromPROM92DU:: MacPhyMode DUALMAC_DUALPHY
_ReadMacPhyModeFromPROM92DU(): MacPhyCrValue 1
MacPhyMode: DUALMAC_DUALPHY
PHY_ConfigMacPhyModeInfo92D(): wireless_mode = b
ChannelPlan = 16
<==== ReadAdapterInfo8192D
rtw_macaddr_cfg MAC Address  = 00:22:cf:78:3e:78
MAC Address from pnetdev->dev_addr= 00:22:cf:78:3e:78
bDriverStopped:1, bSurpriseRemoved:0, bup:0, hw_init_completed:0
register rtw_netdev_ops to netdev_ops
CHIP TYPE: RTL8192D

usb_endpoint_descriptor(0):
bLength=7
bDescriptorType=5
bEndpointAddress=89
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_in = 9

usb_endpoint_descriptor(1):
bLength=7
bDescriptorType=5
bEndpointAddress=a
wMaxPacketSize=200
bInterval=0
RT_usb_endpoint_is_bulk_out = a
nr_endpoint=2, in_num=1, out_num=1

USB_SPEED_HIGH
ReadChipVersion8192D 0xF0 = 0x4411635
Normal CHIP!!!
usb_dvobj_init(): pbuddy_padapter exist, Exchange Information
EEPROM type is E-FUSE
====> ReadAdapterInfo8192D
Boot from EFUSE, Autoload OK !
E-CUT!!!
EEPROMVID = 0x2019
EEPROMPID = 0x4903
EEPROMCustomerID : 0x00
EEPROMSubCustomerID: 0x00
MAC Address from EFUSE = 00:22:cf:78:3e:79
Is D/E cut,Internal PA0 0 Internal PA1 0
PHY_SetPAMode mode 1, c9 = 0x0 cc = 0xff interface index 1
hal_ReadMacPhyModeFromPROM92DU:: MacPhyMode DUALMAC_DUALPHY
_ReadMacPhyModeFromPROM92DU(): MacPhyCrValue 1
MacPhyMode: DUALMAC_DUALPHY
PHY_ConfigMacPhyModeInfo92D(): wireless_mode = 14
ChannelPlan = 16
<==== ReadAdapterInfo8192D
rtw_macaddr_cfg MAC Address  = 00:22:cf:78:3e:79
MAC Address from pnetdev->dev_addr= 00:22:cf:78:3e:79
bDriverStopped:1, bSurpriseRemoved:0, bup:0, hw_init_completed:0
usbcore: registered new interface driver rtl8192du


デバイスは、

/dev/wlan0
/dev/wlan1


となり、本アダプタには、2つの無線LANデバイスが組み込まれているのが分かります。
本アダプタには、上記ドライバパッケージのドキュメントによると、DMDPとDMSPの2つのモードがあり、上記手順でインストールすると、wlan0が2.4GHz帯、wlan1が5GHz帯のインタフェースとなるDMDPモードとなり、それぞれの最大速度は150Mbpsとなります。

2. wpasupplicantパッケージの導入およびインタフェースの設定

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

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

上記のドライバにより、wlan0、wlan1それぞれ、クライアントモードでの動作を確認しました。
wlan1では5GHzでの接続になっています。

# iwconfig wlan1
wlan1     IEEE 802.11an  ESSID:"******"  Nickname:"<WIFI@REALTEK>"
          Mode:Managed  Frequency:5.18 GHz  Access Point: **:**:**: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=100/100  Signal level=60/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. hostapdによるAPモードでの使用方法

2ポートある無線LANポートの片方をAPモードとして設定してみました。

前回、別のボードで設定した、hostapd-1.0そのままでは動作しないため、上記ドライバパッケージを展開したディレクトリの下の、wpa_supplicant_hostapdディレクトリ下にある、

wpa_supplicant_hostapd-0.8_rtw_20120510.zip

というrealtek専用のhostapdパッケージファイルを展開して、使用します。

パッケージファイルを展開し、hostapdディレクトリにてmakeを行うと、hostapdが作成されます。

hostapd.confは、wpa_supplicant_hostapdの下に、

rtl_hostapd_2G.conf
rtl_hostapd_5G.conf

がありますので、環境に合わせて設定してください。

また、eth0とのブリッジ設定に関しては、

[.tested] Silex SX-PCEGN(P)+ PCI-E 無線LANモジュール [AX3]


を参照して下さい。
2.4G/5GHzを同時にAPで使用したい場合は、 ブリッジ設定で、eth0 wlan0 wlan1を設定しておき、
rtl_hostapd_2G.confをwlan0用に、rtl_hostapd_5G.confをwlan1用に設定し、それぞれの設定ファイルを使用してhostapdを立ち上げることになります。

上記のhostapdを使用して、AX3およびA6に対してのiPhone4SやNexus7での接続を確認しました。

4. APモードでハードウェアWPSボタンを使う方法

hostapdには、WPSのサポートがあり、hostapd_cliコマンドやキーボードでWPSのコントロールを行えます。
本デバイスに限らず、最近のWifi USBアダプタにはWPSボタンがついていますが、realtekのドライバパッケージには、このハードウェアボタン用のシグナルハンドルプログラムのサンプルが、上記パッケージの下に置いてあります。
hardware_wps_pbcディレクトリの下のsample.cをmakeし実行すると、ボタンを2秒押すと、
get HW_PBC signal from driver
というメッセージがコンソールに表示されます。
この表示の代わりに
system("hostapd_cli wps_pbs -i wlan0");
と書くと、WPSボタンを使った接続ネゴシエーションを行うための、WPSボタンハンドル用のデーモンとすることが可能になります。
(あくまでも評価用です。もう少しまともな実装をした方がいいと思います)

今回は、Nintendo DSiを使用してWPS接続が出来ることを確認しました。


OpenBlocks AX3でVyattaを動かす(起動編)

$
0
0
◆はじめに

前回に引き続きオープンソースルータのVyatta CORE 6.4をOpenBlocks AX3で動かします。前回は各サブモジュールのビルドまでを行いましたが、今回はISO LIVEイメージを作成しUSBメモリを用いてVyattaを起動させます。その後内蔵のSSDにVyattaをインストールしSSDから起動するようにします。そしてVyattaの簡単な動作確認を行います。

前回の記事はこちら: OpenBlocks AX3でVyattaを動かす(ビルド編)

◆VyattaのISO LIVEイメージ作成

パッケージリストから不要なパッケージの削除と必要なパッケージの追加を行います。
 $ cd ~/build-iso
 $ vi livecd/config.vyatta/chroot_local-packageslists/vyatta-full.list
 (以下を削除)
 grub-common
 grub-pc
 (以下を追加)
 libnet0
 libsablot0
自動で取得できないパッケージはあらかじめ pkgs ディレクトリにコピーします。

以下は、前回Debian lenny用リポジトリから取得したパッケージです
 $ cp /var/cache/apt/archives/libsablot0_1.0.3-1+b1_armel.deb pkgs
 $ cp /var/cache/apt/archives/libnet0_1.0.2a-7_armel.deb pkgs  
atmel-firmwareについてはpackages.vyatta.comから取得します。
 $ cd pkgs
 $ wget http://packages.vyatta.com/vyatta/pool/main/atmel-firmware_1.3-4_all.deb
 $ cd ..
livecd/mk.livecd.functions を編集します。レポジトリURLの変更と使用しない開発用レポジトリの削除を行います。
 diff --git a/livecd/mk.livecd.functions b/livecd/mk.livecd.functions
 index 248a4e2..1c92d19 100644
 --- a/livecd/mk.livecd.functions
 +++ b/livecd/mk.livecd.functions
 @@ -288,11 +288,10 @@ set_up_lh_config ()
    fi

    # set up the debian repo
 -  LB_MIRROR_BINARY="http://packages.vyatta.com/debian-$branch"
 -  LB_MIRROR_BOOTSTRAP="http://packages.vyatta.com/debian-$branch"
 +  LB_MIRROR_BINARY="ftp://ftp.plathome.co.jp/pub/debian"
 +  LB_MIRROR_BOOTSTRAP="ftp://ftp.plathome.co.jp/pub/debian"
    export LB_MIRROR_BINARY LB_MIRROR_BOOTSTRAP

 -  local dev_repo_root=http://packages.vyatta.com/vyatta-dev
    local repo_dir=unstable
    if ! eval "$VYATTA_DEV_BUILD"; then
      # not dev build => use testing.
 @@ -310,17 +309,11 @@ set_up_lh_config ()

      # set up chroot_sources
      cd ../config/chroot_sources
 -    ## "this" branch
 -    if [ ! -f vyatta.chroot ]; then
 -      echo "deb $dev_repo_root/$branch/$repo_dir $branch main" >vyatta.chroot
 -    fi
      ## "base" and "extra" branches for overlay
      for branch in "$VBUILD_BASE_BRANCH" "${VBUILD_EXTRA_BRANCHES[@]}"; do
        if [ -z "$branch" ] || [ -f "vyatta-$branch.chroot" ]; then
          continue
        fi
 -      echo "deb $dev_repo_root/$branch/$repo_dir $branch main" \
 -        >"vyatta-$branch.chroot"
        cp vyatta.chroot.gpg "vyatta-$branch.chroot.gpg"
      done
livecd/mk.livecd を編集してgrub関連部分の削除を行います。また生成されるイメージはbinary-hybrid.isoではなくbinary.isoのため該当部分を修正します。
 diff --git a/livecd/mk.livecd b/livecd/mk.livecd
 index dc2795e..6187fa9 100755
 --- a/livecd/mk.livecd
 +++ b/livecd/mk.livecd
 @@ -99,9 +99,6 @@ cp -f config/chroot_apt/preferences chroot/etc/apt
  # but that's even uglier.
  echo 'do_initrd = Yes' >chroot/etc/kernel-img.conf

 -echo 'I: creating default grub config'
 -create_default_grub_config
 -
  # build the XenSource partition image
  if eval "$create_xensourcevm"; then
    vyatta-xensource-partition-image || exit 1
 @@ -114,8 +111,6 @@ if ! lh binary ; then
    exit 1
  fi

 -# new image name (hybrid image)
 -mv binary-hybrid.iso binary.iso
  ln -nsf binary.iso livecd-"$BUILDID".iso

  echo I: Done
Linuxカーネルを指定します。
 $ echo "linux-image-3.0.32-1-obsax3-vyatta" > livecd/config.vyatta/chroot_local-packageslists/vyatta-kernel.obsax3-vyatta
Vyattaのデフォルトのシリアルの速度は9600bpsです。OpenBlocks AX3のブートローダのデフォルトは115200bpsなので115200に変更します。変更箇所はシステムのデフォルト値とVyattaの設定ファイルの二ヶ所です。
livecd/config.vyatta/chroot_local-hooks/05-event_tty:

 $ sed -i -e 's/9600/115200/' livecd/config.vyatta/chroot_local-hooks/05-event_tty


livecd/templates/community/config.boot.default:

 diff --git a/livecd/templates/community/config.boot.default b/livecd/templates/community/config.boot.default
 index 1fb6e3c..a7c043d 100644
 --- a/livecd/templates/community/config.boot.default
 +++ b/livecd/templates/community/config.boot.default
 @@ -31,7 +31,7 @@ system {
      }
      console {
          device ttyS0 {
 -            speed 9600
 +            speed 115200
          }
      }
      config-management {
OpenBlocks AX3に附属しているpshd, runledと起動スクリプトをコピーします。
 $ mkdir -p livecd/config.vyatta/chroot_local-includes/usr/sbin
 $ cp -p /usr/sbin/pshd livecd/config.vyatta/chroot_local-includes/usr/sbin
 $ cp -p /usr/sbin/runled livecd/config.vyatta/chroot_local-includes/usr/sbin
 $ mkdir -p livecd/config.vyatta/chroot_local-includes/etc/init.d
 $ cp -p /etc/init.d/pshd livecd/config.vyatta/chroot_local-includes/etc/init.d
 $ cp -p /etc/init.d/runled livecd/config.vyatta/chroot_local-includes/etc/init.d
続いてルートファイルシステム生成中に実行される4つのスクリプトを追加します。
livecd/config.vyatta/chroot_local-hooks/90-update-initramfs:
(initramfsの生成)

    #! /bin/sh
    update-initramfs -c -k 3.0.32-1-obsax3-vyatta


livecd/config.vyatta/chroot_local-hooks/91-obsax3:
(pshd, runledの起動)

    #!/bin/sh
    update-rc.d pshd start 01 2 . stop 01 0 6 .
    update-rc.d runled start 01 2 . stop 01 0 6 .


livecd/config.vyatta/chroot_local-hooks/92-disable-grub:
(install system実行時のgrub installを抑制)

    #!/bin/sh
    sed -e 's/^\(install_grub\)$/#\1/' -i /opt/vyatta/sbin/install-system


livecd/config.vyatta/chroot_local-hooks/93-inittab:
(inittabから不要エントリを削除)

    #!/bin/sh
    sed -e 's/^\([123456]:.*\)/#\1/' -i /etc/inittab

ISOイメージ生成中にuImageを生成するために以下のスクリプトを追加します。
livecd/config.vyatta/binary_local-hooks/90-uimage:

    #!/bin/sh
    gzip -9 < binary/live/vmlinuz-3.0.32-1-obsax3-vyatta > binary/live/vmlinuz-3.0.32-1-obsax3-vyatta.gz
    mkimage -n "Vyatta Linux 3.0.32" -A arm -O linux -T multi -C gzip -a 0x8000 -e 0x8000 -d binary/live/vmlinuz-3.0.32-1-obsax3-vyatta.gz:binary/live/initrd.img 3.0.32-1-obsax3-vyatta binary/uImage
    rm -f binary/live/vmlinuz-3.0.32-1-obsax3-vyatta.gz
これらに実行フラグを立てます。
 $ chmod +x livecd/config.vyatta/chroot_local-hooks/9?-*
 $ chmod +x livecd/config.vyatta/binary_local-hooks/90-uimage
configureを実行します。
 $ export PATH=/sbin:/usr/sbin:$PATH
 $ autoreconf -i
 $ ./configure --with-kernel-flavor=obsax3-vyatta --with-devbuild=false
生成された livecd/mk.livecd.conf を編集します。
 (LB_APTをaptitudeからapt-getに変更。debugに効果あり)
 declare -x LB_APT="apt-get"
 (以下の行は不要なので削除)
 declare -x LB_BOOTLOADER="syslinux"
最後にisoイメージの生成を行います。一般ユーザで作業すると途中chrootのあたりでエラーになるためrootで行います。
パッケージのダウンロード等も行われるので多少時間を要します。
 $ su
 # make iso
     .
     .
 P: Deconfiguring file /etc/apt/apt.conf
 P: Deconfiguring file /usr/sbin/policy-rc.d
 P: Begin unmounting /sys...
 P: Deconfiguring file /usr/sbin/initctl
 P: Begin unmounting /selinux...
 P: Begin unmounting /proc...
 P: Begin unmounting /dev/pts...
 P: Begin unmounting filesystems...
 I: Done

 # ls -l livecd/binary.iso
 -rw-r--r-- 1 root root 196575232 Aug 30 20:41 livecd/binary.iso


◆OpenBlocks AX3でVyattaをlive起動

vfatでフォーマットされたUSBメモリを使ってvyattaを起動します。
binary.isoを中身をそのままUSBメモリにコピーします。
 $ cd ~build_iso
 $ su
 # mkdir /tmp/mnt2
 # mount livecd/binary.iso /tmp/mnt2 -o loop
 # mount /dev/sdb1 /mnt
 # rsync -a /tmp/mnt2/ /mnt
 # ls -l /mnt
 total 6976
 drwxr-xr-x 3 root root   16384 Aug 30 20:40 doc
 drwxr-xr-x 3 root root   16384 Aug 30 20:40 isolinux
 drwxr-xr-x 2 root root   16384 Aug 30 20:40 live
 -r-xr-xr-x 1 root root    3575 Aug 30 20:40 md5sum.txt
 -r-xr-xr-x 1 root root 7077423 Aug 30 20:40 uImage
 # umount /mnt
 # umount /tmp/mnt2
OpenBlocks AX3を再起動して適当なキーを押しブートローダで停止させます。
 # reboot
   .
   .
   .
 MMC:   MRVL_MMC: 0
 Net:   egiga0, egiga1
 Hit any key to stop autoboot:  0
 openblocks>
USBの初期化をします。
 openblocks> usb start
 (Re)start USB...
 USB:   Active port:     0
 Register 10011 NbrPorts 1
 USB EHCI 1.00
 scanning bus for devices... 2 USB Device(s) found
 Waiting for storage device(s) to settle before scanning...
        scanning bus for storage devices... 1 Storage Device(s) found
FATファイルシステムのコンテンツを確認します。
 openblocks> fatls usb 0:1
 0/32 blocks
             .disk/
             doc/
             isolinux/
             live/
      3575   md5sum.txt
   7077423   uimage
 0/32 blocks
 0/32 blocks
 0/32 blocks

 2 file(s), 4 dir(s)
uimageが確認できたら、FATファイルシステムからカーネルイメージをロードします。
 openblocks> fatload usb 0:1 0x20000000 uImage
 reading uImage
 0/32 blocks
 13760/13792 blocks
 0/31 blocks

 7077423 bytes read
ブートパラメタを設定してブートします。
 openblocks> setenv bootargs boot=live union=unionfs console=ttyS0,115200
 openblocks> bootm 0x20000000
USBメモリからのlive起動なので起動完了まで時間がかかります。今回の環境では2分30秒を要しました。
起動完了するとログインプロンプトがでるのでID:vyatta, Password:vyattaでloginします。
 Welcome to Vyatta - vyatta ttyS0

 vyatta login: vyatta
 Password:
 Linux vyatta 3.0.32-1-obsax3-vyatta #2 SMP Thu Aug 30 00:19:15 JST 2012 armv7l
 Welcome to Vyatta.
 This system is open-source software. The exact distribution terms for
 each module comprising the full system are described in the individual
 files in /usr/share/doc/*/copyright.
 vyatta@vyatta:~$
この状態でVyattaの機能は使える状態になっています。


◆SSDにVyattaをインストール

USBメモリからlive起動した状態だとconfigのセーブなどが行えない状態なので内蔵のSSDにVyattaをインストールします。
本来はVyattaのinstall systemの中でパーティショニングやファイルシステムの構築なども行えますが、今回は既存のファイルシステムを一部残して起きたかったのでパーティショニングはあらかじめオリジナルのDebianで行っておきます。

Vyattaを一度終了してDebianをRAMディスクモードで起動します。
 vyatta@vyatta:~$ reboot
Debianが起動したら、fdiskを実行します。
詳細は省略しますが、最終的に以下のようなパーティショニングを行いました。
 # fdisk -l /dev/sda

 - snip -

 Disk /dev/sda: 32 GB, 32012789760 bytes
 255 heads, 63 sectors/track, 3892 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

    Device Boot      Start         End      Blocks   Id  System
 /dev/sda1               1          20      160618   83  Linux
 /dev/sda2              21        1350    10675192   83  Linux
 /dev/sda3            1351        3892    20410582   83  Linux
sda1はVyattaのLinuxカーネル保存用の領域です。OpenBlocks AX3のブートローダu-bootでは、大きいパーティションからのext2loadを行うとエラーとなるためブート専用に小さめの領域を確保しました。
sda2はVyattaの/用の領域です。10GBもあれば十分です。
sda3は既存のDebian環境用の領域です。

Vyatta用bootの領域をext2でフォーマットし、Linuxカーネルイメージをコピーしておきます。
 # mkfs.ext2 /dev/sda1

 # mount /dev/sda1 /mnt
 # mount /dev/sdb1 /mnt2
 # cp -p /mnt2/uImage /mnt
 # ls -l /mnt
 Total 6951
 drwx------ 2 root root   12288 Sep  4 16:23 lost+found
 -rwxr-xr-x 1 root root 7076480 Aug 30 23:00 uImage
rebootし、u-bootで停止し今度はsda1からのuImageを使用してUSB LIVE起動します。
 # reboot
 - snip -

 openblocks> ide reset          

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

 openblocks> ext2ls ide 0:1
 <DIR>       1024 .
 <DIR>       1024 ..
 <DIR>      12288 lost+found
          7076480 uImage
 openblocks> ext2load ide 0:1 0x20000000 uImage
 Loading file "uImage" from ide device 0:1 (hda1)
 7076480 bytes read
 openblocks> setenv bootargs boot=live union=unionfs console=ttyS0,115200
 openblocks> bootm 0x20000000
起動したらvyatta/vyattaでログイン後 install systemを実行します。
Partitionの設定はSkipしてシステムはsda2にインストールします。
 vyatta@vyatta:~$ install system
 Welcome to the Vyatta install program.  This script
 will walk you through the process of installing the
 Vyatta image to a local hard drive.

 Would you like to continue? (Yes/No) [Yes]:
 Probing drives: OK
 Looking for pre-existing RAID groups...none found.
 You have two disk drives:
         sda     32017 MB
         sdb     1006 MB
 Would you like to configure RAID-1 mirroring on them? (Yes/No) [Yes]:No
 Ok.  Not configuring RAID-1.
 The Vyatta image will require a minimum 1000MB root.
 Would you like me to try to partition a drive automatically
 or would you rather partition it manually with parted?  If
 you have already setup your partitions, you may skip this step.

 Partition (Auto/Union/Parted/Skip) [Auto]: Skip

 The Vyatta install needs a minimum 1000MB root
 with partiton type 83 (Linux).



 Looking for appropriate partitions: OK
 I found the following partitions suitable for the Vyatta image:
 Partition       Size
  sda2           10939MB
  sda3           20908MB


 Which partition should I install the root on? [sda2]:

 Creating filesystem on /dev/sda2: OK
 Mounting /dev/sda2
 Copying system files to /dev/sda2:
  97% [=================================================> ] OK
 I found the following configuration files
 /opt/vyatta/etc/config/config.boot
 Which one should I copy to sda? [/opt/vyatta/etc/config/config.boot]:

 Enter password for administrator account
 Enter vyatta password:
 Retype vyatta password:
 /opt/vyatta/sbin/install-system: line 1428: /usr/sbin/dmidecode: No such file or directory
 /opt/vyatta/sbin/install-system: line 1429: /usr/sbin/dmidecode: No such file or directory
 Done!
 vyatta@vyatta:~$
sda2へのVyattaシステムのインストールが終わりました。(「dmidecode: No such file or directory」は無視してかまいません」)


◆OpenBlocks AX3のSSDからVyattaを起動

rebootしてVyattaが起動できることを確認します。
 vyatta@vyatta:~$ reboot
再びu-bootで停止し、SSD上のsda2をrootとしてVyattaを起動します。
 openblocks> ide reset          
 openblocks> ext2load ide 0:1 0x20000000 uImage
 openblocks> setenv bootargs root=/dev/sda2 console=ttyS0,115200
 openblocks> bootm 0x20000000
loginプロンプトが出てくれば無事完了です。
 Welcome to Vyatta - vyatta ttyS0

 vyatta login:
再びrebootして、u-bootで起動時に自動的にVyattaが起動するように設定します。
 openblocks> setenv bootcmd "ide reset;ext2load ide 0:1 0x20000000 uImage;setenv bootargs root=/dev/sda2 console=ttyS0,115200;bootm 0x20000000"
 openblocks> saveenv
 openblocks> reset    (再起動)
ちなみに出荷時の状態に戻すにはu-bootで以下のように設定します。
 openblocks> setenv bootcmd "echo;echo Run Boot Selection Script;echo;run _phase_1"
 openblocks> saveenv
または、次のコマンドで出荷時の状態に戻すことができます。
 openblocks> run clr_env


◆Vyattaの基本動作確認(アドレス設定、ユーザ管理、ssh接続等)

Vyattaで基本的なインターフェイスの設定等を行います。
 vyatta@vyatta$ configure
 [edit]
 vyatta@vyatta#
eth0のアドレスはDHCPで取得するようにします。
eth1にはstaticアドレスを設定します。vyattaはcommitコマンドにより設定が有効になります。
 vyatta@vyatta# set interfaces ethernet eth0 address dhcp
 vyatta@vyatta# set interfaces ethernet eth1 address 192.168.200.1/24
 vyatta@vyatta# commit
configureモードを抜けてshow interfacesでinterfaceの状態を確認します。
 vyatta@vyatta# exit
 Warning: configuration changes have not been saved.
 exit
 vyatta@vyatta:~$ show interfaces
 Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
 Interface        IP Address                        S/L  Description
 ---------        ----------                        ---  -----------
 eth0             192.168.111.227/24                u/u
 eth1             192.168.200.1/24                  u/u
 lo               127.0.0.1/8                       u/u
                  ::1/128
pingコマンドを確認します。
 vyatta@vyatta:~$ ping 192.168.111.1
 PING 192.168.111.1 (192.168.111.1) 56(84) bytes of data.
 64 bytes from 192.168.111.1: icmp_req=1 ttl=255 time=0.851 ms
 64 bytes from 192.168.111.1: icmp_req=2 ttl=255 time=0.308 ms
dateコマンドを確認します。
 vyatta@vyatta:~$ show date
 Tue Sep  4 08:05:56 GMT 2012
TIMEZONEをJSTに変更します。
 vyatta@vyatta:~$ configure
 vyatta@vyatta# set system time-zone Asia/Tokyo
 [edit]
 vyatta@vyatta# commit
 [ system time-zone Asia/Tokyo ]
 Stopping enhanced syslogd: rsyslogd.
 Starting enhanced syslogd: rsyslogd.

 [edit]
 vyatta@vyatta# date
 Tue Sep  4 17:07:20 JST 2012
 [edit]
SSHデーモンを有効にして外からssh loginできるようにします。
 vyatta@vyatta# set service ssh
 [edit]
 vyatta@vyatta# commit
 [ service ssh ]
 Restarting OpenBSD Secure Shell server: sshd.

 [edit]
 vyatta@vyatta#
次にユーザhogeを作成しpublic keyを設定し、外からloginできるようにします。
 vyatta@vyatta# set system login user hoge
 vyatta@vyatta# set system login user hoge authentication plaintext-password hogehoge
 vyatta@vyatta# set system login user hoge authentication public-keys ono@hoge.local
 vyatta@vyatta# set system login user hoge authentication public-keys ono@hoge.local type ssh-rsa
 vyatta@vyatta# set system login user hoge authentication public-keys ono@hoge.local key AAAAB3NzaC1yc2....
 vyatta@vyatta# commit
ユーザhogeでloginできることを確認します。
 another-machine$ ssh hoge@192.168.111.217
作成したconfigをsaveし次回起動にその設定で立ち上がるようにします。
 vyatta@vyatta# save


◆まとめ

前回と今回の2回でVyatta CORE 6.4をOpenBlocks AX3にインストールしました。
VyattaをSSDから起動し基本的なインターフェイス設定等が動作することを確認しました。


作成したOpenBlocks AX3用のISOイメージは以下の場所からダウンロードできますのでご利用ください。

http://vyatta.yellowback.net
ftp://ftp.plathome.co.jp/pub/OBSAX3/obdnmag/vyatta64/

また、修正済みソース等はgithubに置いてますのでご参照ください。

https://github.com/yellowback/vyatta-build-iso
https://github.com/yellowback/vyatta-linux-image
https://github.com/yellowback/vyatta-biosdevname
https://github.com/yellowback/vyatta-cfg-system

今週末はOSC 2012 Hiroshimaです。

$
0
0
今週末は、OSC 2012 HiroshimaにてOpenBlocksの展示などを行っています。

概要は以下の通り。

---
日程:2012年10月20日(土) 10:00-18:00

会場広島国際学院大学 中野キャンパス 10号館 (JR山陽本線「中野東駅」下車、徒歩7分) 
   [アクセスマップ][キャンパスマップ][OpenStreetMap]

費用:無料

内容:オープンソースに関する最新情報の提供
   ・展示 - オープンソースコミュニティ、企業・団体による展示
   ・セミナー - オープンソースの最新情報を提供

主催:オープンソースカンファレンス実行委員会

共催広島国際学院大学

後援電子情報通信学会中国支部
   NPO法人 ひろしまオープンソフトウェアコンソーシアム

企画運営:株式会社びぎねっと --


「OpenBlocksによるマイクロサーバソリューション及びデベロッパネットワークのご紹介」として、OpenBlocks A Familyを中心としたデモを行います。
.testedで検証した周辺機器なども合わせて展示します。


明日は、実際に見て、触っていただくと共に、実際の開発の状況や、OBDNを中心としたデベロッパネットワークの状況、周辺機器評価や、Linuxを含め、様々なOSの開発状況についてなど、気軽にお声がけいただけたらと思います。

今週末より、広島、大分、会津、大阪、品川と、5週連続で週末のカンファレンス出展となります。

[.tested] docomo L-03D [AX3][A6]

$
0
0


docomo L-03Dは、LTEおよび3Gに対応したUSBモバイル通信アダプタです。
AX3およびA6での接続検証を行いました。


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


<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8
docomo L-03D USBモバイル通信アダプタ
IIJ-mio 高速モバイル/D SIM

1. 対応ドライバと事前準備
本デバイスは、ゼロインストール機能を持つため、起動時(もしくはUSBに接続を行った時)はCD-ROMデバイスとして認識されます。

usb 1-1: new high speed USB device number 2 using ehci_marvell
usb 1-1: New USB device found, idVendor=1004, idProduct=6327
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=4
usb 1-1: Product: docomo L03D
usb 1-1: Manufacturer: NTT DOCOMO, INC.
usb 1-1: SerialNumber: LGELTE10046327
scsi2 : usb-storage 1-1:1.0
usbcore: registered new interface driver uas
scsi 2:0:0:0: CD-ROM            LG       Autorun          2.00 PQ: 0 ANSI: 0
sr0: scsi-1 drive
cdrom: Uniform CD-ROM driver Revision: 3.20
sr 2:0:0:0: Attached scsi CD-ROM sr0
sd 0:0:0:0: Attached scsi generic sg0 type 0
sr 2:0:0:0: Attached scsi generic sg1 type 5

このモードを解除するには、以下の様に、/dev/sr0をejectする必要があります。
(ゼロインストール機能の解除のためのATコマンドは不明です。)

# eject /dev/sr0

また、L-03Dは、ejectしただけでは、usbserialモジュールが自動的にロードされないため、
lsusbコマンドにより、vendor IDおよび、product IDを調べておき、modprobeコマンドで以下の様にオプション指定してドライバの組み込みを行います。

# modprobe usbserial vendor=0x1004 product=0x6326

usb 1-1: new high speed USB device number 3 using ehci_marvell
usb 1-1: New USB device found, idVendor=1004, idProduct=6326
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 1-1: Product: docomo L03D
usb 1-1: Manufacturer: NTT DOCOMO, INC.
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbserial_generic 1-1:1.0: generic converter detected
usb 1-1: generic converter now attached to ttyUSB0
usbserial_generic 1-1:1.1: generic converter detected
usb 1-1: generic converter now attached to ttyUSB1
usbserial_generic 1-1:1.2: generic converter detected
usb 1-1: generic converter now attached to ttyUSB2
usbserial_generic 1-1:1.3: generic converter detected
usb 1-1: generic converter now attached to ttyUSB3
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core

デバイス名は、/dev/ttyUSB0~/dev/ttyUSB3が出てきますが、
ATコマンドでの確認や、pppdでの接続では、/dev/ttyUSB2を使用します。

2. 接続方法

接続は、他のモバイル通信アダプタと同様、pppconfigで設定を行います。
APNを割り付ける場合は、minicomで接続の後、ATコマンドで

AT+CGDCONT=n,"IP","xxx.xxx.xxx"
 ( n=cid / xxx.xxx.xxx=APN )

としてもいいのですが、今回は、APNの上書きをしたくなかったため、

AT+CGDCONT?

でAPNの割付を確認して使用しました。

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

Provider Namemio
Configure Nameservers (DNS)Dynamic
Authentication Method for testPAP
User NameID
Passwordパスワード
Speed460800
Pulse or ToneTone
Phone Number*99***<cid>#
Choose Modem Config MethodYES (Auto)
Select Modem PortManual
Manually Select Modem Port/dev/ttyUSB2

上記設定により、外部のサーバにアクセス出来ることを確認しました。

# ifconfig ppp0
ppp0      Link encap:Point-to-Point Protocol
          inet addr:10.197.182.25  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:188 (188.0 B)  TX bytes:152 (152.0 B)

ただし、このアダプタは、回線切断後に、ATHコマンドにより明示的に回線切断を行わないと、再発信が出来ないようで、上記の設定のままでは、2回目以降の発信が出来ません。
/etc/chatscript/(Provider Name)にて、ATDTコマンドの前に、ATHコマンドを埋め込むことにより、再発信が可能になります。

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

$
0
0


Planex GW-USSuper300は、802.11b/g/nに対応したUSB無線LANアダプタです。
Openblocks AX3およびA6での動作検証を行いました。


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

<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8

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

本デバイスは、RTL8191SUを使用しており、AX3/A6とも、標準のカーネルパッケージでは対応していません。
そのため、Realtek社のWebページより、ドライバのソースコードパッケージを入手し、ビルドして検証を行いました。

Software: Drivers & Utilities / RTL8191SU
RTL8191SUの、Linux Kernel 2.6.18~2.6.38 and Kernel 3.0.2 の項目にあるリンクからドライバパッケージをダウンロードします。
ダウンロードしたファイルは以下の手順で解凍してください。

# unzip RTL819xSU_usb_linux_v2.6.6.0.20120405.zip

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

# cd rtl8712_8188_8191_8192SU_usb_linux_v2.6.6.0.20120405
# cd driver
# tar xvzf rtl8712_8188_8191_8192SU_usb_linux_v2.6.6.0.20120405.tar.gz
# cd rtl8712_8188_8191_8192SU_usb_linux_v2.6.6.0.20120405

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

# diff -u Makefile.orig Makefile
--- Makefile.orig       2012-10-10 17:30:21.830000038 +0900
+++ Makefile    2012-10-10 17:31:01.710000037 +0900
@@ -11,7 +11,8 @@

 CONFIG_MP_INCLUDED              =       y

-CONFIG_PLATFORM_I386_PC         =       y
+CONFIG_PLATFORM_I386_PC         =       n
+CONFIG_PLATFORM_ARM_OBS         =       y
 CONFIG_PLATFORM_ANDROID_X86     =       n
 CONFIG_PLATFORM_ARM_S3C         =       n
 CONFIG_PLATFORM_ARM_PXA         =       n
@@ -85,6 +86,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_ARM_OBS), 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

次に、includeディレクトリに移動し、autoconf.hを編集します。

# diff -u autoconf.h.orig autoconf.h
--- autoconf.h.orig     2012-10-12 16:30:45.560000077 +0900
+++ autoconf.h  2012-10-12 16:30:59.050000077 +0900
@@ -33,7 +33,7 @@
 #undef  CONFIG_RTL8716


-#define CONFIG_IOCTL_CFG80211  1
+//#define CONFIG_IOCTL_CFG80211        1

 #ifdef CONFIG_IOCTL_CFG80211
 #define CONFIG_CFG80211_FORCE_COMPATIBLE_2_6_37_UNDER

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

# make install

ドライバは、
/lib/modules/2.6.31/kernel/drivers/net/wireless/
の下にコピーされ、depmod -aされます。
不要になり、削除する場合は、8192cu.koを削除し、depmod -aして下さい。

デバイスをUSBポートに差し込めば認識します。
dmesgは以下の通りです。

usb 1-1: new high speed USB device using ehci_marvell and address 2
usb 1-1: string descriptor 0 read error: -75
usb 1-1: configuration #1 chosen from 1 choice
==DriverVersion: v2.6.6.0.20120405==
register rtl8712_netdev_ops to netdev_ops

8712_usb_endpoint_descriptor(0):
bLength=7
bDescriptorType=5
bEndpointAddress=83
wMaxPacketSize=200
bInterval=0

8712_usb_endpoint_descriptor(1):
bLength=7
bDescriptorType=5
bEndpointAddress=4
wMaxPacketSize=200
bInterval=0

8712_usb_endpoint_descriptor(2):
bLength=7
bDescriptorType=5
bEndpointAddress=6
wMaxPacketSize=200
bInterval=0

8712_usb_endpoint_descriptor(3):
bLength=7
bDescriptorType=5
bEndpointAddress=d
wMaxPacketSize=200
bInterval=0

8712u : USB_SPEED_HIGH
nr_endpoint=4
Boot from EFUSE
Autoload OK!!
CustomerID = 0x   0
MAC Address from efuse= 0-22-cf-63-8-da
usbcore: registered new interface driver r871x_usb_drv

デバイスは、

/dev/wlan0

となります。

2. wpasupplicantパッケージの導入およびインタフェースの設定

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

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

上記のドライバにより、AX3、A6においてクライアントモードでの動作を確認しました。

ifconfigおよび、iwconfigでは、以下の様に表示されます。

# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr **:**:**:63:08:da
          inet addr:192.168.10.72  Bcast:192.168.10.255  Mask:255.255.255.0
          inet6 addr: 2409:10:320:0:222:cfff:fe63:8da/64 Scope:Global
          inet6 addr: fe80::222:cfff:fe63:8da/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:188 errors:0 dropped:5 overruns:0 frame:0
          TX packets:26 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

# iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"******"  Nickname:"rtl_wifi"
          Mode:Managed  Frequency:2.422 GHz  Access Point: **:**:**:C2:F4:00
          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=56/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モードでの検証について

APモードに関しては、上記のパッケージにはhostapdのパッケージは含まれていないため、検証を行っていません。
同メーカの製品では、GW-USFang300および、GW-USEco300に於いてrealtek社から提供されるhostapdパッケージの検証を行っています。

--
本製品は、USBポート直結ではない製品のため、取り回しはいいのですが、ドライバパッケージのビルドにおいて、デバッグメッセージの抑止が非常に面倒です。
個人的には、次の世代のチップセットである、8912CUやDUを使用した製品を使用したほうが使い勝手は良いと思います。


今週末はOSC 2012 Oita/Fall です。

$
0
0
今週末は、OSC 2012 Oita/Fall にてOpenBlocksの展示と、セミナーを行います。
開催概要概要は以下の通りです。

---
日程:2012年10月27日(土) 10:00-16:50

会場:ソフィアホール (大分市東春日町51-6 大分第2ソフィアプラザビル2F)
    [アクセスマップ]

費用:無料

内容:オープンソースに関する最新情報の提供
   ・展示 - オープンソースコミュニティ、企業・団体による展示
   ・セミナー - オープンソースの最新情報を提供

主催:オープンソースカンファレンス実行委員会、大分県オープンソースソフトウエア研究会

後援大分県

開催協力:株式会社びぎねっと

--

「OpenBlocksによるマイクロサーバソリューション及びデベロッパネットワークのご紹介」として、OpenBlocks A Familyを中心としたデモを行います。
.testedで検証した周辺機器なども合わせて展示します。
また、10:20からのセミナー枠をいただきました。

OpenBlocksにおけるSoCベースの汎用マイクロサーバ開発について


若干昔話もしつつ、今回ARM SoCでLinuxサーバを作った理由や、開発の概要などをお伝えしようと思います。

展示会場では、実際に見て、触っていただくと共に、実際の開発の状況や、OBDNを中心としたデベロッパネットワークの状況、周辺機器評価や、Linuxを含め、様々なOSの開発状況についてなど、気軽にお声がけいただけたらと思います。

では大分でお会いしましょう。

【.tested】OBDN tested ソフトウェア動作検証リスト [AX3][A6]

$
0
0
OBDNマガジン ソフトウェア動作テストとはOBDNスタッフにより、各ソフトウェアとOpenBlocksシリーズ各機種との動作テストが随時行われ、その結果がOBDNマガジンにて OBDN .tested記事・リストとして公開されます。

周辺機器の動作テストはこちらをご参照下さい。



※本コンテンツに掲載の各ソフトウェアは、当社が正式に動作を保証するものではなく、
お客様側の作業において発生するいかなるトラブル等に対しても当社のサポート・保証その他は適用されません。ご了承ください。


パッケージ名称バージョン機能関連パッケージ検証結果 Result
AX3A6
Asterisk1.8SIPサーバ

-
PacketFence3.5NAC

-
Open vSwitch(OpenFlow)1.6.1仮想スイッチ

-
Vyatta Core6.4ルータソフトウェア


-
OpenPNE3.8.0SNSサーバapache2, php5, MySQL
-
LXC(Linux Containers)0.7.5仮想化
-
Jubatus0.3.3機械学習ソフトウエア


-
Joruri CMS1.3.1CMS
-
Joruri Gw2.0.2グループウェア
-

OpenBlocks AX3でLXCによる仮想化を試してみる

$
0
0
◆はじめに

今回はOSレベルの仮想化環境を実行できるLXC(Linux Containers)を試してみます。
LXCはXenやKVMのような本格的な仮想化環境ではありませんが、導入がそれほど難しくなくオーバーヘッドが少ないという利点があります。
LXCでは複数の仮想化OSを実行することができますが、稼働するLinux Kernelは一つのみとなっています。このLXCをOpenBlocks AX3上で実際に動作させて性能等を確認してみます。

なお今回使用した機材は以下になります。

  • OpenBlocks AX3/4
  • SSD 30GB


◆LXC用にLinux Kernel再構築

LXCはLinux KernelのControl Group機能を使用しています。AX3のデフォルトのconfigだとこれが無効になっているので、Kernelのconfigを変更してbuildしなおします。

(なお、このカーネルコンフィグの変更は、2012/10/29公開の3.0.6-6以降を利用する場合は不要です。)
 $ cd /tmp
 $ wget ftp://ftp.plathome.co.jp/pub/OBSAX3/squeeze/3.0.6-5/source/linux-3.0.6-20120927-1.tar.gz
 $ su
 # cd /usr/src
 # tar zxvf /tmp/linux-3.0.6-20120927-1.tar.gz
 # cd linux-3.0.6
 # cp arch/arm/configs/obsax3_defconfig .config
 # make menuconfig
以下の箇所を変更します。
 --- arch/arm/configs/obsax3_defconfig  2012-09-27 14:07:46.000000000 +0900
 +++ .config                            2012-10-17 16:27:42.000000000 +0900
 @@ -79,18 +79,29 @@
  CONFIG_LOG_BUF_SHIFT=17
  CONFIG_CGROUPS=y
  # CONFIG_CGROUP_DEBUG is not set
 -# CONFIG_CGROUP_FREEZER is not set
 -# CONFIG_CGROUP_DEVICE is not set
 -# CONFIG_CPUSETS is not set
 -# CONFIG_CGROUP_CPUACCT is not set
 -# CONFIG_RESOURCE_COUNTERS is not set
 -# CONFIG_CGROUP_PERF is not set
 +CONFIG_CGROUP_FREEZER=y
 +CONFIG_CGROUP_DEVICE=y
 +CONFIG_CPUSETS=y
 +CONFIG_PROC_PID_CPUSET=y
 +CONFIG_CGROUP_CPUACCT=y
 +CONFIG_RESOURCE_COUNTERS=y
 +CONFIG_CGROUP_MEM_RES_CTLR=y
 +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y
 +CONFIG_CGROUP_MEM_RES_CTLR_SWAP_ENABLED=y
 +CONFIG_CGROUP_PERF=y
  CONFIG_CGROUP_SCHED=y
  CONFIG_FAIR_GROUP_SCHED=y
 -# CONFIG_RT_GROUP_SCHED is not set
 -# CONFIG_BLK_CGROUP is not set
 -# CONFIG_NAMESPACES is not set
 +CONFIG_RT_GROUP_SCHED=y
 +CONFIG_BLK_CGROUP=m
 +# CONFIG_DEBUG_BLK_CGROUP is not set
 +CONFIG_NAMESPACES=y
 +CONFIG_UTS_NS=y
 +CONFIG_IPC_NS=y
 +CONFIG_USER_NS=y
 +CONFIG_PID_NS=y
 +CONFIG_NET_NS=y
  CONFIG_SCHED_AUTOGROUP=y
 +CONFIG_MM_OWNER=y
  # CONFIG_SYSFS_DEPRECATED is not set
  # CONFIG_RELAY is not set
  CONFIG_BLK_DEV_INITRD=y
 @@ -174,11 +185,11 @@
  #
  CONFIG_IOSCHED_NOOP=y
  CONFIG_IOSCHED_DEADLINE=y
 -CONFIG_IOSCHED_CFQ=y
 -# CONFIG_DEFAULT_DEADLINE is not set
 -CONFIG_DEFAULT_CFQ=y
 +CONFIG_IOSCHED_CFQ=m
 +# CONFIG_CFQ_GROUP_IOSCHED is not set
 +CONFIG_DEFAULT_DEADLINE=y
  # CONFIG_DEFAULT_NOOP is not set
 -CONFIG_DEFAULT_IOSCHED="cfq"
 +CONFIG_DEFAULT_IOSCHED="deadline"
  # CONFIG_INLINE_SPIN_TRYLOCK is not set
  # CONFIG_INLINE_SPIN_TRYLOCK_BH is not set
  # CONFIG_INLINE_SPIN_LOCK is not set
 @@ -1063,6 +1074,7 @@
  #
  # Classification
  #
 +CONFIG_NET_CLS=y
  # CONFIG_NET_CLS_BASIC is not set
  # CONFIG_NET_CLS_TCINDEX is not set
  # CONFIG_NET_CLS_ROUTE4 is not set
 @@ -1071,7 +1083,7 @@
  # CONFIG_NET_CLS_RSVP is not set
  # CONFIG_NET_CLS_RSVP6 is not set
  # CONFIG_NET_CLS_FLOW is not set
 -# CONFIG_NET_CLS_CGROUP is not set
 +CONFIG_NET_CLS_CGROUP=y
  # CONFIG_NET_EMATCH is not set
  # CONFIG_NET_CLS_ACT is not set
  CONFIG_NET_SCH_FIFO=y
 @@ -1812,7 +1824,7 @@
  CONFIG_HW_CONSOLE=y
  CONFIG_VT_HW_CONSOLE_BINDING=y
  CONFIG_UNIX98_PTYS=y
 -# CONFIG_DEVPTS_MULTIPLE_INSTANCES is not set
 +CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
  CONFIG_LEGACY_PTYS=y
  CONFIG_LEGACY_PTY_COUNT=16
  # CONFIG_SERIAL_NONSTANDARD is not set

 # make zImage modules
 # make modules_install
uImageを作成します。
 # gzip -9 < linux-3.0.6/arch/arm/boot/zImage > zImage.gz
 # lzma -3 < ramdisk-squeeze.obsax3.img >ramdisk-squeeze.obsax3.img.lzma
 # mkimage -n "OBSAX3LXC 3.0.6-5" -A arm -O linux -T multi -C gzip -a 0x8000 -e 0x8000 -d zImage.gz:ramdisk-squeeze.obsax3.img.lzma uImage.initrd.obsax3
FlashROMに書き込みます。
 # flashcfg -y -f uImage.initrd.obsax3
Rebootして構築しなおしたLinux Kernelで起動します。
 # reboot


◆LXC導入

AX3のDebian Squeezeではaptでlxcパッケージの導入ができます。ただしパッケージでインストールされるlxcのバージョンは0.7.2となります。
aptでインストールされるものはlxc-startで問題が生じたりするので、今回はソースからビルドすることにします。使うバージョンはリリース版では最新となるlxc 0.7.5です。

まずはlxcのビルドに必要なパッケージをインストールします。
 $ su
 # apt-get install libcap-dev libcap2-bin bridge-utils live-config debootstrap
 --
2013/03/13追記 パッケージ追加における不具合の報告と対処方法について
live-configパッケージの追加により、/etc/rcS.d/S01openblocks-setupが、/etc/rcS.d/S02openblocks-setupにリネームされるのですが、openblocksのディスク共有モードの仕組みにより、本スクリプトが2重起動する不具合を確認しています。
お手数ですが、対策として以下の処置を行ってください。
・/etc/rcS.d/S02openblocks-setupを削除してください。 
・/etc/rcS.d/S01live-configをS02live-configにリネームしてください。

http://lxc.sourceforge.net のDownloadリンクをたどりlxc-0.7.5.tar.gzをダウンロードし展開します。

 $ tar zxvf lxc-0.7.5.tar.gz
 $ cd lxc-0.7.5
 $ ./configure
 $ make
 $ su
 # make install
make install で /usr/local 以下にインストールされます。/usr/local/binにPATHを通しておきます。
 $ PATH=$PATH:/usr/local/bin
lxc-checkconfigコマンドでKernelのconfigがlxcに適したものになっているかを確認します。
 $ lxc-checkconfig
 Kernel config /proc/config.gz not found, looking in other places...
 Found kernel config file /lib/modules/3.0.6/build/.config
 --- Namespaces ---
 Namespaces: enabled
 Utsname namespace: enabled
 Ipc namespace: enabled
 Pid namespace: enabled
 User namespace: enabled
 Network namespace: enabled
 Multiple /dev/pts instances: enabled

 --- Control groups ---
 Cgroup: enabled
 Cgroup namespace: required
 Cgroup device: enabled
 Cgroup sched: enabled
 Cgroup cpu account: enabled
 Cgroup memory controller: enabled
 Cgroup cpuset: enabled

 --- Misc ---
 Veth pair device: enabled
 Macvlan: enabled
 Vlan: enabled
 File capabilities: missing
 enabled

 Note : Before booting a new kernel, you can check its configuration
 usage : CONFIG=/path/to/config /usr/local/bin/lxc-checkconfig
Cgroup namespaceはCONFIG_CGROUP_NSのようですが、Linux Kernel 3.0以降では削除されているようなので無視します。
File capabilitiesもCONFIG_SECURITY_FILE_CAPABILITIESですが、同様に3.0では無視します。

/etc/fstabに以下を追加します。
 cgroup        /cgroup        cgroup        defaults    0    0 
mountでcgroupをマウントします。

 # mkdir -p /cgroup
 # mount -a
ゲストOSのイメージが置かれる場所を作成します。
 # mkdir -p /usr/local/var/lib/lxc
最後にネットワークの設定をします。今回はホストのネットワークインターフェイスeth0とゲストOSのネットワークインターフェイスeth0をブリッジbr0を用いて接続することにします。ちなみに他の設定方法もあります。

/etc/network/interfaces のeth0部分を削除して以下のように設定します。
 auto br0
 iface br0 inet dhcp
        bridge_ports eth0
これでリブートするとbr0にDHCPでIPアドレスが設定されます。
 # ifconfig br0
 br0       Link encap:Ethernet  HWaddr 00:0a:85:00:05:58
           inet addr:192.168.111.217  Bcast:192.168.111.255  Mask:255.255.255.0
           inet6 addr: fe80::20a:85ff:fe00:558/64 Scope:Link
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:638 errors:0 dropped:0 overruns:0 frame:0
           TX packets:140 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:0
           RX bytes:76158 (74.3 KiB)  TX bytes:24563 (23.9 KiB)
ここまでで準備は完了です。


◆LXCでゲストOSを作成

ゲストOSを作成します。ゲストOSの作成はlxc-createコマンドで行います。
今回はDebian Squeezeのイメージを作成します。
ネットワーク設定のためにデフォルトの設定ファイルを作成します。
 # vi lxc.config

 lxc.network.type=veth
 lxc.network.link=br0
 lxc.network.flags=up
デフォルトの設定ファイルを指定してDebianのゲストOSを作成します。-nオプションで識別用のIDを指定します。
 # lxc-create -n deb-1 -f lxc.config -t debian
debootstrapを用いてイメージが/usr/local/var/lib/lxc/deb-1/rootfs以下に生成されます。
初回はパッケージのダウンロードで多少時間を要しますが、生成されたものはキャッシュされるので2度目からは同じdebianの場合には高速に生成可能です。

このままだと起動時にネットワークインターフェイスが正しく認識されずDHCPでIPアドレスが取得できないという問題があります。ゲストの/etc/network/runが/dev/shm/networkのシンボリックリンクとなっていることの起因します。今回はゲストの/etc/network/runを通常のディレクトリとすることで対処します。
 # ls -l /usr/local/var/lib/lxc/deb-1/rootfs/etc/network/run
 lrwxrwxrwx 1 root root 16 Oct 17 19:24 /usr/local/var/lib/lxc/deb-1/rootfs/etc/network/run -> /dev/shm/network
 # rm /usr/local/var/lib/lxc/deb-1/rootfs/etc/network/run
 # mkdir /usr/local/var/lib/lxc/deb-1/rootfs/etc/network/run
lxc-startコマンドでゲストOSの起動ができます。
 # lxc-start -n deb-1
 INIT: version 2.88 booting
 Using makefile-style concurrent boot in runlevel S.
 Cleaning up ifupdown....
 Setting up networking....
 Activating lvm and md swap...done.
 Checking file systems...fsck from util-linux-ng 2.17.2
 done.
 Mounting local filesystems...done.
 Activating swapfile swap...done.
 Cleaning up temporary files....
 Setting kernel variables ...done.
 Configuring network interfaces...Internet Systems Consortium DHCP Client 4.1.1-P1
 Copyright 2004-2010 Internet Systems Consortium.
 All rights reserved.
 For info, please visit https://www.isc.org/software/dhcp/

 Listening on LPF/eth0/6a:0d:f6:ca:50:14
 Sending on   LPF/eth0/6a:0d:f6:ca:50:14
 Sending on   Socket/fallback
 DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4
 DHCPOFFER from 192.168.111.22
 DHCPREQUEST on eth0 to 255.255.255.255 port 67
 DHCPACK from 192.168.111.22
 bound to 192.168.111.230 -- renewal in 122 seconds.
 done.
 Cleaning up temporary files....
 INIT: Entering runlevel: 3
 Using makefile-style concurrent boot in runlevel 3.
 Starting OpenBSD Secure Shell server: sshd.

 Debian GNU/Linux 6.0 deb-1 console

 deb-1 login:
lxc-startを-n以外のオプションなしで起動すると上記のようにloginプロンプトがでてloginできるようになります。rootのパスワードはデフォルトではrootになっています。lxc-startに-dオプションをつけて起動すると、コンソールとは切り離された状態でスタートします。

ゲストのeth0はホストのbr0につながりますがMACアドレスはランダムに決定されるようです。MACアドレスを固定したい場合は、
/usr/local/var/lib/lxc/dev-1/configに
 lxc.network.hwaddr=XX:XX:XX:XX:XX:XX
のように追加します。XX:XX:XX:XX:XX:XXの部分はMACアドレスを指定します。


◆LXCのパフォーマンス測定

ゲストのパフォーマンス測定を行います。測定にはUnixBenchとネットワークの性能測定のためにnuttcpを使います。

まずはホスト上で行います。
 host$ wget http://byte-unixbench.googlecode.com/files/UnixBench5.1.3.tgz
 host$ tar zxvf UnixBench5.1.3.tgz
 host$ cd UnixBench
 host$ make
 host$ ./Run
ホストからゲストのファイルシステムは見えるのでこれをコピーし実行します。
 host$ cp -pr ../UnixBench /usr/local/var/lib/lxc/deb-1/rootfs/tmp

 guest$ cd /tmp/UnixBench
 guest$ ./Run
結果を以下に示します。ゲスト値/ホスト値の比率も示します。
System Benchmarks Index Values          ホスト  ゲスト  比率(%)
Dhrystone 2 using register variables    274.3   274.2    99.9
Double-Precision Whetstone               11.7    11.7   100.0
Execl Throughput                        193.6   196.9   101.7
File Copy 1024 bufsize 2000 maxblocks   236.9   235.3    99.3
File Copy 256 bufsize 500 maxblocks     165.5   161.7    97.7
File Copy 4096 bufsize 8000 maxblocks   411.8   409.4    99.4
Pipe Throughput                         190.0   184.9    97.3
Pipe-based Context Switching            126.1   122.8    97.3
Process Creation                        188.2   183.8    97.6
Shell Scripts (1 concurrent)            480.5   471.2    98.0
Shell Scripts (8 concurrent)            617.4   601.9    97.4
System Call Overhead                    314.5   318.1   101.1
------------------------------------------------------------
System Benchmarks Index Score           200.5   198.4    98.9
1%程度のオーバーヘッドとなりました。

次にnuttcpでのネットワーク性能の測定を行います。
nuttcpはホスト、ゲストともにaptでインストールし、-Sオプションをつけてデーモンで走らせます。
 $ su
 # apt-get install nuttcp
 # exit
 $ nuttcp -S
Linuxを走らせたIntel PCからOpenblocks AX3のゲスト、ホストに向けてそれぞれnuttcpを実行します。
 (for ホスト)
 $ nuttcp -i1 -T10 192.168.111.217
  109.0000 MB /   1.01 sec =  901.4193 Mbps     0 retrans
  112.1875 MB /   1.00 sec =  941.4726 Mbps     0 retrans
  112.3125 MB /   1.00 sec =  941.6154 Mbps     0 retrans
  112.1875 MB /   1.00 sec =  941.5272 Mbps     0 retrans
  112.1875 MB /   1.00 sec =  941.1534 Mbps     0 retrans
  112.2500 MB /   1.00 sec =  941.4358 Mbps     0 retrans
  112.2500 MB /   1.00 sec =  941.6438 Mbps     0 retrans
  112.2500 MB /   1.00 sec =  941.5685 Mbps     0 retrans
  112.2500 MB /   1.00 sec =  941.6052 Mbps     0 retrans

 1118.6250 MB /  10.01 sec =  937.4715 Mbps 8 %TX 100 %RX 0 retrans 0.21 msRTT

 (for ゲスト veth使用)
 $ nuttcp -i1 -T10 192.168.111.230
   81.8750 MB /   1.02 sec =  675.0750 Mbps     0 retrans
   90.1875 MB /   1.00 sec =  756.7284 Mbps     0 retrans
   91.8750 MB /   1.00 sec =  770.9370 Mbps     0 retrans
   94.3125 MB /   1.00 sec =  791.0509 Mbps     0 retrans
   93.3750 MB /   1.00 sec =  783.4030 Mbps     0 retrans
   93.5625 MB /   1.00 sec =  784.8199 Mbps     0 retrans
   92.8125 MB /   1.00 sec =  778.8270 Mbps     0 retrans
   92.9375 MB /   1.00 sec =  778.7542 Mbps     0 retrans
   92.8125 MB /   1.00 sec =  778.9330 Mbps     0 retrans

  915.8125 MB /  10.00 sec =  767.8582 Mbps 5 %TX 98 %RX 0 retrans 0.23 msRTT

767.8582 / 937.4715 = 81.9%
となりゲストの性能はホストに比べ約20%落ちるという結果になりました。

次に仮想ネットワークインターフェイスの設定をvethではなくmacvlanを用いて実験を行いました。
ホストではbr0を使用せずにeth0に直接リンクします。
 lxc.network.type=macvlan
 lxc.network.link=eth0
 lxc.network.flags=up
結果は以下のようになりました。
 (for ゲスト macvlan使用)
 $ nuttcp -i1 -T10 192.168.111.230
   111.5000 MB /   1.01 sec =  923.4068 Mbps     0 retrans
   112.2500 MB /   1.00 sec =  941.4706 Mbps     0 retrans
   112.2500 MB /   1.00 sec =  941.8548 Mbps     0 retrans
   111.6250 MB /   1.00 sec =  936.3596 Mbps     0 retrans
   112.2500 MB /   1.00 sec =  941.5365 Mbps     0 retrans
   112.2500 MB /   1.00 sec =  941.6147 Mbps     0 retrans
   112.2500 MB /   1.00 sec =  941.6599 Mbps     0 retrans
   112.2500 MB /   1.00 sec =  941.5713 Mbps     0 retrans
   112.2500 MB /   1.00 sec =  941.6184 Mbps     0 retrans

  1120.7500 MB /  10.01 sec =  939.2494 Mbps 7 %TX 100 %RX 0 retrans 0.20 msRTT
macvlanを使う方法ではホストとゲストでほぼ同一の値がでていてネットワーク性能の劣化がないという結果になりました。


◆ゲストの台数を増やしてみる実験

ゲストを何台まで起動できるか確認してみます。
lxc-cloneを用いると既存のゲストをコピーできるようですが、lxc-cloneが正しく動作できませんでした。
そこで、lxc-createを用いてゲストを作成してゲストを起動することを繰り返してみます。

 1. lxc-createでゲストを作成
 2. lxc-start -dで起動
 3. sleep 20秒

ということを繰り返して確認しました。
なおディスクアクセスが競合して遅くなってしまうのを防ぐため3でsleepをいれています。

結果は、30台ゲストを作成できました。

SSDの容量の問題(Disk Full)で31台目のゲストが起動できなくなってしまいました。
Disk Full直前でのload average, memory使用量はそれぞれ以下のようになっています。
 load average: 0.00, 0.01, 0.05
 Mem:   1029628k total,   922264k used,   107364k free,   261984k buffers
SSDの容量が許せばまだいけそうな感じです。


◆まとめ

簡単な仮想化環境を構築できるLXCを試してみました。
UNIX Benchではほとんど性能の劣化はありませんでした。ネットワークの性能はmacvlanを使うことで性能の劣化はほぼなくすことができました。

今回作成したバイナリは以下よりダウンロード出来ます。

ftp://ftp.plathome.co.jp/pub/OBSAX3/obdnmag/lxc075/uImage.initrd.obsax3
ftp://ftp.plathome.co.jp/pub/OBSAX3/obdnmag/lxc075/dot.config


◆既知の問題

udev をインストールしようとすると、エラーが発生す正常終了しません。lxc-startの実行前に、次の設定追加が必要です。

# vi /usr/local/var/lib/lxc/deb-1/config

#ppp
lxc.cgroup.devices.allow = c 108:0 rwm
#fuse
lxc.cgroup.devices.allow = c 10:229 rwm
#loop0
lxc.cgroup.devices.allow = b 7:0 rwm
#tun
lxc.cgroup.devices.allow = c 10:200 rwm

ただし、この設定をしてudevのインストールが完了しても、lxc-startの後にコンソールが表示されなくなる現象を確認しています。対策は調査中。sshは可能です。





OSC 2012 aizu

$
0
0

本日は、会津若松市、会津大学にてOSC 2012 aizuを開催しています。

  

当社もブース出展を行っています。

開催概要は以下の通りです。

---

日程:2012年11月3日(土) 10:00~17:00(※9:00~開場時間までの待機場所あり)
会場会津大学講義棟 (大講義室・M8・M9教室)  [キャンパスマップ]
    [アクセス詳細](会津若松駅からバス・タクシーで約10分)
    [GoogleMap] [OpenStreetMap]

費用:無料

内容:オープンソースに関する最新情報の提供
   ・展示 - オープンソースコミュニティ、企業・団体による展示
   ・セミナー - オープンソースの最新情報を提供

主催:オープンソースカンファレンス実行委員会
   Open Source Conference 2012 Aizu 実行委員会

後援公立大学法人会津大学

協力会津若松市

協賛:会津若松市役所電脳倶楽部

企画運営:株式会社びぎねっと

--

「OpenBlocksによるマイクロサーバソリューション及びデベロッパネットワークのご紹介」として、OpenBlocks A Familyを中心としたデモを行います。
.testedで検証した周辺機器なども合わせて展示します。

展示会場では、実際に見て、触っていただくと共に、実際の開発の状況や、OBDNを中心としたデベロッパネットワークの状況、周辺機器評価や、Linuxを含め、様々なOSの開発状況についてなど、気軽にお声がけいただけたらと思います。

では会津大学でお会いしましょう。

今週末はKOF2012 「関西オープンソース2012 関西コミュニティ大決戦」に出展します。

$
0
0

今週末、11/9(金)、11/10(土)は、KOF 2012に出展します。

ホーム

開催概要は、以下の通りです。

---

関西オープンフォーラム2012
関西オープンフォーラムは、「オープンソースならびに、コミュニティが元気に交流できる場を、関西でも作ろう」という目的のもとに集った有志により、2002年に活動を開始いたしました。
KOFは、昨年2011年まで「関西オープンソース+フリーウェア」「関西オープンソース、関西コミュニティ大決戦」と名称を変えながら毎年開催されてお り、このイベントは関西でオープンソースソフトウェアに対して熱心な人達が運営するコミュニティ、オープンソースソフトウェアに関わりながらビジネスを展 開する人達等、様々な人達の参加と協力で成り立っています。
会 期:
2012年11月9日(金)~11月10日(土)
11/09 13:00-18:00
11/10 10:00-18:00
会 場:
大阪南港ATC ITM棟 【道順詳細】
〒559-0034 大阪府大阪市住之江区南港北2丁目1-10
入場料:
無料(懇親会は実費)
--

「OpenBlocksによるマイクロサーバソリューション及びデベロッパネットワークのご紹介」として、OpenBlocks A Familyを中心としたデモを行います。
.testedで検証した周辺機器なども合わせて展示します。

展示会場では、実際に見て、触っていただくと共に、実際の開発の状況や、OBDNを中心としたデベロッパネットワークの状況、周辺機器評価や、Linuxを含め、様々なOSの開発状況についてなど、気軽にお声がけいただけたらと思います。

個人的には、土曜に15分のステージを行いますが、半分ネタですので笑って流してください。

では、大阪でお会いしましょう。

JubatusをOpenBlocks AX3へインストールしてみる

$
0
0

はじめに

こんにちは、Preferred Infrastructureの柏原です。私も開発に参加しているOSSの機械学習フレームワークであるJubatusをOpenBlocks AX3へインストールする方法を紹介します。

Jubatusは機械学習のフレームワークです。機能としては分類、レコメンド、回帰、グラフ分析などがあり、それらの機能に対して複数のアルゴリ ズムを実装しているものもあります。特徵としては、オンライン学習に特化しており、さらに分散実行によってスケールアウトするため、機械学習の訓練と予測 を短時間に繰り返し的に(イテレーティブに、そしてバッチではなく)実行可能となっています。ただし、実行時間は入力データの種類、長さにも依存してしま うため、一定時間内に処理が完了することを保証しているわけではありません。

Jubatusはサーバとして動作させ、クライアントプログラムからサーバへ問い合わせる形で利用します。また、サーバを分散環境で動作させることができ、学習結果のモデルをMIXという処理で共有できることを大きな特徴としています。

Jubatusはこれまで通常のデータセンターのようにIAサーバ上でしか稼働させていませんでしたが、地理的に分散した情報源が存在する環境で や、もしくは通信ボトルネックを考慮してOpenBlocksのような省電力サーバを末端に配置して処理するようなEdge-HeavyData(*1) というアーキテクチャへの適用も視野に入れています。例えば、OpenBlocksの活用例にもあるような監視カメラや防災センサーの情報を OpenBlocksで処理し、リアルタイム(バッチと比較して、より短い時間という意味です)に異常検知やシステム監視などを実現できるのではないかと 思っています。

OpenBlocks AX3はARMプロセッサを搭載していますが、JubatusのインストールにおいてJubatus本体に特別な修正は必要ありません。依存ライブラリの インストール時には、修正が必要なものもあります。インストール先はPREFIX=/usr/localと仮定して解説します。基本的にはx86系のLinuxへインストールする手順と大きな差はありません。

(*1)

 

インストールに必要なライブラリ

Jubatusインストール前に、まず以下4つのライブラリをインストールします。
  • msgpack
    • シリアライズフォーマットMessagePackのC/C++ライブラリです。Jubatusの提供するRPCで利用しています。また、pficommon経由で依存しています
  • libevent
  • glog 0.3.2
  • pficommon
    • C++用の拡張ライブラリです。Jubatusで利用しています
上2つのmsgpackとlibeventは以下のコマンドでパッケージからインストールできます。

$ sudo aptitude install -y libmsgpack-dev libevent-dev

glog、pficommonとJubatus本体はソースコードを取得してからのインストールになります。あらかじめgitをパッケージからインストールしておいてください。


オプショナルなライブラリ

必須ではありませんが、Jubatusから利用できるライブラリに以下のものがあります。例えば自然言語処理といった実行目的に応じて活用することになると思います。今回はこれらのインストール方法の解説はありません。
  • re2
    • 正規表現ライブラリです。文字列入力に対して、正規表現でマッチした文字列の置換ができるようになります。Jubatusを初めて試す場合にはインストールの必要はないでしょう
    • https://code.google.com/p/re2/
  • mecab
    • 形態素解析エンジンです。日本語の自然言語処理を実行したいときにインストールすると良いでしょう。Jubatusではmecab 0.99以降を利用するため、現時点ではパッケージからではなくソースコードからインストールする必要があります
    • https://code.google.com/p/mecab/
  • ux-trie
  • zookeeper c client-library
    • Jubatusを分散構成で実行するためには、ZooKeeperのCクライアントライブラリを含めてビルドする必要があります。 ZooKeeper 3.4.4(stable)では、インラインアセンブラを使用していた箇所をARM向けにコードを修正すればJubatusのビルドができることを確認し ています。動作確認は今後実施していく予定です
    • http://zookeeper.apache.org


インストール

glog 0.3.2

glog 0.3.2のソースコードをダウンロードし、ビルドしてインストールするだけとなります。 http://code.google.com/p/google-glog/

$ wget http://google-glog.googlecode.com/files/glog-0.3.2.tar.gz
$ tar -xvf glog-0.3.2.tar.gz
$ cd glog-0.3.2
$ ./configure
$ make
$ sudo make install

pficommon

gitからソースコードを取得します。ビルドが確認できている 10b1ba95628b0078984d12300f9a9deb94470952 を利用しましょう。

$ git clone https://github.com/pfi/pficommon.git

$ cd pficommon
$ git checkout 10b1ba95628b0078984d12300f9a9deb94470952

pficommonでは一部、ARM非対応のコードがあるため以下の箇所をコメントアウトします。

diff --git a/src/system/barrier.h b/src/system/barrier.h
index 8d5a783..51fe561 100644
--- a/src/system/barrier.h
+++ b/src/system/barrier.h
@@ -58,7 +58,7 @@

#else

-#error "your cpu architecture is not support memory barrier"
+//#error "your cpu architecture is not support memory barrier"

#endif

修正後に、configureをしてビルド・インストールという手順になります。

$ ./waf configure
Setting top to : /home/kashihara/repos/pficommon
Setting out to : /home/kashihara/repos/pficommon/build
Checking for 'g++' (c++ compiler) : /usr/bin/g++
Unpacking gtest : yes
Checking for library pthread : yes
Checking for library pthread : yes
Checking for header msgpack.hpp : yes
Checking for header fcgiapp.h : not found
Checking for header stdint.h : yes
Checking for header unordered_map : not found
Checking for header tr1/unordered_map : yes
Checking for header ext/hash_map : yes
Checking for header unordered_set : not found
Checking for header tr1/unordered_set : yes
Checking for header ext/hash_set : yes
Checking for 'mysql_config' : not found
Checking for 'Magick++-config' : not found

pficommon has been configured as follows:

[Modules]
FCGI module: no
Database module: yes
have MySQL lib: no
have PostgreSQL lib: no
MessagePack RPC module: yes

[Visualization]
Magick++ impl: no

[Build information]
Package: pficommon-1.3.1
build (compile on): arm-linux
host endian: little
Compiler: g++
Compiler version: 4.4.5
CXXFLAGS: -O2 -Wall -g -pipe -D_REENTRANT -fno-omit-frame-pointer D_FORTIFY_SOURCE=1


$ ./waf
$ sudo ./waf install

>wafの使い方

/usr/local以外に、例えば自分のホームディレクトリをprefixに指定してインストールしたい場合もあると思います。そのような場合は、以下のように環境変数を加えて./waf configureを実行します。

$ export DEV_HOME=$HOME/usr
$ PKG_CONFIG_PAHT="$DEV_HOME/lib/pkgconfig" \
CXXFLAGS="-I$DEV_HOME/include" \
LINKFLAGS="-L$DEV_HOME/lib" \
./waf configure --prefix=$DEV_HOME

Jubatusのインストール

Jubatus 0.3.3 (2012年10月29日リリース)もpficommonと同様にgitからソースコードを取得します。以下のコマンドで、ソースの取得から最低限の構成でインストールが可能です。

$ git clone https://github.com/jubatus/jubatus.git
$ cd jubatus
$ git checkout jubatus-0.3.3 -b jubatus-0.3.3
$ ./waf configure --disable-re2
Setting top to : /home/kashihara/repos/jubatus
Setting out to : /home/kashihara/repos/jubatus/build
Checking for 'g++' (c++ compiler) : ok
Unpacking gtest : yes
Checking for library pthread : yes
Checking for library msgpack : yes
Checking for library dl : yes
Checking for program pkg-config : /usr/bin/pkg-config
Checking for 'libglog' : yes
Checking for 'libevent' : not found
Checking for library event : yes
Checking for 'pficommon' : yes
Checking for header pficommon/network/mprpc.h : yes
Checking for header unistd.h : yes
Checking for header sys/types.h : yes
Checking for header sys/wait.h : yes
Checking for header sys/stat.h : yes
Checking for header cxxabi.h : yes
Checking for header sys/socket.h net/if.h : yes
Checking for header sys/ioctl.h : yes
Checking for header fcntl.h : yes
Checking for header netinet/in.h : yes
Checking for header arpa/inet.h : yes
Checking for header dlfcn.h : yes
Checking for header sys/socket.h net/if.h sys/ioctl.h : yes
Checking for header netinet/in.h arpa/inet.h : yes
Checking for compiler atomic builtins : no
'configure' finished successfully (11.186s)


$ ./waf
$ sudo ./waf install

まとめ

これでOpenBlocksでJubatusを利用する準備は整いました。実際にJubatusを利用して機械学習をするには、Jubatusのクライアントを作ることになります。クライアントは、必ずしもJubatusサーバを動作させるホストで実行する必要はありません。この場合は OpenBlocksでサーバを動かすことを想定していますが、クライアントをx86_64のLinuxやMacBook Air(2011)から実行してOpenBlocks上でJubatusが動作することを確認しています。

クライアントの開発・実行にはC++, Ruby, Python, Javaといったプログラミング言語が利用可能です。現在はgithubのjubatus-exampleリポジトリにサンプルプログラムを準備していま す。詳しくはJubatusオフィシャルサイトやJubatus Blogなどをご覧ください。
ちなみに、Jubatusの各サーバは、eth0もしくは、最初に取得できたネットワークインタフェースのIPv4アドレスにリッスンす るソケットを割り当てます。クライアントからアドレスを指定する際には、IPv6のアドレスではなくIPv4アドレスを指定するよう気をつけてください (ホスト名の解決で、IPv4アドレスより先にIPv6アドレスが返ることがあります)。

今後はZooKeeperや各種ライブラリを利用した実験、評価を考えています。分散環境をOpenBlocks(ARM)とx86系サーバといったヘテロジニアスな環境で構築して動作させたいですね。

Jubatus解説記事 実験/評価編はこちら:
   JubatusをOpenBlocksで動作させてみる

[.tested] UK/ThreeのSIMをAX3/A6で使ってみる

$
0
0
UK / Three internetのSIMは、LHRの空港の自動販売機でも買える手軽なSIMです。
OpenBlocks A6/AX3でモバイルネットワーク接続を確保するため、Huawei社のUSBモバイルアダプタ(E220相当)を利用してpppdで接続しました。

1. USBモデムの認識
Huawei社のE220は、usbserial(option)により認識されます。AX3およびA6では標準のカーネルパッケージでタイプします。
dmesgは以下の通りです。

usb-storage: device found at 2
usb-storage: waiting for device to settle before scanning
usb 1-1: new full speed USB device using ehci_marvell and address 3
usb 1-1: configuration #1 chosen from 1 choice
scsi5 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 3
usb-storage: waiting for device to settle before scanning
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for GSM modem (1-port)
option 1-1:1.0: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB0
option 1-1:1.1: GSM modem (1-port) converter detected
usb 1-1: GSM modem (1-port) converter now attached to ttyUSB1
usbcore: registered new interface driver option
option: v0.7.2:USB Driver for GSM modems

2. APNの設定
APNは、three.co.ukまたは3internetを以下のATコマンドで指定します。
(three.co.ukはNAT経由になります)

AT+CGDCONT=1,"IP","APN名"

今回は、pppconfigで設定ファイルを作成した後、/etc/chatscript/threeの下に追加しました。

:
# modeminit
'' ATZ
'' AT+CGDCONT=1,"IP","3internet"
:

3. pppdの設定

pppconfigを使用します。
導入していない場合は、パッケージをインストールしてください。

# aptitude install ppp pppconfig

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

Provider Namethree
Configure Nameservers (DNS)Dynamic
Authentication Method for testPAP
User Namethree
Passwordthree
Speed460800
Pulse or ToneTone
Phone Number*99#
Choose Modem Config MethodYES (Auto)
Select Modem PortManual
Manually Select Modem Port/dev/ttyUSB0

eth0や他のインタフェースが有効になっている場合は、/etc/ppp/peers/threeに、以下の行を加えてください。

replacedefaultroute

接続は、
# pon three

切断は、
#poff

接続時のifconfigの表示は以下の通りです。

ppp0      Link encap:Point-to-Point Protocol
          inet addr:94.196.2.226  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:6 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:102 (102.0 B)  TX bytes:129 (129.0 B)


JubatusをOpenBlocksで動作させてみる

$
0
0
前回のエントリである「JubatusをOpenBlocks AX3へインストールしてみる」の続きとなります。
今回は、以下の3点を目標とします。

  • 1. OpenBlocks AX3 上のJubatusを、ZooKeeperのCライブラリとリンクして動作させる
  • 2. Jubatusの分類器jubaclassifierをOpenBlocks上で動作させて試す
  • 3. Jubatusの分類器jubaclassifierを分散動作させて試す。このとき、jubaclassifierをOpenBlocksとx86系サーバというヘテロジニアスな環境で組み合わせる

この3点を選んだ理由は、ZooKeeperのCライブラリの利用がOpenBlocksで実行可能であること、Jubatusのサンプ ルを利用して実際にJubatusの分類器を触ってみること、応用として異なるCPUアーキテクチャ間の環境でもJubatusが利用できることを確認 することができるからです。
その代わり、ZooKeeperのセットアップ・設定方法については解説しません。ZooKeeper本体を動作させなくても、1,2番目の内容でOpenBlocks上で動かすJubatusの分類器を触ることはできると思います。

1. 環境構築:ZooKeeper CクライアントライブラリのインストールとJubatusのインストール

JubatusをOpenBlocks AX3へインストールしてみる」 からの差分として、ZooKeeperのCクライアントライブラリをインストールします。また、Jubatusはconfigureオプションから ZooKeeperの利用を有効にしてからインストールします(既にJubatusをインストールしていても、再インストールする形となっても構いませ ん。ただし、Linuxの共有ライブラリのキャッシュが有効になっている場合は再インストール後の再構築を忘れないでください)。
ApacheのZooKeeperプロジェクトから ZooKeeper 3.4.5(stable)リリースのtarボールをダウンロードし、そこからCライブラリをインストールします。ZooKeeperのCライブラリはイ ンラインアセンブラを利用しており、そのままではARMプロセッサを用いているOpenBlocksで動作しないため $ patch -p0 < patch.diff のようなコマンドで以下のパッチをあてることでインストールできます。

diff src/mt_adaptor.c.orig src/mt_adaptor.c -u
--- src/mt_adaptor.c.orig 2012-12-14 20:14:37.060018322 +0900
+++ src/mt_adaptor.c 2012-12-14 20:18:20.000018333 +0900
@@ -482,6 +482,8 @@

int32_t fetch_and_add(volatile int32_t* operand, int incr)
{
+ return __sync_fetch_and_add(operand, incr);
+#if 0
#ifndef WIN32
int32_t result;
asm __volatile__(
@@ -503,6 +505,7 @@
}
return result;
#endif
+#endif
}

// make sure the static xid is initialized before any threads started


$ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz
$ tar -xvf zookeeper-3.4.5.tar.gz
$ cd zookeeper-3.4.5/src/c/
$ ./configure
$ make
$ sudo make install

2012年11月リリースのJubatus 0.3.4利用します。--enable-zookeeperと--enable-debugオプションも加えてconfigureします。

$ git clone https://github.com/jubatus/jubatus.git
$ cd jubatus
$ git checkout jubatus-0.3.4 -b jubatus-0.3.4
$ ./waf configure --disable-re2 --enable-debug --enable-zookeeper
Setting top to : /home/kashihara/repos/jubatus
Setting out to : /home/kashihara/repos/jubatus/build
Checking for 'g++' (c++ compiler) : ok
Unpacking gtest : yes
Checking for library pthread : yes
Checking for library msgpack : yes
Checking for library dl : yes
Checking for program pkg-config : /usr/bin/pkg-config
Checking for 'libglog' : yes
Checking for 'libevent' : not found
Checking for library event : yes
Checking for 'pficommon' : yes
Checking for header pficommon/network/mprpc.h : yes
Checking for header unistd.h : yes
Checking for header sys/types.h : yes
Checking for header sys/wait.h : yes
Checking for header sys/stat.h : yes
Checking for header cxxabi.h : yes
Checking for header sys/socket.h net/if.h : yes
Checking for header sys/ioctl.h : yes
Checking for header fcntl.h : yes
Checking for header netinet/in.h : yes
Checking for header arpa/inet.h : yes
Checking for header dlfcn.h : yes
Checking for header c-client-src/zookeeper.h : not found
Checking for header zookeeper/zookeeper.h : yes
Checking for library zookeeper_mt : yes
Checking for header sys/socket.h net/if.h sys/ioctl.h : yes
Checking for header netinet/in.h arpa/inet.h : yes
Checking for compiler atomic builtins : no
'configure' finished successfully (12.197s)


$ ./waf
$ sudo ./waf install

ZooKeeperでの動作確認


ZooKeeperのセットアップについては解説しないため、導入にあたっては以下の記事や本家ドキュメントをお勧めします。

管理が困難―分散処理の常識はZooKeeperで変わる (1/3) - @IT
http://www.atmarkit.co.jp/fjava/rensai4/bigdata_java08/01.html
Apache ZooKeeper へようこそ!
http://oss.infoscience.co.jp/hadoop/zookeeper/
Apache ZooKeeper - Home
http://zookeeper.apache.org

ZooKeeperを有効にしたJubatusの分類器jubaclassifierが動作するか確認しましょう。ZooKeeperのホスト、 ポート番号を-zオプションで指定し、-nオプションでJubatus内でのグループ名を指定します。ここではtestとしておきます。以下のように ZOO_INFOといったノードの作成のログが表示されていれば成功です。

$ jubaclassifier -z 192.168.0.102:2181 -n test
I1225 01:51:17.177259 14603 server_util.cpp:137] starting jubaclassifier 0.3.4 RPC server at 192.168.0.101:9199
pid : 14603
user : kashihara
mode : multinode mode
timeout : 10
thread : 2
tmpdir : /tmp
logdir :
zookeeper : 192.168.0.102:2181
name : test
join : false
interval sec : 16
interval count : 512
2012-12-25 01:51:17,177:14603(0x2b44a6620d00):ZOO_INFO@log_env@712: Client environment:zookeeper.version=zookeeper C client 3.4.5
2012-12-25 01:51:17,177:14603(0x2b44a6620d00):ZOO_INFO@log_env@716: Client environment:host.name=pfisky
2012-12-25 01:51:17,177:14603(0x2b44a6620d00):ZOO_INFO@log_env@723: Client environment:os.name=Linux
2012-12-25 01:51:17,177:14603(0x2b44a6620d00):ZOO_INFO@log_env@724: Client environment:os.arch=2.6.32-71.29.1.el6.x86_64
2012-12-25 01:51:17,177:14603(0x2b44a6620d00):ZOO_INFO@log_env@725: Client environment:os.version=#1 SMP Tue May 10 17:35:18 CDT 2011
2012-12-25 01:51:17,178:14603(0x2b44a6620d00):ZOO_INFO@log_env@733: Client environment:user.name=kashihara
2012-12-25 01:51:17,178:14603(0x2b44a6620d00):ZOO_INFO@log_env@741: Client environment:user.home=/home/kashihara
2012-12-25 01:51:17,178:14603(0x2b44a6620d00):ZOO_INFO@log_env@753: Client environment:user.dir=/home/kashihara/repos/jubatus
2012-12-25 01:51:17,178:14603(0x2b44a6620d00):ZOO_INFO@zookeeper_init@786: Initiating client connection, host=192.168.0.102:2181 sessionTimeout=10000 watcher=(nil) sessionId=0 sessionPasswd=<null> context=(nil) flags=0
2012-12-25 01:51:17,178:14603(0x2b44a6a32700):ZOO_INFO@check_events@1703: initiated connection to server [192.168.0.102:2181]
2012-12-25 01:51:17,181:14603(0x2b44a6a32700):ZOO_INFO@check_events@1750: session establishment complete on server [192.168.0.102:2181], sessionId=0x13ad037d2ce00fd, negotiated timeout=10000
I1225 01:51:17.202198 14603 zk.cpp:109] create /jubatus
I1225 01:51:17.235656 14603 zk.cpp:109] create /jubatus/supervisors
I1225 01:51:17.237215 14603 zk.cpp:109] create /jubatus/jubakeepers
I1225 01:51:17.238535 14603 zk.cpp:109] create /jubatus/actors
I1225 01:51:17.239946 14603 zk.cpp:109] create /jubatus/actors/classifier
I1225 01:51:17.241165 14603 zk.cpp:109] create /jubatus/actors/classifier/test
I1225 01:51:17.242658 14603 zk.cpp:109] create /jubatus/actors/classifier/test
I1225 01:51:17.243892 14603 zk.cpp:109] create /jubatus/actors/classifier/test/master_lock
I1225 01:51:17.245112 14603 zk.cpp:109] create /jubatus/actors/classifier/test/nodes
I1225 01:51:17.246489 14603 zk.cpp:109] create /jubatus/actors/classifier/test/nodes/192.168.0.101_9199
I1225 01:51:17.246520 14603 membership.cpp:79] actor created: /jubatus/actors/classifier/test/nodes/192.168.0.101_9199

例えば、ZooKeeperとうまく接続できなかったときは次のようにノード作成失敗のログを出力し、最終的にエラーが発生して起動に失敗します。

$ jubaclassifier -z 127.0.0.1:1234 -n test
I1225 01:41:41.027243 11741 server_util.cpp:136] starting jubaclassifier 0.3.4 RPC server at 192.168.0.100:9199
pid : 11741
user : kashihara
mode : multinode mode
timeout : 10
thread : 2
tmpdir : /tmp
logdir :
zookeeper : 127.0.0.1:1234
name : test
join : false
interval sec : 16
interval count : 512
2012-12-25 01:41:41,028:11741(0x401ba430):ZOO_INFO@log_env@712: Client environment:zookeeper.version=zookeeper C client 3.4.5
2012-12-25 01:41:41,028:11741(0x401ba430):ZOO_INFO@log_env@716: Client environment:host.name=obsax3
2012-12-25 01:41:41,029:11741(0x401ba430):ZOO_INFO@log_env@723: Client environment:os.name=Linux
2012-12-25 01:41:41,029:11741(0x401ba430):ZOO_INFO@log_env@724: Client environment:os.arch=3.0.6
2012-12-25 01:41:41,029:11741(0x401ba430):ZOO_INFO@log_env@725: Client environment:os.version=#1 SMP Fri Nov 16 11:53:45 JST 2012
2012-12-25 01:41:41,030:11741(0x401ba430):ZOO_INFO@log_env@733: Client environment:user.name=kashihara
2012-12-25 01:41:41,032:11741(0x401ba430):ZOO_INFO@log_env@741: Client environment:user.home=/home/kashihara
2012-12-25 01:41:41,032:11741(0x401ba430):ZOO_INFO@log_env@753: Client environment:user.dir=/home/kashihara
2012-12-25 01:41:41,032:11741(0x401ba430):ZOO_INFO@zookeeper_init@786: Initiating client connection, host=127.0.0.1:1234 sessionTimeout=10000 watcher=(nil) sessionId=0 sessionPasswd=<null> context=(nil) flags=0
2012-12-25 01:41:41,033:11741(0x40ed6460):ZOO_ERROR@handle_socket_error_msg@1697: Socket [127.0.0.1:1234] zk retcode=-4, errno=111(Connection refused): server refused to accept the client
E1225 01:41:41.033897 11741 zk.cpp:104] /jubatus failed in creation -4 connection loss
2012-12-25 01:41:41,034:11741(0x40ed6460):ZOO_ERROR@handle_socket_error_msg@1697: Socket [127.0.0.1:1234] zk retcode=-4, errno=111(Connection refused): server refused to accept the client
E1225 01:41:41.034329 11741 zk.cpp:104] /jubatus/supervisors failed in creation -4 connection loss
2012-12-25 01:41:41,034:11741(0x40ed6460):ZOO_ERROR@handle_socket_error_msg@1697: Socket [127.0.0.1:1234] zk retcode=-4, errno=111(Connection refused): server refused to accept the client
E1225 01:41:41.034677 11741 zk.cpp:104] /jubatus/jubakeepers failed in creation -4 connection loss
2012-12-25 01:41:41,034:11741(0x40ed6460):ZOO_ERROR@handle_socket_error_msg@1697: Socket [127.0.0.1:1234] zk retcode=-4, errno=111(Connection refused): server refused to accept the client
E1225 01:41:41.035019 11741 zk.cpp:104] /jubatus/actors failed in creation -4 connection loss
2012-12-25 01:41:41,035:11741(0x40ed6460):ZOO_ERROR@handle_socket_error_msg@1697: Socket [127.0.0.1:1234] zk retcode=-4, errno=111(Connection refused): server refused to accept the client
E1225 01:41:41.035387 11741 zk.cpp:104] /jubatus/actors/classifier failed in creation -4 connection loss
2012-12-25 01:41:41,035:11741(0x40ed6460):ZOO_ERROR@handle_socket_error_msg@1697: Socket [127.0.0.1:1234] zk retcode=-4, errno=111(Connection refused): server refused to accept the client
E1225 01:41:41.035745 11741 zk.cpp:104] /jubatus/actors/classifier/test failed in creation -4 connection loss
F1225 01:41:41.036495 11741 server_util.hpp:124] Dynamic exception type: jubatus::exception::runtime_error::what: Failed to prepare lock_service
#0 [jubatus::exception::error_api_func_*] = lock_service::create
#0 [jubatus::exception::error_at_file_*] = ../src/common/membership.cpp
#0 [jubatus::exception::error_at_line_*] = 161
#0 [jubatus::exception::error_at_func_*] = void jubatus::common::prepare_jubatus(jubatus::common::lock_service&, const std::string&, const std::string&)
*** Check failure stack trace: ***
@ 0x402fa974 google::LogMessage::Fail()
@ 0x402fe764 google::LogMessage::SendToLog()
@ 0x402fdd18 google::LogMessage::Flush()
@ 0x402fec54 google::LogMessageFatal::~LogMessageFatal()
@ 0x1e174 jubatus::framework::run_server<>()
@ 0x13934 main
@ 0x40526538 (unknown)
アボートしました

2. Jubatusの分類器jubaclassifierを試す

jubatus-exampleの将軍分類サンプルを見てみましょう。
https://github.com/jubatus/jubatus-example

jubaclassiferの起動

OpenBlocks側では引数なしで起動してみましょう

$ jubaclassifier
I1225 01:49:25.317184 11751 server_util.cpp:136] starting jubaclassifier 0.3.4 RPC server at 192.168.0.100:9199
pid : 11751
user : kashihara
mode : standalone mode
timeout : 10
thread : 2
tmpdir : /tmp
logdir :
zookeeper :
name :
join : false
interval sec : 16
interval count : 512

jubatus-example 将軍分類の実行

shogunは、徳川家、足利家、北条家の将軍の姓名をあらかじめ学習させ、分類時に名前を入力すると三家の名字を返すサンプルプログラムとなっています。
サンプルプログラムをx86系のLinuxかMac等で実行します。Rubyのサンプルを使うためjubatus ruby gemsをインストールします。

$ git clone https://github.com/jubatus/jubatus-example
$ cd jubatus-example
$ git checkout -b obs-example
$ gem install jubatus
$ cd shogun

OpenBlocks AX3に割り当てているIPアドレスを192.168.0.100とします。 shogun.rbのグローバル変数 $hostを書き換えてから、shogun.rbを実行します。以下のように結果が表示されたら成功です。

$ ruby shogun.rb
徳川慶喜
足利義昭
北条守時

shogun.rbのコードを見てみましょう。config, train, predictという3つのメソッドが定義されています。それぞれ、Jubatusの分類器の設定、学習、名前から名字を分類(予測)することに対応しています。
trainメソッドでは徳川・足利・北条の各家の代表的な将軍が記述され、これがJubatusの分類器で学習されます。predictメソッドで は、慶喜・義昭・守時を名前の入力としてJubatusに問いあわせ、Jubatusが返した結果からスコアの高いラベル(学習時の名字である徳川・足 利・北条に対応)を分類結果として表示しています。
入力した文字列(名前)をどのように機械学習で扱っているかについてはData Conversion — Jubatusを参照してください。configメソッドを見るとuni-gramを用いていることがわかります。
以上で、Jubatusの分類器をOpenBlocksで試すことが確認できました。shogun.rbファイルで学習・分類していましたが、実行 してみたい分類に応じてファイルを分割して分類、学習をJubatusで実行してみると面白いと思います。 注意事項として、学習前にset_configを使って必ず設定を与える必要があります。学習後はset_configを実行しないでください。なぜな ら、学習後にset_configを呼び出すと、学習済みのモデルがクリアされてしまうからです(2013年の次のリリースでは、set_configの RPCによる設定指定は廃止し、別の手段で設定を指定できるようにする予定です)。 また、Jubatusはサーバとして実装されており、現在提供しているインタフェースはMessagePack-RPC(TCP/IPv4)経由となって います。ネットワークが接続できない環境だと外部のマシンからRPCを実行することもできませんし、あまりにも重たい(量の多い)処理を実行させると通信 時にサーバもしくはクライアント側でタイムアウトが発生する可能性があります。

3. jubaclassifierを分散動作させて試してみる

jubaclassifierをOpenBlocksとx86系サーバというヘテロジニアスなアーキテクチャ間でJubatusの分散動作を試して みましょう。OpenBlocksと同様に、x86系LinuxでZooKeeperありでJubatusをインストールした環境を用意します。 x86_64でのREHL系Linux向けのRPMパッケージと、Debianパッケージは公式サイトでも提供しており、Quick Start — Jubatusの解説に従ってインストールが可能です。 shogun.rbでは、サーバとするホスト名、ポート番号は単体で動作させた時と同じ値のままにしておきます。

プロセス、ホスト構成

Tutorial in Distributed Mode — Jubatusを参考にして、以下のような構成でプロセスを起動します。
  • 192.168.0.101 Scientific Linux 6 or Debian Linux
    • Jubatusクライアント(Ruby: shogun.rb)
    • jubaclassifier_keeper
    • jubaclassifier
  • 192.168.0.100 OpenBlocks AX3
    • jubaclassifier
  • 192.168.0.102 Linux
    • ZooKeeper

プロセスの起動

OpenBlocksとScientific Linuxのコンソールで以下のプロセスをそれぞれ起動します。
jubaclassifier -z 192.168.0.102:2181 -n test -p 9198 -i 1
jubaclassifier_keeper -z 192.168.0.102:2181
jubaclassifier -z 192.168.0.102:2181 -n test -i 1
それぞれプロセスが起動した状態で、jubactlコマンドを実行するとZooKeeperと接続しているプロセスのホスト(IPアドレス)がZooKeeperに登録されていることを確認できます。

$ jubactl -z 192.168.0.102:2181 -s jubaclassifier -t classifier -n test -c status
active jubakeeper members:
192.168.0.100_9199
active jubavisor members:
active test members:
192.168.0.100_9190
192.168.0.101_9199


分散時の学習とMIXの確認

shogun.rbのメソッド呼び出し部分を以下のように分類を実行しないよ書き換えて、設定と学習のみをまず実行します。

# run example
config(client)
train(client)
#predict(client)

分散してJubatusを稼働させていると、Jubatusは学習結果のモデル共有のためにMIX処理というものを行います(*1)。今回は Jubatusのconfigure時に--enable-debugを有効にしていると、jubaclassifierのログに以下のようなMIX処理 のログ出力を確認することができます。現在は、学習の回数もしくは一定期間ごとにMIX処理が自動的に発生します。以下のログは学習結果のデータを共有し ていることがMIX処理の転送データサイズから確認できますが、モデルを共有(同期)させる必要がないときは8バイト程度の転送になります。

I1225 13:33:30.516629 3240 linear_mixer.cpp:172] starting mix:
I1225 13:33:30.517878 3240 linear_mixer.cpp:79] get diff from 192.168.0.100:9198
I1225 13:33:30.517902 3240 linear_mixer.cpp:79] get diff from 192.168.0.101:9199
I1225 13:33:30.520889 3240 linear_mixer.cpp:90] pull diff to 192.168.0.100:9198
I1225 13:33:30.520915 3240 linear_mixer.cpp:90] pull diff to 192.168.0.101:9199
I1225 13:33:30.523612 3240 linear_mixer.cpp:230] mixed with 2 servers in 0.006961 secs, 4144 bytes (serialized data) has been put.
I1225 13:33:30.523646 3240 linear_mixer.cpp:184] .... 2th mix done.

*1: Overview — Jubatus http://jubat.us/ja/overview.html

分類の確認

shogun.rbを以下のように分類のみ実行するよう書き換え、jubaclassifier単体で実行したときと同じ実行結果である「徳川慶喜」「足利義昭」「北条守時」を得られることを確認します。

# run example
#config(client)
#train(client)
predict(client)

繰り返しshogun.rbを実行しても同じ結果が返ることを確認したり、jubaclassifier_keeperのログを確認してどちらの jubaclassifierに対してRPCを実行しているか確認してみても良いでしょう。MIX処理で学習したモデルが共有されていることが実際に確認 できます。

I1225 13:51:53.796672 12127 keeper.hpp:134] random_proxy1 classify test
I1225 13:51:53.796926 12127 keeper.hpp:139] request to 192.168.0.101:9199
I1225 13:51:53.799523 12127 keeper.hpp:134] random_proxy1 classify test
I1225 13:51:53.799747 12127 keeper.hpp:139] request to 192.168.0.101:9199
I1225 13:51:53.802237 12127 keeper.hpp:134] random_proxy1 classify test
I1225 13:51:53.802461 12127 keeper.hpp:139] request to 192.168.0.100:9198

このときは、jubaclassifier_keeperというプロセスをプロキシとして経由してclassify(分類のための)RPCを呼び出しています。trainやclassifyといったset_config以外のRPCは直接jubaclassifierを指定して実行しても構いませ ん。

jubaclassifier_keeperのclasifyは同じグループ名で起動しているjubaclassifierからランダムに1つ選んでRPCを呼びます。keeperを通したときにRPCをどう呼び出すかはclassifier.idlなどのIDLに定義されています。例えば、set_configは@broadcastというものが指定されており、これはclassifyと異なり参加しているすべてのプロセスに対して同じ内容のRPCを実行します。

まとめ

今回の内容で、以下のことが確認できました。
  • Jubatusの分類器jubaclassifierをOpenBlocksで動作させることができた
  • ZooKeeperのCクライアントライブラリをOpenBlocks上でJubatusと組み合わせ動作させることができた
  • 異なるアーキテクチャ間であるIntel 64(x86_64)のLinuxとOpenBlocks AX(ARM)でJubatusを動作させることができた
今回はJubatusのMIX処理についても説明しましたが、ここで覚えてもらいたい点があります。Jubatusは学習したモデルが分 散したサーバ間で共有(同期)されていきますが、常に同じモデルを一貫して保持することを保証していません。複数台の Jubatus(jubaclassifierなど)があったとき、いくつかでは学習済みのサーバがあっても、まだその結果が共有されていないサーバが存 在する可能性もあります。
機械学習や分散したときの特性も考えながら、OpenBlocksと他アーキテクチャCPUと組み合わせてJubatusを触っていってもらえるとありがたいです。

[.tested] BGAN EXPLORER500 インマルサット衛星電話 [AX3][A6]

$
0
0
[.tested] BGAN EXPLORER500 インマルサット衛星電話 [AX3][A6]

インマルサットBGANサービス(Inmarsat BGAN : Broadband Global Area Network)は、BGAN衛星電話端末から、宇宙にある人工衛星へ 向けて、無線電波を発信することで、音声通話サービス、FAX通信、データ通信サービスを利用できる通信回線サービスです。
今回テストに使用したEXPLORER500は、最大492kbpsのパケットデータ通信と音声電話サービスをサポートする通信衛星モデムユニットであり、パケットデータ通信により、IP通信サービスによる衛星モデムベースのルータユニットとしても機能します。



仕様については、以下のページを参照してください。

BGANインマルサット衛星電話 ビーギャンエクスプローラー500


1. 外観/接続端子
本モデルは、完全な防水仕様ではないため、屋外に放置して使用することは出来ません。
(災害時には、ビニールの袋等で防水処理をして使用されているようです)

本体横には、PC等を接続するLANポート、およびUSBポート、ACアダプタ端子があります。
バッテリ駆動可能なモデルです。


上部にはLCD操作パネルおよび、方位計があり、本体のみで設置の設定が行えます。



2. 設置/設定
衛星モデムは、通信衛星の向きにユニットを固定する必要があります。
本体にはコンパスが内蔵されていますので、これにより方位を設定し、併せて仰角を設定します。
微調整は、発信音によりナビゲートされ、一連の設置操作は早ければ1~2分で終了します。
基本的に、南側が開けた場所へ設置しますが、窓ガラス内の場合、コーティングなどでGPSの電波の受信が出来ず通信が行えない場合があります。



このユニットは、設置設定が終わったあとは、一般的なWANルータと同じく、LAN内に接続したPCからIP網へのアクセスが可能になります。
ただし、衛星通信であることから、一般的には従量課金を選択していますので、PCからソフトウェア本体やデータのアップデートを行ってしまうと大量のデータパケットが流れてしまい、すぐに契約上限を超えてしまいます。
そのため、PCを接続する場合は、ソフトウェアのデータ更新や、メールのトラフィック等に注意し、安易なWebアクセスなどを行わないように十分に注意する必要があります。

USB端子にAX3およびA6を接続した場合は、USBシリアルデバイスとして認識されます。


usb 1-1: new full-speed USB device number 2 using ehci_marvell
usb 1-1: New USB device found, idVendor=10fe, idProduct=0004
usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-1: Product: EXPLORER 500
usb 1-1: Manufacturer: Thrane & Thrane
usb 1-1: SerialNumber: none
cdc_acm 1-1:1.0: ttyACM0: USB ACM device
cdc_acm 1-1:1.2: ttyACM1: USB ACM device
usbcore: registered new interface driver cdc_acm
cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters


モデムデバイス名は以下の通りです。

crw-rw---- 1 root dialout 166,  0 Dec 21 16:03 ttyACM0
crw-rw---- 1 root dialout 166,  1 Dec 21 16:03 ttyACM1


minicomで atコマンドで コントロールすることが可能です。
(今回、相手先のプロバイダ情報がないため、pppdでの通信テストなどは行っていません)


root@obsax3:~# cat .minirc.dfl
# Machine-generated file - use setup menu in minicom to change parameters.
pu port /dev/ttyACM0


AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0
OK


3. IP通信について

今回、試験的にレンタルした端末の契約は、

100KB/80円

上り下りの帯域 128kbpsの 遅延 1400msの 回線を使用し、併せて、通信料の上限を設定しました。

IPアドレスはUK内のプロバイダからのものです。
衛星経由の遅延に関しては、1050 ms の遅延が発生していると考えられます。

MTUサイズは 1470 byets
スピードテストでは 上り下り共に約 128Kbps
となります。

社内からのtraceroute


# traceroute 161.30.22.220
traceroute to 161.30.22.220 (161.30.22.220), 64 hops max, 40 byte packets
1 192.168.10.1 (192.168.10.1) 2.106 ms 1.370 ms 0.852 ms
2 118.23.8.84 (118.23.8.84) 34.581 ms 25.215 ms 14.009 ms
3 118.23.7.161 (118.23.7.161) 14.532 ms 15.100 ms 12.847 ms
4 118.23.96.121 (118.23.96.121) 18.085 ms 18.293 ms 16.144 ms
5 60.37.55.85 (60.37.55.85) 13.862 ms 10.896 ms 9.821 ms
6 60.37.27.91 (60.37.27.91) 10.031 ms 60.37.27.155 (60.37.27.155) 14.856 ms 118.23.168.27 (118.23.168.27) 10.331 ms
7 ae-11.r21.tokyjp01.jp.bb.gin.ntt.net (129.250.12.201) 10.826 ms 16.582 ms 12.414 ms
8 ae-1.r25.tokyjp01.jp.bb.gin.ntt.net (129.250.2.73) 10.590 ms 15.223 ms 18.754 ms
9 as-2.r22.amstnl02.nl.bb.gin.ntt.net (129.250.3.78) 280.397 ms 278.798 ms 271.423 ms
10 peer76-01.ams2.ip.telecity.net (195.69.144.113) 279.727 ms * 277.857 ms
11 border76-01-ams2-te34.telecity.com (80.252.81.154) 278.301 ms 276.132 ms 278.984 ms
12 82.199.70.202 (82.199.70.202) 266.864 ms 275.349 ms 272.905 ms
13 * * *
14 161.30.16.34 (161.30.16.34) 337.590 ms 340.956 ms 345.253 ms

テスト機からの traceroute


# pathping 202.32.197.41
Tracing route to www.plathome.co.jp [202.32.197.41]
over a maximum of 30 hops:
0 WindowsXP [192.168.0.4]
1 172.27.9.2
2 172.27.9.17
3 161.30.16.33
4 65.219.15.157
5 500.Serial2-10.GW1.HNL2.ALTER.NET [157.130.205.73]
6 0.so-7-0-0.XL1.HNL2.ALTER.NET [152.63.50.254]
7 0.so-5-0-2.XL3.SJC7.ALTER.NET [152.63.48.6]
8 POS6-0.GW2.SJC7.ALTER.NET [152.63.51.45]
9 iij-america-sjc-gw.customer.alter.net [152.179.48.2]
10 sjc002bf02.IIJ.Net [206.132.169.249]
11 tky001bf01.IIJ.Net [206.132.169.161]
12 tky009bb10.IIJ.Net [58.138.80.174]
13 tky009ipgw11.IIJ.Net [58.138.112.150]
14 tky009ip72.IIJ.Net [58.138.112.122]
15 202.232.12.102
16 dmzgw-global.plathome.co.jp [202.32.197.3]
17 www.plathome.co.jp [202.32.197.41]

Computing statistics for 425 seconds...
Source to Here This Node/Link
Hop RTT Lost/Sent = Pct Lost/Sent = Pct Address 0 WindowsXP [192.168.0.4]
0/ 100 = 0% |
1 1300ms 0/ 100 = 0% 0/ 100 = 0% 172.27.9.2
0/ 100 = 0% |
2 1305ms 0/ 100 = 0% 0/ 100 = 0% 172.27.9.17
0/ 100 = 0% |
3 1306ms 0/ 100 = 0% 0/ 100 = 0% 161.30.16.33
0/ 100 = 0% |
4 1333ms 0/ 100 = 0% 0/ 100 = 0% 65.219.15.157
0/ 100 = 0% |
5 1299ms 0/ 100 = 0% 0/ 100 = 0% 500.Serial2-10.GW1.HNL2.ALTER.NET [157.130.205.73]
0/ 100 = 0% |
6 1333ms 0/ 100 = 0% 0/ 100 = 0% 0.so-7-0-0.XL1.HNL2.ALTER.NET [152.63.50.254]
0/ 100 = 0% |
7 1425ms 0/ 100 = 0% 0/ 100 = 0% 0.so-5-0-2.XL3.SJC7.ALTER.NET [152.63.48.6]
0/ 100 = 0% |
8 1361ms 0/ 100 = 0% 0/ 100 = 0% POS6-0.GW2.SJC7.ALTER.NET [152.63.51.45]
0/ 100 = 0% |
9 1405ms 0/ 100 = 0% 0/ 100 = 0% iij-america-sjc-gw.customer.alter.net [152.179.48.2]
0/ 100 = 0% |
10 1380ms 0/ 100 = 0% 0/ 100 = 0% sjc002bf02.IIJ.Net [206.132.169.249]
0/ 100 = 0% |
11 1479ms 0/ 100 = 0% 0/ 100 = 0% tky001bf01.IIJ.Net [206.132.169.161]
0/ 100 = 0% |
12 1504ms 0/ 100 = 0% 0/ 100 = 0% tky009bb10.IIJ.Net [58.138.80.174]
0/ 100 = 0% |
13 1472ms 0/ 100 = 0% 0/ 100 = 0% tky009ipgw11.IIJ.Net [58.138.112.150]
0/ 100 = 0% |
14 1455ms 0/ 100 = 0% 0/ 100 = 0% tky009ip72.IIJ.Net [58.138.112.122]
0/ 100 = 0% |
15 1469ms 0/ 100 = 0% 0/ 100 = 0% 202.232.12.102
0/ 100 = 0% |
16 --- 100/ 100 =100% 100/ 100 =100% dmzgw-global.plathome.co.jp [202.32.197.3]
0/ 100 = 0% |
17 1443ms 0/ 100 = 0% 0/ 100 = 0% www.plathome.co.jp [202.32.197.41]
Trace complete.


MTUサイズ  1470bytesと 確認


# ping -f -l 1472 -n 1 202.32.197.41
Pinging 202.32.197.41 with 1472 bytes of data:
Request timed out.
Ping statistics for 202.32.197.41:
Packets: Sent = 1, Received = 0, Lost = 1 (100% loss),

# ping -f -l 1470 -n 1 202.32.197.41
Pinging 202.32.197.41 with 1470 bytes of data:
Reply from 202.32.197.41: bytes=1470 time=2642ms TTL=48
Ping statistics for 202.32.197.41:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 2642ms, Maximum = 2642ms, Average = 2642ms


スピードテストは、
通信速度測定システム

 Radish Network Speed Testing 東京

を使用しました。結果は以下の通りです。

下り回線      速度  131.8kbps (16.47kByte/sec)      測定品質  77.5 
上り回線      速度  154.1kbps (19.26kByte/sec)      測定品質  74.4 

4. まとめ
今回は、BGAN EXPLORER500によるデータ通信について、その取り回しや遅延などについての検証を行いました。
衛星通信に限らず、3G/2G回線においてもM2Mに於いては通信量の把握は重要な事項であり、OpenBlocksの様なgatewayサーバによりデータの処理やコントロールを行いたいという問い合わせも増えています。

OpenBlocksの動作モードについて

$
0
0
こんにちは。OpenBlocksファミリの開発・技術担当の木村です。

私は開発・技術担当ではありますが、お客様との直接お会いして製品の紹介をする機会も多くあり、よく説明を求められる内容として、RAMディスクモードとストレージ併用モードというOpenBlocks独自の仕組みがあります。今回はこの内容について、解説を行わせていただきたいと思います。

OpenBlocksでは、Debian GNU/Linuxを標準搭載するOpenBlocks 600D(販売終了済み)、A6、AX3において、RAMディスクモードとストレージ併用モードの二つの動作モードを用意しており、用途や要件に応じて使い分けが可能です。補足説明が必要と思われる用語については、本稿末尾に用意した用語解説や、以下サイトにて公開しているユーザーズガイドも併せてご参照下さい。

http://openblocks.plathome.co.jp/support/guide/


◆ RAMディスクモード

実行プログラムや設定が少量で済むインフラ系のサービスや静的なHTTPサービスを稼働させる場合に最適です。もとより高堅牢なハードウェアとなっているOpenBlocksですが、SSDのようなストレージを使用しないことでさらに故障要因を減らすことが出来ます。なお後述するとおりRAMディスクモードでで構築済みの環境を保存するには、容量の制限を考慮する必要がありますので、大容量の領域を必要とする用途にはストレージ併用モードがお勧めです。

RAMディスクモードでは、名称の通り起動後のユーザーランドをRAMディスクに構築して動作します。電源ONしFlashROMからロードしたファームウェアが実行されると、ファームウェアに含まれるinitrdのイメージのために128MB、稼働中の追加ソフトウェアやデータの置き場として384MBのtmpfs領域(/.rw)を確保してDebian GNU/Linuxの動作が始まります。





RAMディスクは高速なアクセスが可能であるため、書き換えが頻繁なテンポラリ領域として利用される事が多くありますが、不揮発性のメインメモリを利用しているという都合により、一度電源OFFしてしまうとデータが全て消えてしまうという特性があります。

通常ここに各種ソフトウェアを追加して、サービス提供するシステムを構築しようと考える方はあまりいらっしゃらないのでは無いかと思いますが、壊れにくさの追求を掲げているOpenBlocksでは、このRAMディスクを利用してシステムを構築可能にすることで、SSD等のストレージデバイスを利用しない、より高堅牢なシステムを実現できると考え、標準の機能として盛り込んでいます。

RAMディスクモードでは、initrd、tmpfsとこれらをunionfsで統合した3つのファイルシステムが大きな役割を果たしています。以下図を見ると一見複雑に見えると思いますが、unionfsによって複雑さは隠されており、利用する上では特に気になることは無いかと思います。



initrdには動作に必要な最小限のプログラムやライブラリなどの一式(debootstrapで構築した内容+α程度)が納められており、起動の度に同じ内容が展開されます。この環境には、たとえばless等の一般的なツールであっても、起動に不要なものはファームウェアサイズ削減のために含まれておりません。initrdの内容だけではサーバとして利用するためのソフトウェアが不足しておりますので、用途に合わせたソフトウェアの追加が必要となります。このための領域としてtmpfsが確保されており、利用者にはunionfsによって統合された姿が見えています。

利用者がDebian GNU/Linuxの一般的な操作で、ソフトウェアの追加や設定変更を行っていくと、tmpfsの領域にinitrdが提供するファイルシステムに対する変更差分(追加、変更、削除)が蓄積されていきます。

環境の保存

unionfsの存在によって、内部の仕組みは意識すること無く利用する事が出来ますが、変更差分が蓄積されたまま何も対処をせずに電源OFFすれば、せっかくセットアップした内容も次回起動時には消えてしまいます。

次回起動時にも変更差分を残しておくために、tmpfsの内容をFlashROMに保存するためのコマンド(/usr/sbin/flashcfg)を用意してあります。これを実行することで、tmpfsの内容(/.rw以下)を tar + gz で圧縮保存したデータをFlashROMの専用のエリアに保存します。OpenBlocks AX3は、約48MBの領域がありますが、圧縮の効果を考慮するとおよそ2~3倍程度のデータ量を保存することが出来ます。(AX3での構築例: lighttpd + php5によるWEBサーバやDNS/DHCP等の各種インフラ系サーバ)

なお構築した環境がFlashROMに収まるかどうかは、実際にtar+gzで圧縮保存してみないと分かりません。保存に失敗した場合は、保存対象のデータが削減出来ないかを精査して、再度保存を実行してみて下さい。

保存の内容を独自に調整したい場合は、/usr/sbin/flashcfg コマンドをカスタマイズして自分専用の保存コマンドを作成することも出来ます。bashスクリプトになっておりますので、カスタマイズは比較的手軽かと思います。(カスタマイズする場合でも、フォーマットはtar+gzにしておく必要があります)

環境の復元

flashcfgコマンドで保存したデータは、起動の度に自動的にtmpfs領域に展開されるため、利用する上で特に気にかける必要はありません。実際の処理は/etc/init.d/openblocks-setupが行っておりますので、興味がある方は一度ご覧下さい。

/.rwに変更差分が集約されることのメリット

バックアップと環境の復元が容易に行えます。ファームウェアによって、ベースとなるユーザランド(initrd)が提供され、それに対する変更差分は/.rwに集約されていますので、ファームウェアバージョンをそろえ、/.rwの内容をバックアップ・リストアすることで手軽に構築済み環境のコピーを作ることができます。

前述のflashcfgコマンドには、FlashROMへの保存の他にバックアップを実行する機能を備えており、USBメモリなどのストレージを用意して次のようなコマンドを実行するだけでバックアップが可能です。
    # mkfs -t ext3 -L DEB_CONFIG /dev/sdb1
    # flashcfg -B
ここで重要なのは、ボリュームラベルに「DEB_CONFIG」と設定することです。これによってバックアップ用のメディアを探し出して、変更差分を保存します。

RAMディスクモードでのリストアを想定している場合、次のように実行します。
    # mkfs -t ext3 -L DEB_CONFIG /dev/sdb1
    # flashcfg -B
    # mount LABEL=DEB_CONFIG /mnt
    # touch /mnt/FORCE
    # umount /mnt
リストア先として用意したOpenBlocksに、バックアップメディアを接続し、電源ONすればOKです。「touch /mnt/FORCE」の操作によって、FlashROMからの展開処理はスキップされ、バックアップメディアに保存されている変更差分を展開し環境を復元します。起動後はflashcfgコマンドによって、バックアップメディアから展開された変更差分をFlashROMに保存することで、構築済み環境をコピーしたことになります。バックアップの展開の他、init.shやpost-init.shというshスクリプトを用意すると、展開の前後で実行されますので、ファームウェアの書き換えなどの処理を追加することも出来ます。

RAMディスク領域を増やしたい

OpenBlocksファミリの中でもAX3の4ポート版はSO-DIMMソケットがあるため、大容量のメインメモリを活かすために、tmpfsの領域を増やしたいと問い合わせを時々受けます。あまりスマートな方法ではありませんが、次のよな操作で設定することが出来ます。
    # vi /etc/rc.local
    ~ コメント部 省略 ~
   
    mount -oremount,size=512m /.rw
   
    exit 0
   
    # sh /etc/rc.local
    (動作確認のため)
ただtmpfs領域が増えても、FlashROMのサイズは固定ですので、flashcfgで保存できる容量が増えるわけではありません。テンポラリ領域を増やすことが目的であれば/tmpだけをtmpfsにする方法も有用ですので、その場合は/etc/fstabにあるサンプル設定を基にお試し下さい。RAMディスク上で動作させたいプログラムを増やしたい場合には、FlashROMで収まらないものをSSDやその他ストレージから起動時に一度だけ読み出して展開する等のカスタマイズも考えられます。


 
◆ ストレージ併用モード

基本的な仕組みはRAMディスクモードと全く同じですが、tmpfsの代わりにラベルにDEBIANを設定したext4/ext3のストレージを利用して動作します。この条件のストレージを搭載して電源ONすることで、自動的にストレージ併用モードとして動き始めます。

RAMディスクモードとは違って、専用のコマンド(flashcfg)による保存操作が不要ですので、旧来のサーバになれている方にとっては、こちらの動作モードで触り始めていただくと戸惑いも無く触っていただけるかと思います。この動作モードでは、特別な操作をしなくてもデータは再起動後も残っていますので、ログの蓄積やDBサーバのように多量のデータをため込むような用途が向いています。

RAMディスクモードとの違いを以下にまとめます。

  • ソフトウェア追加の際に容量を気にする必要がありません
    特に小容量のSSDを搭載した場合を除き、通常の利用であれば容量を気にする必要は殆ど無くなるかと思います
     
  • メモリの空き領域を全てアプリケーション実行に利用する事が出来ます
    ただしinitrdが提供する128MBのRAMディスク領域は、ストレージ併用モードでも利用済みです
     
     
  • flashcfgコマンドによるFlashROMへの保存が不要です
    RAMディスクモードで唯一必要だった特別な操作が無くなり、IAサーバと変わらぬ操作で利用する事が出来ます 保存操作が不要になりますので、起動時に復元をすることも無くなります。RAMディスクモードでは、データベースのようにデータを蓄積するタイプの用途は不向きでしたが、ストレージ併用モードではこういった用途でも問題なく対応出来ます。


◆ まとめ

今回はRAMディスクモードを中心に、動作の仕組みを解説させていただきました。本記事が皆様のご理解の助けになれば幸いと思っています。今後もOBDNマガジンやマニュアルへの加筆等で情報公開を実施していきたいと思っておりますので、ご不明な点やさらに解説を希望される内容等、ご希望がございましたら是非OBDNマガジンへのコメント等でご連絡いただければ幸いです。




◆ 用語解説

  • ファームウェア
    Linuxカーネルとinitrdを結合したものです。出荷時からFlashROMに格納されており、更新バージョンがリリースされた場合は、apt-get upgradeによってファームウェアを含むDebianパッケージがダウンロードされ、FlashROMへの反映が行われます。
  • initrd
    Initial Ramdiskの略称です。従来は各種Linuxディスリビューションのインストーラで利用されており、カーネルを書き込んだFDとinitrdを書き込んだFDとして利用されたり、起動時にSCSI等のストレージデバイスのモジュールをロードする仕組みなどで利用されたいました。現在はinitramfsという別の手法が利用されており、initrdはあまり使われていないようです。
  • tmpfs
    Linuxで利用可能なファイルシステムの一種です。initrdはブロックデバイスとして扱われるため使うまでに初期化(mkfs)して使いたいファイルシステムの作成が必要ですが、tmpfsはオプションでメモリサイズを指定するだけで即座にファイルシステムとしてマウントできます。また指定したメモリサイズは、即座に割り当てがかかるわけではなく、実際に消費された分した割り当てされないため無駄なく利用出来ます。
  • unionfs
    複数のファイルシステムを透過的に重ねて、統合した結果を1つのファイルシステムとして見せることが出来ます。NFSにルートファイルシステムを構築して、ホームディレクトリのみをローカルストレージに保存する場合や、Live DVD等でユーザーデータをUSBメモリに保存する場合など、テンプレート化されリードオンリーで提供される共通のユーザーランドを、リードオンリーであることを意識させずに利用させるといった用途で利用されています。

今週末は、OSC 2013 Hamamatsu に出展します。

$
0
0

今週末の、「OSC 2013 Hamamatsu」 にてOpenBlocksの展示を行います。
開催概要概要は以下の通りです。

--

日程:2013年2月9日(土) 10:00~18:00

会場:浜松市市民協働センター 2F ギャラリー
   (JR浜松駅 徒歩8分、または 遠州鉄道西鹿島線 遠州病院駅 徒歩2分) [アクセスマップ]

費用:無料

内容:オープンソースに関する最新情報の提供
   ・展示 - オープンソースコミュニティ、企業・団体による展示
   ・セミナー - オープンソースの最新情報を提供

主催:オープンソースカンファレンス実行委員会

後援湖西市市民活動支援事務局
   浜松市市民協働センター

企画運営:株式会社びぎねっと

--

OpenBlocks A Familyの展示のほか、OBDNマガジンに掲載された事例などを配布します。
是非お立ち寄り下さい。


USBシリアルコンバータを使用したコンソール接続について

$
0
0
ノートPCをOpenBlocksのコンソールにする場合、よほど古いものを使わない限り、RS-232Cの口がないため、USBシリアルインタフェースを使う必要があります。

自分の場合も、通常はRATOCのREX-USB60F(FTDI chip)を使用しているのですが、先日出張先のどこかで置いてきてしまい、同じものを買うのも悔しいので、秋葉原でノーブランドのUSBシリアルコンバータ(PL2303)を買ってきました。



PCはWindows7で、Prolificのドライバは自動で導入されます。また、Prolificのサイトからドライバ一式をダウンロードしてドキュメントを読むと、Windows7の場合は、ネットワーク越しのupdateで最新版が適用されるようです。

ご存知の方も多いとは思いますが、このchipsetを使ったUSBシリアルコンバータは、115200bpsで使用するとデータを落としやすいという話が多く、今回使用したモジュールでも、Teratermの使用では度々障害が出ました。
ただ、puttyで使用する限りは問題なく使えていますので、このモジュールを使用する場合はputtyを使用してください。

PuTTY: A Free Telnet/SSH Client

--
*2/27 puttyなら問題なく使えるという指摘がありましたので、puttyで検証し、訂正しました。
Viewing all 98 articles
Browse latest View live