2017年10月29日日曜日

VXLAN入門!CentOS 7を使ってVXLANを設定する方法

vSphere NSXなどのSDN (Software Defined Network)の技術として利用されているVXLANであるが、いまいちどういうものか理解できていない。そこで、VXLANについて調べてみた内容をまとめるとともに、CentOS 7を使って実際にVXLANによる通信をしてみることにした。

VXLANとは?

VXLANとはVirtual eXtensible LANの略称となる。

もともとネットワーク仮想化といえば、昔からVLAN (Virtual LAN)が利用されていた。VLANはL2のイーサネットフレームで機能実装されており、物理的なネットワークケーブルが1本であったとしても、VLAN IDを付与することで、複数のネットワークセグメントの通信をできるようにする技術となる。VLANを使うことで、物理的なネットワーク機器やケーブル本数を削減し、用途別にネットワークの論理分割が実現できる。

VXLANはUDPパケットのデータ部以降で実装されており、実際の通信に用いるイーサネットフレームはカプセル化されている。VXLANを用いた際のイーサネットフレームの構造を以下に図示する。


カプセル化されているため、既存ネットワークへのVXLAN導入時の影響が非常に少ないという利点がある。また、本来は別のL2ネットワークセグメントであるサーバーであっても同一VXLANで通信させることで、あたかも同じセグメントでの通信をしているように振る舞うことができる。

他にもVLAN IDは12bit長であるため、0と4095の予約分を除く1~4094の範囲の4094個しか作ることができず、大規模なネットワークなどでは数が不足するという課題があった。VXLANではVNI (VXLAN Network Identifier)が24bit長となっており、1600万個ものネットワーク分割ができるようになっている。

今回は、異なるL2ネットワークセグメントに所属するCentOS 2台でVXLANを設定し、同一セグメントのサーバーとして通信できるよう設定を実施する。

構成と注意点

今回の構成は以下の通りとなる。途中に仮想ネットワーク機器のVyOSを挟み、L3ルーティングを行うネットワーク構成としている。ここにVXLANを導入し、同一セグメントとして通信できるように構成する。


VXLANでは通信先サーバーを探す仕組みとして、ユニキャストモードとマルチキャストモードの2通りの設定がある。これはVXLANの通信の終端であるVTEP (VXLAN Tunnel End Point)が通信先のVTEPを探す際に、ユニキャストを使うかマルチキャストを使うかの違いとなる。今回の構成の場合、VTEPはCentOSのサーバーのNIC (ens160)となる。

ルーターはVyOSを利用したが、VyOSでは以下URLに記載の通り、現時点ではMulticast Routingに対応しておらず、L2セグメントを越えたマルチキャスト通信を実装することができない。

・VyOS - Multicast Routing
https://forum.vyos.net/showthread.php?tid=26935

したがって、今回の環境では、ユニキャストモードでVXLANを実装する必要がある。

設定手順

サーバーAとサーバーBの設定はほぼ同一となる。まずは、サーバーAから設定を行うこととする。

サーバーA側の設定

設定はすべてipコマンドで行う。設定するVXLANの情報は以下の通り。

------------------------------
◆サーバA VXLAN設定
・インターフェース名:vxlan0
・VNI:77
・ユニキャスト先VTEP:192.168.55.101
・VXLANで使用するUDPポート:4789
・VTEP:自身のNIC (ens160)
------------------------------

コマンドは以下の通りとなる。

# ip link add vxlan0 type vxlan id 77 remote 192.168.55.101 dstport 4789 dev ens160

dstportでポート番号4789で指定しているが、省略した場合、8472のポートが利用されてしまうので注意。これは、当初VXLANはUDP/8472を使用するように標準化が進められていたが、RFC 7348で規格化された際に、UDP/4789と変更となったことが原因のようだ。

なお、今回は実施しないが、マルチキャストモードの設定コマンドは以下となる。下線部が異なる点となる。

