Raspberry Pi 2 から SORACOM Beam を使ってみる

SORACOM Air を Raspberry Pi 2 & L-03D で動かしてみる - fagoken’s diary の続き。

SORACOM Beam の Getting Started を試してみる。ほぼ、書いてある手順通りで echo サーバに telnet できたので、それ以外の部分のみ書きます。 

必要な通信だけ SORACOM Air を経由させる

SORACOM Air は従量課金されてしまうので、通信費をケチるための検証環境向けのネットワーク設定です。

Raspberry Pi の LAN ポートに有線 LAN が接続されていて、有線側からインターネットへ疎通している前提です。まず、 Raspbeery Pi のデフォルトルートは有線 LAN 側に向けておきます。もし、DHCP で IP アドレスをもらっているなら、すでに設定されているはずです(route コマンドで確認できます)。次に、SORACOM Air 経由で通信したいホスト(今回の場合は beam.soracom.io)の IP アドレスを、ppp インターフェースの静的経路として設定します。これで、beam.soracom.io 向けの通信だけ、SORACOM Air 経由になります。なお、beam.soracom.io に紐付いている IP アドレスが変更された場合は、再度静的経路を設定する必要があります。

注意点としては、DNS サーバの設定です。SORACOM Air で ppp 接続を確立した際に設定される、SORACOM の DNS サーバ (169.254.0.53,169.254.1.53) は SORACOM Air 経由からしかアクセスできないようです。このため、 /etc/resolv.conf を編集して、"nameserver 8.8.8.8" (もしくは、DHCPでもらった有線LAN側のDNSサーバ)が一番上に来るよう書き換えます。これで無事名前解決までできるようになります。

この設定にしておけば、apt-get など通常の通信は有線LAN経由になるのでダウンロードが早いです。また、Raspbian のデフォルト設定だと、何もしていなくても NTP など余計な通信を送受信してしまうのでこのネットワーク設定にしておくと安心です。  

※ 前回のブログの設定でデフォルトルートをSORACOM Airにしていたので削除する
pi@raspberrypi ~ $ sudo route del default
※ 有線 LAN 側のゲートウェイをデフォルトルートに設定する
pi@raspberrypi ~ $ sudo route add default gw 192.168.0.1

pi@raspberrypi ~ $ sudo route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
10.64.64.64 * 255.255.255.255 UH 0 0 0 ppp0
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0

pi@raspberrypi ~ $ ping beam.soracom.io
PING beam.soracom.io (169.254.254.169) 56(84) bytes of data.
pi@raspberrypi ~ $ sudo route add 169.254.254.169 dev ppp0
※ ここで 169.254.254.169(beam.soracom.io) 向けの通信は、ppp0 (SORACOM Air) 経由で
   送信するよう静的経路を設定している

pi@raspberrypi ~ $ telnet 169.254.254.169 8023
Trying 169.254.254.169...
Connected to 169.254.254.169.
Escape character is '^]'.
Hello Soracom Beam Client IMSI:xxxxxxxxxxxxxxx !
Soracom Beeeeeeeeeeeeeam!!!!!
Soracom Beeeeeeeeeeeeeam!!!!!
Hello World
Hello World

SORACOM Air を Raspberry Pi 2 & L-03D で動かしてみる

うわさの IoT 向け SIM である SORACOM Air を Raspberry Pi で使ってみます。 ここでは、docomoLTE 通信対応 USB ドングル L-03D を使って通信をしました。 やり方についてはすでに先人の方々が詳しく書いている(参考参照)ので簡単な手順のみ書きます。

用意するもの

  • Raspberry Pi 2 Model B
  • SORACOM Air
  • L-03D
  • セルフパワーの USB ハブ

手順

  1. SORACOM のユーザコンソールから SIM を登録する
  2. Raspbian JESSIE を SD カードにインストール (Ubuntu)
    • dd if=2015-09-24-raspbian-jessie.img of=/dev/sdc
    • ※ SD カードに対応するデバイスファイル(/dev/sd?)は dmesg などで確認してください
  3. Raspbeery Pi を起動、ログインして必要なソフトウェアをインストール
    • apt-get install usb-modeswitch wvdial
  4. セルフルパワーの USB ハブ経由で L-03D を Raspbeery Pi に接続
  5. /etc/wvdial.conf に下記の内容を書く
  6. sudo wvdial を実行する
  7. ppp インターフェースに IP アドレスがついていれば接続完了(ifconfig などで確認)
  8. SORACOM 経由で通信するには、ppp インターフェースをデフォルトルートに設定する
    • sudo route add default dev ppp0
    • 設定されているルートは route で確認できる
    • すでにデフォルトルートが設定されている場合(DHCPでアドレスをもらっている場合など)は sudo route del default で予め削除しておく
    • ssh で操作している場合、接続が切れないようにお気をつけ下さい
  9. traceroute すると、AWS 経由でインターネットに接続していることがわかる