# ip link add vxlan0 type vxlan id 77 group 239.0.0.1 dev ens160 dstport 4789

設定後、確認をしてみると、コマンドを実行した通りの設定が投入されていることがわかる。

# ip -d link show vxlan0
------------------------------
11: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1000
    link/ether 6a:2c:c1:bd:5a:2d brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 77 remote 192.168.55.101 dev ens160 srcport 0 0 dstport 4789 ageing 300 addrgenmode eui64
------------------------------

次にvxlan0のインターフェースをupさせ、IPアドレスを付与する。

# ip link set up vxlan0
# ip address add 172.24.77.101/24 dev vxlan0

再度、設定を確認してみる。

# ip addr show vxlan0
------------------------------
11: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN qlen 1000
    link/ether 6a:2c:c1:bd:5a:2d brd ff:ff:ff:ff:ff:ff
    inet 172.24.77.101/24 scope global vxlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::682c:c1ff:febd:5a2d/64 scope link
       valid_lft forever preferred_lft forever
------------------------------

これでサーバーA側の設定は完了となる。

なお、ipコマンドではOSを再起動するとネットワーク設定が削除されてしまう。再起動しても設定が消えないようにする方法は残念ながら見つけることができなかったので、起動時に設定コマンドを実行するスクリプトなどを作って対応するしかなさそうだ。

サーバーB側の設定

設定するVXLANの情報は以下の通り。

------------------------------
◆サーバB VXLAN設定
・インターフェース名:vxlan0
・VNI:77
・ユニキャスト先VTEP:192.168.11.101
・VXLANで使用するUDPポート:4789
・VTEP:自身のNIC (ens160)
------------------------------

手順はサーバーA側と同じなので、ひたすら設定を行う。

# ip link add vxlan0 type vxlan id 77 remote 192.168.11.101 dstport 4789 dev ens160
# ip -d link show vxlan0
------------------------------
7: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT qlen 1000
    link/ether 9e:4a:3c:f4:55:2e brd ff:ff:ff:ff:ff:ff promiscuity 0
    vxlan id 77 remote 192.168.11.101 dev ens160 srcport 0 0 dstport 4789 ageing 300 addrgenmode eui64# ip link set up vxlan0
------------------------------

# ip link set up vxlan0
# ip address add 172.24.77.102/24 dev vxlan0
# ip addr show vxlan0
------------------------------
7: vxlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN qlen 1000
    link/ether 9e:4a:3c:f4:55:2e brd ff:ff:ff:ff:ff:ff
    inet 172.24.77.102/24 scope global vxlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::9c4a:3cff:fef4:552e/64 scope link
       valid_lft forever preferred_lft forever
------------------------------

通信確認

設定が完了したので、サーバーBからpingを打ち、サーバAにてパケットを確認してみる。firewalldが動作しているとping疎通に失敗するようなので、事前に両方のサーバーでfirewalldを停止しておこう。

# systemctl stop firewalld

pingを実行すると、VXLANにて付与したIPアドレスで問題なく疎通ができた。

# ping 172.24.77.101
------------------------------
PING 172.24.77.101 (172.24.77.101) 56(84) bytes of data.
64 bytes from 172.24.77.101: icmp_seq=1 ttl=64 time=0.783 ms
64 bytes from 172.24.77.101: icmp_seq=2 ttl=64 time=0.387 ms
------------------------------

tcpdumpでパケットを確認してみる。tcpdumpではVXLANの中の通信内容も見ることができるが、そのまま貼り付けると見づらいので若干表示を整形しコメントを付与した。

# tcpdump -i ens160 src host 192.168.55.101 -n -v
------------------------------
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 65535 bytes

18:00:49.350813 IP (tos 0x0, ttl 63, id 16265, offset 0, flags [none], proto UDP (17), length 134)
192.168.55.101.40463 > 192.168.11.101.4789: VXLAN, flags [I] (0x08), vni 77
↑UDP/4789で通信

IP (tos 0x0, ttl 64, id 64215, offset 0, flags [DF], proto ICMP (1), length 84) 172.24.77.102 > 172.24.77.101: ICMP echo request, id 12775, seq 1, length 64
↑実際のVXLANの中の通信内容。pingのICMP通信(echo request)

18:00:50.351166 IP (tos 0x0, ttl 63, id 16621, offset 0, flags [none], proto UDP (17), length 134) 192.168.55.101.40463 > 192.168.11.101.4789: VXLAN, flags [I] (0x08), vni 77
IP (tos 0x0, ttl 64, id 64483, offset 0, flags [DF], proto ICMP (1), length 84) 172.24.77.102 > 172.24.77.101: ICMP echo request, id 12775, seq 2, length 64
------------------------------

(参考) VXLANインターフェース削除

VXLANインターフェースが不要となった場合の削除コマンドは以下の通りとなる。

# ip link delete vxlan0

2017年10月25日水曜日

VyOSのコンソールで"INIT Id "TO" respawning too fast: disabled 5 minutes"の表示を消す

とある検証のためVyOSを新規インストールした際に、コンソール画面に以下のようなメッセージが定期的に出力されることがわかった。

------------------------------
INIT Id "TO" respawning too fast: disabled 5 minutes
------------------------------


VyOSの初期状態ではシリアルポートの設定が入っているが、仮想マシンにシリアルポートが付いていないことが原因のようだ。

こちらの解決策は2つある。これからそれぞれの方法について記載するが、特に理由がなければVyOSの設定だけで簡単にできる①の実施を推奨する。

解決策①:シリアルポートの設定を削除

VyOSの該当のシリアルポートの設定は以下となる。

vyos@t5100vyos:~$ conf
vyos@t5100vyos# show system console
------------------------------
 device ttyS0 {
     speed 9600
 }
------------------------------

シリアルポートが無いのでコンソールに関する設定を全部削除してしまえばよい。削除コマンドは以下の通りとなる。

vyos@t5100vyos:~$ conf
vyos@t5100vyos# delete system console
vyos@t5100vyos# compare
------------------------------
[edit system]
-console {
-    device ttyS0 {
-        speed 9600
-    }
-}
------------------------------

commitで設定を確定させるとコンソールの設定がされていない旨の警告が表示されるが、実害が無いので無視する。なお、ESXiの仮想コンソールを使えば引き続きVyOSの操作はできる。

vyos@t5100vyos# commit
------------------------------
[ system console device ttyS0 ]
Warning: Access to system console is unconfigured
------------------------------

vyos@t5100vyos# save
------------------------------
Saving configuration to '/config/config.boot'...
Done
------------------------------

これでしばらく待ってもメッセージが表示されなくなるはず。

解決策②:仮想マシンにシリアルポートを付ける

ESXiの仮想マシンには仮想シリアルポートを付けることが可能である。設定する際には仮想マシンの停止が必要となるので、仮想マシンは停止しておく。

「設定の編集」→「追加」にて「シリアルポート」を選択する。


シリアルポートタイプでは「ファイルに出力」を選択する。


出力ファイルの設定は自由に設定すればよい。今回は仮想マシンと同じフォルダを選択し、「serial1」というファイル名で出力するよう設定する。


以上で仮想マシンの設定は完了となるので、仮想マシンを起動させてしばらく待ってみる。メッセージが表示されなければ問題なく設定できている。

2017年10月23日月曜日

Raspberry Pi Zero Wを購入してGPIO Hammer HeaderでGPIOの取り付けをした話

Raspberry Pi 3 Model Bを1台持っているのだが、温度・湿度監視センサーとして利用していることから、それ以外の検証作業に使いにくい状態となっていた。そこで、もう一台Raspberry Piを購入することにしたのだが、せっかくなのでRaspberry Pi Zero Wを購入することにした。