/etc/wvdial.conf

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Dial Attempts = 3
Modem Type = Analog Modem
Dial Command = ATD
Stupid Mode = 1
Baud = 460800
New PPPD = yes
ISDN = 0
Phone = *99***1#
Carrier Check = no
Modem = /dev/ttyUSB2
APN = soracom.io
Username = sora
Password = sora

成功したときのログ

接続できた時はこのような表示になりました(IP アドレスは伏せてあります)。

pi@raspberrypi ~ $ sudo wvdial
--> WvDial: Internet dialer version 1.61
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Modem initialized.
--> Sending: ATD*99***1#
--> Waiting for carrier.
ATD*99***1#
CONNECT
--> Carrier detected.  Starting PPP immediately.
--> Starting pppd at Sun Oct  4 11:01:01 2015
--> Pid of pppd: 4415
--> Using interface ppp0
--> pppd: �v(ZV
--> pppd: �v(ZV
--> pppd: �v(ZV
--> pppd: �v(ZV
--> pppd: �v(ZV
--> pppd: �v(ZV
--> local  IP address xx.xxx.xxx.xxx
--> pppd: �v(ZV
--> remote IP address 10.64.64.64
--> pppd: �v(ZV
--> primary   DNS address 169.254.0.53
--> pppd: �v(ZV
--> secondary DNS address 169.254.1.53
--> pppd: �v(ZV

ifconfig で確認すると、ppp インターフェースが生えて IP アドレスが付いている。

pi@raspberrypi ~ $ ifconfig ppp
ppp0      Link encap:Point-to-Point Protocol
          inet addr:xx.xxx.xxx.xxx  P-t-P:10.64.64.64  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:5 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:62 (62.0 B)  TX bytes:101 (101.0 B)

デフォルトルートを ppp インターフェースに設定する。

pi@raspberrypi ~ $ sudo route del default
pi@raspberrypi ~ $ sudo route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.64.64.64     *               255.255.255.255 UH    0      0        0 ppp0
192.168.11.0    *               255.255.255.0   U     0      0        0 eth0
pi@raspberrypi ~ $ sudo route add default dev ppp0
pi@raspberrypi ~ $ sudo route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         *               0.0.0.0         U     0      0        0 ppp0
10.64.64.64     *               255.255.255.255 UH    0      0        0 ppp0
192.168.11.0    *               255.255.255.0   U     0      0        0 eth0

traceroute すると1ホップ目で AWS を経由していることがわかる。

pi@raspberrypi ~ $ traceroute 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
 1  ec2-175-41-192-130.ap-northeast-1.compute.amazonaws.com (175.41.192.130)  45.393 ms ec2-175-41-192-128.ap-northeast-1.compute.amazonaws.com (175.41.192.128)  45.175 ms ec2-175-41-192-134.ap-northeast-1.compute.amazonaws.com (175.41.192.134)  45.055 ms
 2  27.0.0.172 (27.0.0.172)  48.160 ms  48.676 ms 27.0.0.154 (27.0.0.154)  48.575 ms
 3  27.0.0.154 (27.0.0.154)  48.476 ms 27.0.0.136 (27.0.0.136)  49.455 ms 27.0.0.154 (27.0.0.154)  49.346 ms
 4  27.0.0.136 (27.0.0.136)  49.251 ms  50.050 ms  49.947 ms
 5  216.239.54.11 (216.239.54.11)  48.956 ms  49.743 ms 15169.tyo.equinix.com (203.190.230.31)  49.639 ms
 6  209.85.143.159 (209.85.143.159)  58.198 ms  38.001 ms 216.239.54.11 (216.239.54.11)  37.700 ms
 7  209.85.255.225 (209.85.255.225)  92.213 ms google-public-dns-a.google.com (8.8.8.8)  41.482 ms  41.232 ms

失敗したときのログ

最初に sudo wvdial した時は、下記のエラーで接続できませんでした。 この時は、「手元のスマホに SORACOM SIM を挿して、一度通信する」「L-03D を一度抜いて再度挿す」をすることで Raspberry Pi でも通信できるようになりました。どちらが効いたのかわかりませんが参考まで。

pi@raspberrypi ~ $ sudo wvdial
--> WvDial: Internet dialer version 1.61
--> Initializing modem.
--> Sending: ATZ
ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Modem initialized.
--> Sending: ATD*99***1#
--> Waiting for carrier.
ATD*99***1#
ERROR
--> Invalid dial command.
--> Disconnecting at Sun Oct  4 10:59:29 2015

参考

仮想マシンを調べてみる その2 〜Intel-VTの仕様書など〜

Intel Virtualization Technology(Intel-VT)の設計・仕様について、Intelのドキュメントをまとめました。ここではCPUの仮想化(VT-xとVT-i)を対象に調べたので、VT-dなどは入っていません。

 

まず、3500ページ弱もあるIntelプロセッサの開発者向けマニュアルからVT関連のチャプターを拾ってみた。抜けはあるかも。

Intel® 64 and IA-32 Architectures Developer's Manual

http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf

 

<Volume 1>

"2.2.11 Intel Virtualization Technology(Intel VT) (in Chapter 2 Intel 64 and IA-32 architectures)"

 

<Volume 3>

"Chapter 23 Introduction to virtual-machine extensions"

"Chapter 24 Virtual-machine control structures"

"Chapter 25 VMX non-root operation"

"Chapter 26 VM entries"

"Chapter 27 VM exits"

"Chapter 28 VMX support for address translation"

"Chapter 29 APIC virtualization and virtual interrupts"

"Chapter 30 VMX instruction reference"

"Chapter 31 Virtual-machine monitor programming considerations"

"Chapter 32 Virtualization of system resources"

"Chapter 33 Handling boundary conditions in a virtual machine monitor"

"Appendix A VMX capability reporting facility"

"Appendix B Field encoding in vmcs"

"Appendix C VMX basic exit reasons"

 

 

その他に、VT-xとVT-iのそれぞれの資料がありました。Intelの公式資料っぽいですが、Developer's Manualとの関係はよくわからず。両方ともVT-x対応のCPUが出荷された2005年の日付なので、当時は、Developer's Manualとは別立てで書かれていたドキュメントがそののち統合された・・・とか?参考までに。

Intel® Vanderpool Technology for IA-32 Processors(VT-x) Preliminary Specification

ftp://ulita.ms.mff.cuni.cz/techdoc/intel/197666_197666.pdf

 

Intel® Vertualization Technology Specification for the Intel Itanium Architecture(VT-i)

ftp://ulita.ms.mff.cuni.cz/techdoc/ia-64/ia64-vti.pdf

 

 

資料を探している途中で見つけた解説スライド。

IntelのIA32向けハードウェア仮想化機構

http://www.yl.is.s.u-tokyo.ac.jp/~shmz/IntelVanderpool20050221.pdf

 

 

 

neocomplcacheでclang_completeを使うときに関数も補完するための設定

neocomplcacheとclang_completeを使って,純粋なC言語(*.c)で関数の補完をしたい.

つまり,"pri"と入力したら"printf f int printf(const char *restrict __format, ...)"と候補を表示して欲しい.

 

まず,neocomplcacheのvimrc設定サンプルに書いてあるneocomplcache_omni_patterns.cの設定をそのまま使うと,"."もしくは"->"の後でしか候補表示してくれないっぽい.重いからわざとこうしてる?

設定:

let g:neocomplcache_omni_patterns.c = '[^.[:digit:] *\t]\%(\.\|->\)'

 

これを次の設定にするとめでたく関数の候補表示ができるようになる.

設定:

let g:neocomplcache_force_omni_patterns.c = '[:alpha:]*'

 

でも,やっぱり表示がけっこう重かったり,意図しないところで候補表示が出てしまうので,"("が出てきた以降はclang_completeの候補表示(検索?)をしないような方針で設定する.

例えば,"read"までは候補を表示して欲しいけど"read("を入力して以降は候補表示しない.

 

が!!正規表現難しくて,なかなかうまくいかない.

とりあえず,

設定:

let g:neocomplcache_force_omni_patterns.c = '[:alpha:]*[^(]'

 

と設定すると,"read("を入力した時点で候補表示は消えてくれるのですが,"read(f"のように引数を入力し始めるとまた候補が表示され始めて,一文字入力するごとにかなり重くて困る.

引数入力時は,clang_compleの候補はいらないのに!

どうやって設定すればいいものか...

 

ついでに,次の設定だとサジェストが全くでなくなっちゃうのはなんでだー!(*_*)

let g:neocomplcache_force_omni_patterns.c = '[:alpha:]\+'

 

Dockerコンテナ on CentOS7のyumでError: xz compression not available

Dockerコンテナ on CentOS 7.0の中でこのサイト参考に,yumのepelレポジトリを追加した後,installすると次のようなエラーが出てインストール出来ない.

 >||

# yum install iperf

...

Error: xz compression not available

||<

 

原因は,ホストはcentos7.0なのに,Dockerイメージはcentos6.5を使っていたことでした.

あらためてdocker pull centosをして,centos7イメージを使ったらちゃんと動いた.

 

xz-utilsやbackports.lzma 0.0.3をビルドして入れてみたり,こんなことにしばらく悩んでしまった.

当時はcentos7のイメージがなかったんです,許してください...