今回はRaspberry Pi Zero Wに対し、Hammer Headerというツールを使ってGPIOピンヘッダーを取り付ける手順について記載する。

Raspberry Pi Zero WとRaspberry Pi 3 Model Bの違い

2製品の違いは大きさだけではなく、性能にも差があることに注意する。特にRaspberry Pi Zero WはCPUがシングルコアなので、重い処理や複数の処理をこなすことには向いていない。

  Raspberry Pi Zero W Raspberry Pi 3 Model B
大きさ すごく小さい 小さい
CPU シングルコア 1GHz クアッドコア 1.2GHz
メモリ 512MB 1GB
USBポート 1個 (Micro USB) 4個
ネットワーク 無し 10/100Mbpsポート x 1
無線ネットワーク IEEE 802.11 b/g/n 2.4 GHz IEEE 802.11 b/g/n 2.4 GHz
Bluetooth Bluetooth 4.1 Bluetooth 4.1
映像出力 mini HDMI HDMI

購入したもの

Amazonで売っている以下セットを購入した。Raspberry Pi Zero WはUSBポートがMicro USBだったり、HDMI端子がmini HDMIだったりするので、変換キットも同梱されているものを最初は選ぶとよいだろう。



内容物としては以下の通り。

・Raspberry Pi Zero W本体
・公式ケース
・USB電源&ケーブル
・8GB microSDカード (NOOBS書き込み済み)
・mini HDMI → 標準HDMI変換アダプター
・Micro USB → 標準USB変換アダプター
・GPIOピンヘッダー (使用する場合ははんだ付けが必要)

付属するmicroSDカードにはNOOBSがインストール済みなので初期設定が楽になる。ただし、初めてRaspberry Piに触るのであれば、経験のためにNOOBSのインストールから実施するのもあり(手順はこちら)。

GPIOをはんだ無しで取り付けるGPIO Hammer Header

上述した通り、Raspberry Pi Zero Wは、GPIOピンヘッダーを取り付けたい場合は、はんだ付けが必要となる。私ははんだ付けの経験が久しくなく、失敗するリスクが高かったので、GPIO Hammer Headerという、言ってしまえば力ずくでGPIOヘッダーを圧着するツールを購入した。

なお、私が購入した際は1,000円未満の金額だったが、時期によっては倍くらいになっている模様。



実際のRaspberry Pi Zero WとHammer Header

Raspberry Pi Zero Wは本体が小さいこともあって、1個の小さなビニール袋に入る分量で届いた。


袋から取り出してみるとこんな感じ。


こちらはHammer Header。


袋には「海賊ロボ忍者さる」と記載されている。意味は以下を参照。

・スイッチサイエンス マガジン - Pimoroniがやってきた!
http://mag.switch-science.com/2017/08/23/pimoroni/


Hammer Headerは、専用のGPIOピンヘッダー(オス型、メス型の2種類)とアクリル製のパーツで構成されている。アクリル製の板が2枚入っているが、作業にはGPIO部分に穴が開いている板を使用する。


GPIOピンヘッダーは基盤との接続部分が膨らんでおり、ここをハンマーで叩いてはめ込むことで圧着されるという仕組みになっているようだ。


Hammer HeaderによるGPIO取り付け

まず、GPIO部に穴が開いている板にネジを通し、その上にRaspberry Pi Zero Wを乗せる。


次にGPIOピンヘッダーを乗せる。


細長いアクリル製の板をさらに上に乗せて、、、


これをハンマーで叩く!叩くといっても強い力は不要で、均等に刺さるように、ちょっとずつ叩いていく感じ。


最終的に以下のような状態になる。


GPIOピンヘッダー接続部の膨らんでいる箇所がはみ出しており、ちょっと深く差しすぎた感があるが、この状態で温度センサーを付けると正常に値の取得ができたので、問題なく使えそうだ。

2017年10月6日金曜日

Amazonで売ってる最安値のUSB温度計「TEMPer」をRaspberry Piで試してみた

AmazonでUSB温度計を検索すると、最安値で出てくる以下のような商品がある。



いろんな商品名で販売されているが、中身はTEMPerという製品のようだ。今回、このTEMPerを試すことができる機会があったので、実際に温度計測を実施してみることにした。


Amazonで売っているこれらの製品には、Windows用の温度計測ツールは用意されているようだが、Linux用は用意されていない。しかし、GitHubには様々な計測用のスクリプトが存在しているようなので、そちらを利用することにする。

当初はESXiのUSBポートに刺してパススルーして、Linuxから使うことを想定していたが、このUSB温度計はパススルーできない仕様のようで、うまく仮想マシンに認識させることができなかった。そこで、Raspberry PiのUSBポートにTEMPerを接続して、温度計測を実施してみることにした。

TEMPerを接続する

とりあえず、TEMPerをRaspberry PiのUSBポートに刺してみる。

lsusbで確認すると、下線部のデバイスが増えていることが確認できる。これがTEMPerとなる。

$ lsusb
------------------------------
Bus 001 Device 004: ID 0c45:7401 Microdia
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
------------------------------

スクリプトをインストールする

今回利用するスクリプトはこちら。

・GitHub - padelt/temper-python
https://github.com/padelt/temper-python

まずは、git cloneでスクリプトを入手する。

$ git clone https://github.com/padelt/temper-python.git
------------------------------
Cloning into 'temper-python'...
remote: Counting objects: 603, done.
remote: Total 603 (delta 0), reused 0 (delta 0), pack-reused 603
Receiving objects: 100% (603/603), 138.40 KiB | 263.00 KiB/s, done.
Resolving deltas: 100% (364/364), done.
Checking connectivity... done.
------------------------------

入手したファイルは以下の通り。setup.pyがインストールするためのPythonスクリプトとなる。

$ cd temper-python/
$ ls -l
------------------------------
-rw-r--r-- 1 pi pi  1232  9月 23 15:44 CHANGELOG.md
-rw-r--r-- 1 pi pi  5443  9月 23 15:44 DEVELOPMENT.md
-rw-r--r-- 1 pi pi 32612  9月 23 15:44 LICENSE.md
-rw-r--r-- 1 pi pi    18  9月 23 15:44 MANIFEST.in
-rw-r--r-- 1 pi pi 14903  9月 23 15:44 README.md
drwxr-xr-x 2 pi pi  4096  9月 23 15:44 etc
-rw-r--r-- 1 pi pi   886  9月 23 15:44 setup.py
drwxr-xr-x 2 pi pi  4096  9月 23 15:44 temperusb
------------------------------

前提となるライブラリをインストールする。なお、snmpdは外部からSNMPを使って温度取得するために必要となるもので、スクリプトのみで温度を取得するだけであればインストール不要となる。

$ sudo apt-get install python-usb python-setuptools snmpd
------------------------------
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
python-setuptools はすでに最新版です。
python-setuptools は手動でインストールしたと設定されました。
以下の追加パッケージがインストールされます:
  libperl5.20 libsensors4 libsnmp-base libsnmp30 perl perl-base perl-modules
提案パッケージ:
  lm-sensors snmp-mibs-downloader perl-doc libterm-readline-gnu-perl
  libterm-readline-perl-perl libb-lint-perl libcpanplus-dist-build-perl
  libcpanplus-perl libfile-checktree-perl libobject-accessor-perl snmptrapd
以下のパッケージが新たにインストールされます:
  libperl5.20 libsensors4 libsnmp-base libsnmp30 python-usb snmpd
以下のパッケージはアップグレードされます:
  perl perl-base perl-modules
アップグレード: 3 個、新規インストール: 6 個、削除: 0 個、保留: 7 個。
9,416 kB 中 5,709 kB のアーカイブを取得する必要があります。
この操作後に追加で 6,785 kB のディスク容量が消費されます。
続行しますか? [Y/n] y

~(以下略)~
------------------------------

次に、setup.pyを実行してスクリプトをインストールするのだが、以下の通りエラーで失敗してしまった。

$ sudo python setup.py install
------------------------------
Traceback (most recent call last):
  File "setup.py", line 10, in <module>
    long_description=open('README.md', encoding='utf-8').read(),
TypeError: 'encoding' is an invalid keyword argument for this function
pi@t3015rasp:~/temper-python $ file -i README.md
README.md: text/plain; charset=utf-8
------------------------------

どうやら、pythonのバージョンの問題のように思われる。Raspbianでは、PythonコマンドはPython2.7のシンボリックリンクになっているので、Python3コマンド(Python3.4コマンドのシンボリックリンク)で試してみると、問題なくインストールに成功した。

$ sudo python3 setup.py install
------------------------------
running install
Checking .pth file support in /usr/local/lib/python3.4/dist-packages/
/usr/bin/python3 -E -c pass
TEST PASSED: /usr/local/lib/python3.4/dist-packages/ appears to support .pth files
running bdist_egg
running egg_info
creating temperusb.egg-info
writing requirements to temperusb.egg-info/requires.txt
writing temperusb.egg-info/PKG-INFO
writing dependency_links to temperusb.egg-info/dependency_links.txt
writing entry points to temperusb.egg-info/entry_points.txt
writing top-level names to temperusb.egg-info/top_level.txt
writing manifest file 'temperusb.egg-info/SOURCES.txt'
reading manifest file 'temperusb.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'temperusb.egg-info/SOURCES.txt'
installing library code to build/bdist.linux-armv7l/egg
running install_lib
running build_py
creating build
creating build/lib
creating build/lib/temperusb
copying temperusb/cli.py -> build/lib/temperusb
copying temperusb/snmp.py -> build/lib/temperusb
copying temperusb/__init__.py -> build/lib/temperusb
copying temperusb/temper.py -> build/lib/temperusb
creating build/bdist.linux-armv7l
creating build/bdist.linux-armv7l/egg
creating build/bdist.linux-armv7l/egg/temperusb
copying build/lib/temperusb/cli.py -> build/bdist.linux-armv7l/egg/temperusb
copying build/lib/temperusb/snmp.py -> build/bdist.linux-armv7l/egg/temperusb
copying build/lib/temperusb/__init__.py -> build/bdist.linux-armv7l/egg/temperusb
copying build/lib/temperusb/temper.py -> build/bdist.linux-armv7l/egg/temperusb
byte-compiling build/bdist.linux-armv7l/egg/temperusb/cli.py to cli.cpython-34.pyc
byte-compiling build/bdist.linux-armv7l/egg/temperusb/snmp.py to snmp.cpython-34.pyc
byte-compiling build/bdist.linux-armv7l/egg/temperusb/__init__.py to __init__.cpython-34.pyc
byte-compiling build/bdist.linux-armv7l/egg/temperusb/temper.py to temper.cpython-34.pyc
creating build/bdist.linux-armv7l/egg/EGG-INFO
copying temperusb.egg-info/PKG-INFO -> build/bdist.linux-armv7l/egg/EGG-INFO
copying temperusb.egg-info/SOURCES.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying temperusb.egg-info/dependency_links.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying temperusb.egg-info/entry_points.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying temperusb.egg-info/requires.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
copying temperusb.egg-info/top_level.txt -> build/bdist.linux-armv7l/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents...
creating dist
creating 'dist/temperusb-1.5.3-py3.4.egg' and adding 'build/bdist.linux-armv7l/egg' to it
removing 'build/bdist.linux-armv7l/egg' (and everything under it)
Processing temperusb-1.5.3-py3.4.egg
Copying temperusb-1.5.3-py3.4.egg to /usr/local/lib/python3.4/dist-packages
Adding temperusb 1.5.3 to easy-install.pth file
Installing temper-poll script to /usr/local/bin
Installing temper-snmp script to /usr/local/bin

Installed /usr/local/lib/python3.4/dist-packages/temperusb-1.5.3-py3.4.egg
Processing dependencies for temperusb==1.5.3
Searching for pyusb>=1.0.0rc1
Reading https://pypi.python.org/simple/pyusb/
Best match: PyUSB 1.0.0
Downloading https://pypi.python.org/packages/8a/19/66fb48a4905e472f5dfeda3a1bafac369fbf6d6fc5cf55b780864962652d/PyUSB-1.0.0.tar.gz#md5=c8a571bfdba778555156af3facaea6fc
Processing PyUSB-1.0.0.tar.gz
Writing /tmp/easy_install-f2wopxqc/pyusb-1.0.0/setup.cfg
Running pyusb-1.0.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-f2wopxqc/pyusb-1.0.0/egg-dist-tmp-3sda3exd
zip_safe flag not set; analyzing archive contents...
Adding pyusb 1.0.0 to easy-install.pth file

Installed /usr/local/lib/python3.4/dist-packages/pyusb-1.0.0-py3.4.egg
Finished processing dependencies for temperusb==1.5.3
------------------------------

温度を計測してみる

それでは、温度取得コマンドを叩いてみる。が、失敗。

$ temper-poll
------------------------------
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/temperusb-1.5.3-py3.4.egg/temperusb/temper.py", line 95, in __init__
  File "/usr/local/lib/python3.4/dist-packages/temperusb-1.5.3-py3.4.egg/temperusb/temper.py", line 164, in lookup_sensor_count
  File "/usr/local/lib/python3.4/dist-packages/pyusb-1.0.0-py3.4.egg/usb/core.py", line 841, in product
  File "/usr/local/lib/python3.4/dist-packages/pyusb-1.0.0-py3.4.egg/usb/util.py", line 314, in get_string
ValueError: The device has no langid

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/bin/temper-poll", line 9, in <module>
    load_entry_point('temperusb==1.5.3', 'console_scripts', 'temper-poll')()
  File "/usr/local/lib/python3.4/dist-packages/temperusb-1.5.3-py3.4.egg/temperusb/cli.py", line 38, in main
  File "/usr/local/lib/python3.4/dist-packages/temperusb-1.5.3-py3.4.egg/temperusb/temper.py", line 420, in __init__
  File "/usr/local/lib/python3.4/dist-packages/temperusb-1.5.3-py3.4.egg/temperusb/temper.py", line 419, in <listcomp>
  File "/usr/local/lib/python3.4/dist-packages/temperusb-1.5.3-py3.4.egg/temperusb/temper.py", line 97, in __init__
AttributeError: 'ValueError' object has no attribute 'message'
------------------------------

原因はsudoを忘れたことによるものだった。sudoを付けて実行すると、0.5秒ほど間があって温度取得に成功した。

$ sudo temper-poll
------------------------------
Found 1 devices
Device #0: 38.4°C 101.2°F
------------------------------

温度計測の精度について

自宅のRaspberry Piでは、DHT11というセンサーを利用した温度計測も実施している。
※詳細は以下記事を参照

・Raspberry Pi + DHT11 + Zabbixによる温度・湿度監視
https://tech-mmmm.blogspot.jp/2017/08/raspberry-pi-dht11-zabbix.html

TEMPerの計測温度が38.4℃の時のDHT11の温度は32℃となっており、TEMPerの方が計測温度がかなり高い。

これは、Raspberry Pi本体の温度がTEMPer本体に伝わり熱くなってしまうことが原因で、温度が高く計測されてしまっているようだ。したがって、Raspberry Pi本体の熱を伝わらないようにするために、USB延長ケーブルなどで接続する必要がありそうだ。

実際にUSB延長ケーブルでTEMPerを接続すると、以下の通りほぼ同じ温度での計測ができることが確認できた。

・DHT11:33℃
・TEMPer:32.6℃

人気の投稿