Raspberry PiでIoTなシステム開発:リアルタイムパッチは割り込みでも効果を発揮するのか

ジムカーナ用タイマーを作成する為にリアルタイムパッチが当たったカーネルを導入してみました。各種ドキュメントによるとpreempt_rtパッチが当たった場合、config_preemptよりもタイムスライスが短くなり、応答する割り込みが増えるようです。通常のリナックスで10ms、config_preemptで100us、preempt_rtで30usぐらいだそう。ただ公式のサンプルは周期実行のみで、割り込みではどういった挙動を示すのかについては触れられていません。割り込みについては、preempt_rtパッチが性能を向上させるのか、させないのか、ここは自分の目で確認してみようと思いました。その前に公式のサンプルの読解です。そうしないとリアルタイムタスクの作り方が分かりません。https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO何もしないプログラムの割には結構長いんです。 長くなっている理由は2つで、メモリフォルトの防止と高精度なnanosleepの準備でした。mlockallはページがスワップエリアにスワップされるのを防止して、ramに残ることが保証します。stack_prefault はmemsetをダミーで呼び出して、予めスタックフォールトを発生させておくようです。いずれもリアルタイムタスクにコンテクストスイッチが発生する際にページフォルトが起こるのを防止して、応答性を上げるための配慮ですね以下のコードclock_nanosleepとこれを使うための準備です。

clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL); 絶対値としての時間が経過するまでスレッドを停止 clock_gettime(CLOCK_MONOTONIC ,&t);ある単調時間の増加により表現されるクロックの取得 while (t.tv_nsec >= NSEC_PER_SEC) {    t.tv_nsec -= NSEC_PER_SEC;    t.tv_sec++;}t.tv_nsecが1000000を超えている場合にtv_secを増やしてt.tv_nsecを1000000以下にする 

実装してみたコードがこちら。

#include #include #include #include #include #include #include #define MY_PRIORITY (49) /* we use 49 as the PRREMPT_RT use 50                            as the priority of kernel tasklets                            and interrupt handler by default */#define MAX_SAFE_STACK (8*1024) /* The maximum stack size which is                                   guaranteed safe to access without                                   faulting */#define NSEC_PER_SEC    (1000000000) /* The number of nsecs per sec. */void stack_prefault(void) {        unsigned char dummy[MAX_SAFE_STACK];        memset(dummy, 0, MAX_SAFE_STACK);        return;}void myInterrupt0 (void){    if(digitalRead(0)){        digitalWrite(7,HIGH);    } else {        digitalWrite(7,LOW);    };}int main(int argc, char* argv[]){        struct timespec t;        struct sched_param param;        //        int interval = 500000000; /* 500ms*/        int interval = 1000000000; /* 1000ms*///        int interval = 50000; /* 50us*/        /* Declare ourself as a real time task *//*        param.sched_priority = MY_PRIORITY;        if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) {                perror(""sched_setscheduler failed"");                exit(-1);        }*/        /* Lock memory */        if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {                perror(""mlockall failed"");                exit(-2);        }        /* Pre-fault our stack */        stack_prefault();        clock_gettime(CLOCK_MONOTONIC ,&t);        /* start after one second */        t.tv_sec++;        wiringPiSetup () ;        pinMode (7, OUTPUT) ;        wiringPiISR (0, INT_EDGE_BOTH, &myInterrupt0) ;        while(1) {                /* wait until next shot */                clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL);                /* do the stuff *///                printf(""hello\n"");                /* calculate next shot */                t.tv_nsec += interval;                while (t.tv_nsec >= NSEC_PER_SEC) {                       t.tv_nsec -= NSEC_PER_SEC;                        t.tv_sec++;                }   }}

0番ピンの入力で割り込みを発生させて、7番ピンの出力をそれに合わせます。それだけ。外部で作った波形を入力してオシロで観測し、波形の位相差を観測するというもくろみです。配線はこんな感じ。ごちゃごちゃですね。

優先度の確認方法pi@navio-rpi ~ $ sudo ps ax -lスレッドを含めた優先度の確認方法pi@navio-rpi ~ $ ps -em -o pid,tid,policy,pri,ni,rtprio,comm

実際に優先度が設定されているかはこれらのコマンドで確かめます。wiringPiの割り込みはスレッドで動いていて、スレッドの方のコマンドだと、設定数値を同じ数値を確認できます。grepでソートできないのが辛いですが。で、以下が優先度を設定した波形。緑色がPiに入力されているマイコン側の波形です。黄色がPiから出力されている波形。パルス幅が200usなので遅延はおよそ100usぐらいでしょうか。で、優先度を外ます。以下のコードの部分をコメントアウトします。

 struct sched_param param;  param.sched_priority = 48;  if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) {          perror(""sched_setscheduler failed"");          exit(-1);  }

で、これが波形。変わらん、、、。負荷をかけているのか以下のコマンドです。

stress --cpu 99 --vm 10--timeout 10m

周期実行の時にはこのコマンドの影響がもろに出て、非リアルタイムタスクは実行周期がボロボロになりました。が、今回の実験では結果がほぼ同じです。ということは、wiringPiの割り込み、内部的にはpoll()で実装されているのですが、これは実行主体であるタスクの優先度が高くなくても、優先度が高くなるということでしょうか?謎です。で、ここで次に疑問となるのは、リアルタイムパッチが当たっていないカーネルで実行したらどうなるのか。使っているカーネルがパッチが当たっているのでこれだけの応答性があるのかもしれません。そこで普通のRaspbianを用意しました(そのために3時間もかかってしまった。泣ける。)。で同じことをやった結果がこちら。優先度の設定部分は外しています。やっぱり変わらない。負荷をかけてもかけなくても同じです。更にいえばpreempt_rtパッチ有りよりも、割り込みへの反応性がちょっとだけ高い感じがします。これから作ろうとしているシステムにおいて必要なリアルタイム性は割り込み応答性のみなので、こうなるとpreempt_rtパッチを使う必要がありません。本当はもっと定量的に評価をすべきなんだと思いますが、これをpiの反応を更にマイコンで捕捉して時間計測し統計を取るところまでやっていると時間がかかりそうです。普通のカーネルでもオシロの波形がぶれることがほとんど無いので、今回はやっぱり公式のJESSIEをつかって見ようかと思います。   “””

Raspberry PiでIoTなシステム開発:Raspberry Piにホスト名でアクセスする

preempt_rtパッチが当たったディストリビューションイメージのPiはMacのインターネット共有だとそうそう違うアドレスにはならなかったのですが、なぜかJESSIEは頻繁にアドレスが変わります。毎回確認してAtomの設定を変更するのも面倒ですので、bonjourに対応させて、ホスト名でアクセスできるようにしてみます。Raspberry PiでAvahi を使ってホスト名でアクセスする参考にしたのはこちら。プロトコルの体系がわかりやすいです。で、早速avahiをインストールしようとしたら、

pi@raspberrypi:~ $ sudo apt-get install avahi-daemonReading package lists... DoneBuilding dependency tree       Reading state information... Doneavahi-daemon is already the newest version.0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

既に入ってました。macからraspberrypi.localでpingが通ったので、ちゃんと動作している様ですが、Mac側でホスト名を把握していることの確認がしたいです。色々調べたところ、以下のコマンドで確認できました。なぜかプロンプトに帰ってこないのでctrl+cで止めてます。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ dns-sd -B _workstation._tcpBrowsing for _workstation._tcpDATE: ---Sun 07 Feb 2016---12:54:04.091  ...STARTING...Timestamp     A/R    Flags  if Domain               Service Type         Instance Name12:54:04.091  Add        3   4 local.               _workstation._tcp.   raspberrypi [34:76:c5:5d:34:91]12:54:04.091  Add        2  11 local.               _workstation._tcp.   raspberrypi [b8:27:eb:f6:3c:22]^C

が、この方法ではIPが分かりません。IPが要らないためのシステムですが、IPを把握しているということが分からないとどうにも気持ち悪いです。で見つけたのがこちら。Welcome to Tildesoft.comGUIで確認できます。

pi@raspberrypi:~ $ sudo nano /etc/hostname pi@raspberrypi:~ $ sudo nano /etc/hosts

raspberrypiでは長いのでホスト名をpiに変更しました。再起動するとBonjour Browserの表示が勝手に変わっていました。reloadしていません。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ ping pi.localPING pi.local (192.168.2.10): 56 data bytes64 bytes from 192.168.2.10: icmp_seq=0 ttl=64 time=0.429 ms64 bytes from 192.168.2.10: icmp_seq=1 ttl=64 time=0.407 ms^C--- pi.local ping statistics ---2 packets transmitted, 2 packets received, 0.0% packet lossround-trip min/avg/max/stddev = 0.407/0.418/0.429/0.011 mskawauchiyasuo-no-MacBook-Pro:~ yasuo$ ssh pi@pi.localThe authenticity of host 'pi.local (192.168.2.10)' can't be established.RSA key fingerprint is eb:89:80:d7:a1:65:2b:ae:4e:b9:2b:a1:04:db:ac:a3.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added 'pi.local' (RSA) to the list of known hosts.pi@pi.local's password: 

はい、アクセス成功です。これでAtomのremote-ftpが簡単になります。”””

Raspberry PiでIoTなIT:WordPressはダブルクォーテーションを置き換える

Raspberry Piの問題ではありませんが、ちょっとハマってしまった原因がWordpressにあったのでメモ。

先日Raspberry Piの構築方法のメモを書いて、このブログに書いていたのですが、ちょっと横着をして、設定ファイルをブログ記事の本文に直接貼り付けていました。crayonプラグインを導入しているので、一手間かけると、コードはコードとして表示できるのですが、ちょっと面倒くさいんですよね。

で、自分のそのメモを使って再度構築をしていると、wpa_supplicantでエラーが。

pi@raspberrypi ~ $ more /var/log/daemon.log Feb  7 20:32:52 raspberrypi wpa_supplicant[3469]: Line 5: failed to parse ssid '”AP-2F-YU-2.4GHz”'.Feb  7 20:32:52 raspberrypi wpa_supplicant[3469]: Line 5: failed to parse ssid '”AP-2F-YU-2.4GHz”'.Feb  7 20:32:52 raspberrypi wpa_supplicant[3469]: Line 6: Invalid PSK '”jitakun0musen”'.Feb  7 20:32:52 raspberrypi wpa_supplicant[3469]: Line 6: failed to parse psk '”jitakun0musen”'.Feb  7 20:32:52 raspberrypi wpa_supplicant[3469]: Line 7: WPA-PSK accepted for key management, but no PSK configured.Feb  7 20:32:52 raspberrypi wpa_supplicant[3469]: Line 7: failed to parse network block.Feb  7 20:32:52 raspberrypi wpa_supplicant[3469]: Failed to read or parse configuration '/etc/wpa_supplicant/wpa_supplicant.conf'.

パースエラーです。何でここでパースエラー?ネットでは改行コードがおかしいとあるのですべて置き換えてみても、エラーが治りません。でダンプしてみるとこんな状態。

ダブルクォーテーションがe2 80 9dという3バイト文字になっていました。

たしかにエディタ上でみても、両方とも半角ですがフォントが違います。

以下の様に本文に直接貼り付けると、サニタイジングの影響でしょうか、ダブルクォーテーションを置き換えているのですね。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

update_config=1

network={

        ssid=””AP-2F-YU-2.4GHz””

        psk=””jitakun0musen””

}

コード記述用プラグインを使用すると、本来のコードそのままで伝えられます。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdevupdate_config=1network={        ssid=""AP-2F-YU-2.4GHz""        psk=""jitakun0musen""}

WordPressやCMSでブログを書いている方はお気をつけを。”””

Raspberry PiでIoTなシステム開発:ワイヤレスアクセスポイントとして動作させるまで(改訂版)RASPBIAN WHEEZY

Raspberry PiでIoTなシステム開発:ワイヤレスアクセスポイントとして動作させるまで先日書いたこちらの記事が以下の理由により使えないことが判明しました。その他にも色々と問題がありましたので、改訂版マニュアルを以下したためます。Raspberry PiでIoTなIT:WordPressはダブルクォーテーションを置き換える

イメージの取得

公式のダウンロードサイトこれを使います。ローカルでunzipする。

df -h

これでSDが刺さっているドライブのデバイス名をメモ。

sudo dd bs=1m if=~/Downloads/2014-09-09-wheezy-raspbian/2014-09-09-wheezy-raspbian.img of=/dev/rdisk3

eLinuxは1Mになっているけれどもエラーになる。1mで実行。ifはunzipしたイメージを指定。of以下のrdiskxのxはデバイス名の数字disk3s1の3の方に置き換える。

接続

Raspberry PiでIoTなシステム開発:OSXのインターネット共有でIPを割り当ててログインMacのインターネット共有を利用してRaspberry PiにIPを振る。ただしアクセスは次項の通りホスト名で。

ログイン

Raspberry PiでIoTなシステム開発:Raspberry Piにホスト名でアクセスする今のwheezyはavahiがデフォルトでインストールされているようで、いきなりbonjourでホスト名の確認ができます。OSXのターミナルからホスト名でログイン。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ ssh pi@raspberrypi.localWarning: the RSA host key for 'raspberrypi.local' differs from the key for the IP address '192.168.2.10'Offending key for IP in /Users/yasuo/.ssh/known_hosts:9Matching host key in /Users/yasuo/.ssh/known_hosts:11Are you sure you want to continue connecting (yes/no)? yespi@raspberrypi.local's password: Linux raspberrypi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7lThe programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermitted by applicable law.Last login: Mon Feb  8 07:16:17 2016 from kawauchiyasuo-no-macbook-pro.localpi@raspberrypi ~ $

最初の作業

Raspbianを入れたら最初はアップデート、タイムゾーン設定、電源設定変更。

sudo apt-get updatesudo apt-get upgrade

しばらく時間がかかります。

sudo raspi-config

1 Expand Filesystemと4 Internationalization Optionを実行。4ではタイムゾーンをTokyoに設定。起動安定化のため /boot/config.txtを編集。

pi@raspberrypi ~ $ sudo nano /boot/config.txt

末尾に追加。

safe_mode_gpio=4max_usb_current=1

USBドライバ設定の追加

以前は以下の設定を追加していましたが、現在のwheezyでは設定をせずともWN-G150UMを認識しました。設定を間違えると逆にwlan0が消えるので注意。何も触らない方が吉でしょう。

pi@navio-rpi ~ $ sudo vi /etc/udev/rules.d/network_drivers.rulesACTION==""add"",SUBSYSTEM==""usb"", ATTR{idVendor}==""04bb"", ATTR{idProduct}==""094c"", RUN+=""/sbin/modprobe -qba 8192cu""pi@navio-rpi ~ $ sudo vi /etc/modprobe.d/network_drivers.confinstall 8192cu /sbin/modprobe –ignore-install 8192cu $CMDLINE_OPTS; /bin/echo ""04bb 094c"" > /sys/bus/usb/drivers/rtl8192cu/new_id

クライアントとして接続テスト

アクセスポイント化する前にクライアントとしてつながるかをテスト。

pi@navio-rpi ~ $ sudo nano /etc/network/interfaces
auto loiface lo inet loopbackiface eth0 inet dhcpauto wlan0iface wlan0 inet dhcpwpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
pi@navio-rpi ~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdevupdate_config=1# Default networkctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdevupdate_config=1network={ssid=""apname""psk=""hoge""}

インターフェースの再起動

pi@raspberrypi ~ $ sudo ifdown wlan0ifdown: interface wlan0 not configuredpi@raspberrypi ~ $ sudo ifup wlan0

ifconfigでwlan0にIPアドレスが振られていれば成功。

wlan0 Link encap:Ethernet HWaddr 34:76:c5:5d:34:91inet addr:192.168.0.108 Bcast:192.168.0.255 Mask:255.255.255.0UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1RX packets:140 errors:0 dropped:345 overruns:0 frame:0TX packets:27 errors:0 dropped:1 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:186351 (181.9 KiB) TX bytes:4399 (4.2 KiB)

pingは-Iオプションで使用するインターフェースを指定できる。ルーターや外部と通信できることを確認。

ping -I wlan0 192.168.0.1ping -I wlan0 yahoo.com

同じルーターの配下にある別のマシンからルーティングできていることを確認。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ ping 192.168.0.108PING 192.168.0.108 (192.168.0.108): 56 data bytesRequest timeout for icmp_seq 0Request timeout for icmp_seq 164 bytes from 192.168.0.108: icmp_seq=2 ttl=64 time=20.403 ms64 bytes from 192.168.0.108: icmp_seq=3 ttl=64 time=4.651 ms

hostapdのインストール

ドライバ設定を追加しなくてもWN-G150UMを使えたのだからhostapdもそのままいけるのではと試してみたのですが、やはりRealtekの対応版に差し替えないとダメでした。まずは本家をインストールして、Realtek版にバイナリを差し替えます。

pi@raspberrypi ~ $ sudo apt-get install hostapd

Realtekrealtekサイトはダウン比率が高い様ですね。なんとかgetしてください。私が使用したのは「0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zip」です。とりあえずhostapdはGPLのようなので、その部分だけアップしておきます。wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gzpiからはアドレスが指定しにくいので、母艦のMacでダウンロードしてからSFTPで/home/piにアップロード。FileZillaを使っています。Mac用のFTPクライアントとしては一番使いやすいと思います。なのに何故かマイナー。

pi@raspberrypi ~ $ ls0001-RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911.zippi@raspberrypi ~ $ cd RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/pi@raspberrypi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911 $ cd wpa_supplicant_hostapd/pi@raspberrypi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd $ tar zxvf wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gzpi@raspberrypi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd $ cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/pi@raspberrypi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812 $ lsCOPYING README hostapd src wpa_supplicantpi@raspberrypi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812 $ cd hostapd/pi@raspberrypi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ make

出来上がったバイナリを/usr/sbinにコピー。/usr/local/sbinではない。localに入れてしまうと置き換えられずに、コマンドラインから起動したら/usr/local/sbinの方が、起動スクリプトからだと/usr/localから起動してしまう。

pi@raspberrypi ~/RTL8188C_8192C_USB_linux_v4.0.2_9000.20130911/wpa_supplicant_hostapd/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo mv -f hostapd hostapd_cli /usr/sbin/

hostapdの設定

設定ファイルを編集。

pi@raspberrypi ~ $ nano /etc/hostapd/hostapd.conf

もちろんssidとwpa_passphraseは適宜変更で。構文チェックがかなり厳しくちょっとでも間違うとサービスが起動しないので注意。

interface=wlan0driver=rtl871xdrvssid=rpi2hw_mode=gchannel=6macaddr_acl=0auth_algs=1ignore_broadcast_ssid=0wpa=2wpa_passphrase=raspberrypiwpa_key_mgmt=WPA-PSKwpa_pairwise=TKIPrsn_pairwise=CCMP

IPアドレスを固定化

アクセスポイントにする以上IPが変わると困るので固定化。

pi@raspberrypi ~ $ sudo nano /etc/network/interfaces
auto loiface lo inet loopbackiface eth0 inet dhcpauto wlan0iface wlan0 inet staticaddress 192.168.10.1netmask 255.255.255.0

WPASupplicantを停止させる。

sudo mv /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service ~/

ifplugdが作用するとwlan0のIPアドレスが飛んでしまうので、対象をeth0に限定する。

pi@raspberrypi ~ $ sudo nano /etc/default/ifplugd

変更前

INTERFACES=""auto""HOTPLUG_INTERFACES=""all""ARGS=""-q -f -u0 -d10 -w -I""SUSPEND_ACTION=""stop""

変更後

INTERFACES=""eth0""HOTPLUG_INTERFACES=""all""ARGS=""-q -f -u0 -d10 -w -I""SUSPEND_ACTION=""stop""

hostapdの起動

まずはサービスとしてでは無くコマンドラインから起動できるかの確認。

pi@raspberrypi ~ $ sudo hostapd -dd /etc/hostapd/hostapd.conf random: Trying to read entropy from /dev/randomConfiguration file: /etc/hostapd/hostapd.confdrv->ifindex=3l2_sock_recv==l2_sock_xmit=0x0x1c1638BSS count 1, BSSID mask 00:00:00:00:00:00 (0 bits)Allowed channel: mode=1 chan=1 freq=2412 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=2 freq=2417 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=3 freq=2422 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=4 freq=2427 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=5 freq=2432 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=6 freq=2437 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=7 freq=2442 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=8 freq=2447 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=9 freq=2452 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=10 freq=2457 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=11 freq=2462 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=12 freq=2467 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=13 freq=2472 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=14 freq=2484 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=1 freq=2412 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=2 freq=2417 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=3 freq=2422 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=4 freq=2427 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=5 freq=2432 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=6 freq=2437 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=7 freq=2442 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=8 freq=2447 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=9 freq=2452 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=10 freq=2457 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=11 freq=2462 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=36 freq=5180 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=40 freq=5200 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=44 freq=5220 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=48 freq=5240 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=52 freq=5260 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=56 freq=5280 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=60 freq=5300 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=64 freq=5320 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=100 freq=5500 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=104 freq=5520 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=108 freq=5540 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=112 freq=5560 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=116 freq=5580 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=120 freq=5600 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=124 freq=5620 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=128 freq=5640 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=132 freq=5660 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=136 freq=5680 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=140 freq=5700 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=149 freq=5745 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=153 freq=5765 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=157 freq=5785 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=161 freq=5805 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=165 freq=5825 MHz max_tx_power=0 dBmCompleting interface initializationMode: IEEE 802.11g  Channel: 6  Frequency: 2437 MHzRATE[0] rate=10 flags=0x1RATE[1] rate=20 flags=0x1RATE[2] rate=55 flags=0x1RATE[3] rate=110 flags=0x1RATE[4] rate=60 flags=0x0RATE[5] rate=90 flags=0x0RATE[6] rate=120 flags=0x0RATE[7] rate=180 flags=0x0RATE[8] rate=240 flags=0x0RATE[9] rate=360 flags=0x0RATE[10] rate=480 flags=0x0RATE[11] rate=540 flags=0x0Flushing old station entriesDeauthenticate all stations+rtl871x_sta_deauth_ops, ff:ff:ff:ff:ff:ff is deauth, reason=2rtl871x_set_key_opsrtl871x_set_key_opsrtl871x_set_key_opsrtl871x_set_key_opsUsing interface wlan0 with hwaddr 34:76:c5:5d:34:91 and ssid 'rpi2'Deriving WPA PSK based on passphraseSSID - hexdump_ascii(len=4):     72 70 69 32                                       rpi2            PSK (ASCII passphrase) - hexdump_ascii(len=11): [REMOVED]PSK (from passphrase) - hexdump(len=32): [REMOVED]rtl871x_set_wps_assoc_resp_iertl871x_set_wps_beacon_iertl871x_set_wps_probe_resp_ieurandom: Got 20/20 bytes from /dev/urandomGet randomness: len=32 entropy=0GMK - hexdump(len=32): [REMOVED]Get randomness: len=32 entropy=0Key Counter - hexdump(len=32): [REMOVED]WPA: group state machine entering state GTK_INIT (VLAN-ID 0)Get randomness: len=16 entropy=0GTK - hexdump(len=16): [REMOVED]WPA: group state machine entering state SETKEYSDONE (VLAN-ID 0)rtl871x_set_key_opsrtl871x_set_beacon_opsrtl871x_set_hidden_ssid ignore_broadcast_ssid:0, rpi2,4rtl871x_set_aclwlan0: Setup of interface done.Wireless event: cmd=0x8b15 len=20

wlan0: Setup of interface done.と表示されればたぶん成功している。この時点でWifiアクセスポイントとして動作しているはずなので、MacとかiPhoneのアクセスポイント一覧に現れる。プロセスとしても動作しているはず。

pi@raspberrypi ~ $ ps ax | grep hostapd 3658 pts/1    S+     0:00 sudo hostapd /etc/hostapd/hostapd.conf -dd 3659 pts/1    S+     0:00 hostapd /etc/hostapd/hostapd.conf -dd 3671 pts/0    S+     0:00 grep --color=auto hostapd

ここでkillするかctrl+cして次はサービスとして起動させるための設定。initスクリプト(/etc/init.d/hostapd)から参照されている設定ファイルを変更。

pi@raspberrypi ~ $ sudo nano /etc/default/hostapd

こんな感じ。

DAEMON_CONF=""/etc/hostapd/hostapd.conf""

DHCPサーバーのインストール

インストールする必要はなかった。既にインストールされていて、最初のコマンドでアップデートされています。

pi@raspberrypi ~ $ sudo apt-get install isc-dhcp-serverReading package lists... DoneBuilding dependency tree       Reading state information... Doneisc-dhcp-server is already the newest version.0 upgraded, 0 newly installed, 0 to remove and 1 not upgraded.

DHCPサーバーの設定

動作対象のインターフェースの指定とIPの割り当て設定は別々のファイルで行います。こちらは対象インターフェースの指定。

pi@raspberrypi ~ $ sudo nano /etc/default/isc-dhcp-server

ファイル末尾の設定を変更。

INTERFACES=""wlan0""

こちらは割り当て設定。

pi@raspberrypi ~ $ sudo nano /etc/dhcp/dhcpd.conf

この部分をコメントアウト。

#option domain-name ""example.org"";#option domain-name-servers ns1.example.org, ns2.example.org;
ping-check true;subnet 192.168.10.0 netmask 255.255.255.0 {option routers 192.168.10.1;option broadcast-address 192.168.10.255;option subnet-mask 255.255.255.0;option domain-name ""local"";option domain-name-servers 8.8.8.8,8.8.4.4;default-lease-time 600;max-lease-time 7200;range 192.168.10.101 192.168.10.199;}

ここでWifi端末からアクセスして、設定されたIPやDNSアドレスが割り振られていれば成功

おつかれさまでした

長い。これだけの手順を間違わずに再現するのは大変。設定方法が時々変わるので更に大変。そりゃシステムイメージでセットアップしたくなりますよね。

pi@raspberrypi:~ $ sudo service hostapd start

pi@raspberrypi:~ $ sudo service hostapd stop

    “””

Raspberry PiでIoTなシステム開発:ssh Warning: the RSA host key for differs from the key for the IP address

いつからかRaspberry Piにログインしようとしたら、以下の警告文が表示されるようになりました。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ ssh pi@raspberrypi.localWarning: the RSA host key for 'raspberrypi.local' differs from the key for the IP address '192.168.2.10'Offending key for IP in /Users/yasuo/.ssh/known_hosts:9Matching host key in /Users/yasuo/.ssh/known_hosts:11Are you sure you want to continue connecting (yes/no)? yespi@raspberrypi.local's password: Linux raspberrypi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7lThe programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermitted by applicable law.Last login: Mon Feb  8 12:10:07 2016 from kawauchiyasuo-no-macbook-pro.localpi@raspberrypi ~ $

yesと答えればログインできるわけですが、警告無視というのは気持ち悪いですし、ログイン完了まで一手間増えるのも面倒です。対策を探したらこちらに情報が。[Ubuntu]ssh 接続しようとすると「WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!」が表示されるときはクライアント側のキーの問題なんですね。で、これはWindowsなのでMacの場合はこちら。https://gjroo.wordpress.com/2010/10/07/ssh-warning-the-rsa-host-key-for-differs-from-the-key-for-the-ip-address/自分の場合は保存をしておかないといけないホストは特にないので全部削除しました。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ cd .ssh/kawauchiyasuo-no-MacBook-Pro:.ssh yasuo$ lsknown_hostskawauchiyasuo-no-MacBook-Pro:.ssh yasuo$ nano known_hosts kawauchiyasuo-no-MacBook-Pro:.ssh yasuo$ ssh pi@raspberrypi.localThe authenticity of host 'raspberrypi.local (192.168.2.10)' can't be established.RSA key fingerprint is 1e:5f:a9:82:bf:06:e3:a2:fc:4e:b9:51:f7:d6:36:97.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added 'raspberrypi.local,192.168.2.10' (RSA) to the list of known hosts.pi@raspberrypi.local's password: Linux raspberrypi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7lThe programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermitted by applicable law.Last login: Mon Feb  8 12:24:16 2016 from kawauchiyasuo-no-macbook-pro.localpi@raspberrypi ~ $ exitlogoutConnection to raspberrypi.local closed.kawauchiyasuo-no-MacBook-Pro:.ssh yasuo$ ssh pi@raspberrypi.localpi@raspberrypi.local's password:

無事警告無しでログインできるようになりました。(2016/02/09追記)

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ ssh pi@raspberrypi.local@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!Someone could be eavesdropping on you right now (man-in-the-middle attack)!It is also possible that a host key has just been changed.The fingerprint for the RSA key sent by the remote host is19:8d:b0:b4:05:66:a1:67:37:e0:15:29:45:2f:69:2b.Please contact your system administrator.Add correct host key in /Users/yasuo/.ssh/known_hosts to get rid of this message.Offending RSA key in /Users/yasuo/.ssh/known_hosts:1RSA host key for raspberrypi.local has changed and you have requested strict checking.Host key verification failed.

piを再インストールしたら今度はこんなメッセージが。この場合も原因は同じなのでknown_hostsから該当行を削除したらアクセスできました。   “””

Raspberry PiでIoTなシステム開発:nanoのキーボードショートカット・キーバインド

自分は普段Unix系OSをコマンドラインで使うことは無いので、emacsやviが苦手です。一時期Raspberry PiでリモートでJavascriptを編集していたときは、emacsの中に住んでいましたが、今や下界に下ってしまいました。で、こんな人及び同様の多くの人に優しいnanoをよく使うようになりました。が、良くできたショートカットキー一覧があまりありません。公式もわかりにくいです。そんな中で比較的わかりやすいと思ったのがこちら。The Nano Text Editor “””

Raspberry PiでIoTなIT:WheezyとJessieで割り込み性能に違いはあるのか

Raspberry PiでIoTなシステム開発:リアルタイムパッチは割り込みでも効果を発揮するのか先日最新のJessieを使って割り込みレスポンスを実験してみた所なのですが、カーネルの違いで決定論的動作や応答性に違いがあるのか実験してみるべく、Wheezyでも同じ実験をやってみました。結果はこちら。カーネルのバージョン違いで大きな違いが出るわけないのだけれどという想定での実験です。

細かい版

https://youtu.be/ucLWJqxlUPk

拡大版

流石にこちらは想定通り、結果はまず変わりません。時々大きな遅延が出ているようなのですが、これを定量的に計測しようとするとマイコン側に再度入力して測定をしないといけないですね。負荷用のコマンドはこれです。

pi@navio-rpi ~ $ stress --cpu 99 --vm 2 --timeout 10m

念のため大拡大版を。

Wheesy(preempt_rt無し)

Wheesy(preempt_rt有り)

preempt_rt有りの方がぶれ幅が少ないように見えます。ただ遅延が3〜4割減ですね。リアルタイム優先度の決定プロセスが大分と性能に影響を与えているのだと思います。タイムスライスの短縮化も影響しているのでしょう。他のタスクの性能にも影響を与えるはずです。リアルタイムタスクだけでシステムを作るわけでは無いので、システム全体の目的から考えて、どの程度の遅延を許容できるのかという観点から判断をしたいと思います。今回のぼっちプロジェクトでは「ぎりぎりのリアルタイム性能よりはシステム全体のパフォーマンス優先で」いきたいと思います。”””

Raspberry PiでIoTなシステム開発:RASPBIAN JESSIEで同じ事をやってみる アクセスポイント化

Raspberry PiでIoTなシステム開発:ワイヤレスアクセスポイントとして動作させるまで(改訂版)RASPBIAN WHEEZYさあ今度はJESSIE-LITEで挑戦です。基本前のコンテンツをコピーして書いているのですが、余りにそのままだとGoogleからコピーコンテンツを作ったと怒られそうなので、適宜単語を代えています。

imgファイルの取得

Raspbianのダウンロードサイト一週間前にリリースされたばかりでなんだかbleedingな感じですが、挑戦してみます。これを使います。ローカルでunzip。場所はちゃんと覚えておく。

df -h

これでSDが刺さっているドライブのデバイス名をメモ。

sudo dd bs=1m if=~/Downloads/2014-09-09-wheezy-raspbian/2014-09-09-wheezy-raspbian.img of=/dev/rdisk3

eLinuxは1Mになっているけれどもエラーになる。1mで実行。ifはunzipしたイメージを指定。of以下のrdiskxのxはデバイス名の数字disk3s1の3の方に置き換える。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ sudo dd bs=1m if=Documents/mbed/2016-02-03-raspbian-jessie-lite.img of=/dev/rdisk5Password:1392+0 records in1392+0 records out1459617792 bytes transferred in 89.000006 secs (16400199 bytes/sec)

LITEはサイズが小さいので早いです。

接続

Raspberry PiでIoTなシステム開発:OSXのインターネット共有でIPを割り当ててログインMacのインターネット共有を利用してRaspberry PiにIPを振る。ただしアクセスは次項の通りホスト名で。

ログイン

Raspberry PiでIoTなシステム開発:Raspberry Piにホスト名でアクセスするJESSIEもavahiが最初から導入されていました。bonjour browse等でサービスされている名称が分かります。OSXのターミナルからホスト名でログイン。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ ssh pi@raspberrypi.localThe authenticity of host 'raspberrypi.local (192.168.2.10)' can't be established.RSA key fingerprint is 19:8d:b0:b4:05:66:a1:67:37:e0:15:29:45:2f:69:2b.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added 'raspberrypi.local,192.168.2.10' (RSA) to the list of known hosts.pi@raspberrypi.local's password: The programs included with the Debian GNU/Linux system are free software;the exact distribution terms for each program are described in theindividual files in /usr/share/doc/*/copyright.Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extentpermitted by applicable law.

(2016/04/14注記追加)Raspberry PiでIoTなIT:新しく認識されたインターフェースをavahiに自動的に認識させる | 法務ネット:弁護士 川内康雄起動メッセージの中にカーネルバージョンが含まれなくなったようなのでunameで確認。

pi@raspberrypi:~ $ uname -aLinux raspberrypi 4.1.17-v7+ #834 SMP Mon Feb 1 15:17:54 GMT 2016 armv7l GNU/Linux

アップデートとハード的設定

Raspbianを入れたら最初はアップデート、タイムゾーン設定、電源設定変更。

sudo apt-get updatesudo apt-get upgrade

しばらく時間がかかります。

sudo raspi-config

1 Expand Filesystemと4 Internationalization Optionを実行。4ではタイムゾーンをTokyoに設定。再起動するか聞かれるので再起動してログイン。USBポートへの電力供給量を増やすため /boot/config.txtを編集。

pi@raspberrypi ~ $ sudo nano /boot/config.txt

末尾に追加。

safe_mode_gpio=4max_usb_current=1

USBドライバ設定の追加

以前は以下のファイルでIDを設定していましたが、今はすぐにWN-G150UMを認識してくれます。

pi@navio-rpi ~ $ sudo vi /etc/udev/rules.d/network_drivers.rulespi@navio-rpi ~ $ sudo vi /etc/modprobe.d/network_drivers.conf

何もしない状態でiwconfigにデバイスが現れます。realtekという文字が。

pi@raspberrypi:~ $ iwconfigwlan0     unassociated  Nickname:""""          Mode:Managed  Frequency=2.412 GHz  Access Point: Not-Associated             Sensitivity:0/0            Retry:off   RTS thr:off   Fragment thr:off          Power Management:off          Link Quality:0  Signal level:0  Noise level:0          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0          Tx excessive retries:0  Invalid misc:0   Missed beacon:0

Wifiルータにつながるかをチェック

普通のルータに普通につながるかをまずは確認。Wheezyでは以下のファイルを編集していましたが、Jessieでは触りません。

pi@navio-rpi ~ $ sudo nano /etc/network/interfaces

wpa_suppulicant.confだけ編集。生パスワードが嫌な人はwpa_passphraseコマンドで作成。

pi@navio-rpi ~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdevupdate_config=1network={        ssid=""APNAM""        psk=""pass""}

wlan0を起こして見るとなんかエラーが出ますが、これは無視するのが通例のようです。既に起動していたらifdownをしてから。ifconfigでローカルルータのDHCPからIPが取れていれば正解。

pi@raspberrypi:~ $ sudo ifup wlan0ioctl[SIOCSIWAP]: Operation not permittedioctl[SIOCSIWENCODEEXT]: Invalid argumentioctl[SIOCSIWENCODEEXT]: Invalid argumentpi@raspberrypi:~ $ ifconfigeth0      Link encap:Ethernet  HWaddr b8:27:eb:f6:3c:22            inet addr:192.168.2.10  Bcast:192.168.2.255  Mask:255.255.255.0          inet6 addr: fe80::5451:ee7b:51eb:6a2c/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:2109 errors:0 dropped:0 overruns:0 frame:0          TX packets:1389 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:159594 (155.8 KiB)  TX bytes:210149 (205.2 KiB)lo        Link encap:Local Loopback            inet addr:127.0.0.1  Mask:255.0.0.0          inet6 addr: ::1/128 Scope:Host          UP LOOPBACK RUNNING  MTU:65536  Metric:1          RX packets:0 errors:0 dropped:0 overruns:0 frame:0          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)wlan0     Link encap:Ethernet  HWaddr 34:76:c5:5d:34:91            inet addr:192.168.0.108  Bcast:192.168.0.255  Mask:255.255.255.0          inet6 addr: fe80::84f:1a0b:2d1e:4137/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:101 errors:0 dropped:7 overruns:0 frame:0          TX packets:77 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:22088 (21.5 KiB)  TX bytes:12223 (11.9 KiB)

pingは-Iを使えば出ていくルートを固定化できます。ルーターや下界と導通しているかチェック。

pi@raspberrypi:~ $ ping -I wlan0 192.168.0.1PING 192.168.0.1 (192.168.0.1) from 192.168.0.108 wlan0: 56(84) bytes of data.64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=3.66 ms64 bytes from 192.168.0.1: icmp_seq=2 ttl=255 time=2.04 ms^C--- 192.168.0.1 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1001msrtt min/avg/max/mdev = 2.042/2.853/3.664/0.811 mspi@raspberrypi:~ $ ping -I wlan0 yahoo.comPING yahoo.com (98.138.253.109) from 192.168.0.108 wlan0: 56(84) bytes of data.64 bytes from ir1.fp.vip.ne1.yahoo.com (98.138.253.109): icmp_seq=1 ttl=48 time=234 ms64 bytes from ir1.fp.vip.ne1.yahoo.com (98.138.253.109): icmp_seq=2 ttl=48 time=156 ms^C--- yahoo.com ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 1000msrtt min/avg/max/mdev = 156.778/195.844/234.911/39.069 ms

同じルーターの配下にある別のマシンからも導通していることをチェック。

kawauchiyasuo-no-MacBook-Pro:~ yasuo$ ping 192.168.0.108PING 192.168.0.108 (192.168.0.108): 56 data bytesRequest timeout for icmp_seq 0Request timeout for icmp_seq 1Request timeout for icmp_seq 2Request timeout for icmp_seq 364 bytes from 192.168.0.108: icmp_seq=4 ttl=64 time=39.168 ms64 bytes from 192.168.0.108: icmp_seq=5 ttl=64 time=2.177 ms64 bytes from 192.168.0.108: icmp_seq=6 ttl=64 time=6.287 ms64 bytes from 192.168.0.108: icmp_seq=7 ttl=64 time=97.298 ms^C--- 192.168.0.108 ping statistics ---8 packets transmitted, 4 packets received, 50.0% packet lossround-trip min/avg/max/stddev = 2.177/36.233/97.298/38.060 ms

なんで最初だけ失敗するのか謎ですが、つながったのでよしとします。

hostapdのインストール

本日時点で導入されるのはこちらのバージョン。

pi@raspberrypi:~ $ sudo apt-get install hostapdReading package lists... DoneBuilding dependency tree       Reading state information... DoneThe following extra packages will be installed:  libnl-route-3-200The following NEW packages will be installed:  hostapd libnl-route-3-2000 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.Need to get 559 kB of archives.After this operation, 1,473 kB of additional disk space will be used.Do you want to continue? [Y/n] YGet:1 http://mirrordirector.raspbian.org/raspbian/ jessie/main libnl-route-3-200 armhf 3.2.24-2 [99.5 kB]Get:2 http://mirrordirector.raspbian.org/raspbian/ jessie/main hostapd armhf 1:2.3-1+deb8u3 [459 kB]Fetched 559 kB in 2s (200 kB/s)  Selecting previously unselected package libnl-route-3-200:armhf.(Reading database ... 30238 files and directories currently installed.)Preparing to unpack .../libnl-route-3-200_3.2.24-2_armhf.deb ...Unpacking libnl-route-3-200:armhf (3.2.24-2) ...Selecting previously unselected package hostapd.Preparing to unpack .../hostapd_1%3a2.3-1+deb8u3_armhf.deb ...Unpacking hostapd (1:2.3-1+deb8u3) ...Processing triggers for man-db (2.7.0.2-5) ...Processing triggers for systemd (215-17+deb8u3) ...Setting up libnl-route-3-200:armhf (3.2.24-2) ...Setting up hostapd (1:2.3-1+deb8u3) ...Processing triggers for libc-bin (2.19-18+deb8u2) ...Processing triggers for systemd (215-17+deb8u3) ...

JESSIEになっても公式にアップされているバイナリだとrtl871xdrvを使えないようです。僕はWN-G150UMを使用しますので、バイナリを差し替えます。Realtekrealtekサイトは今日もつながりません。とりあえずhostapdはGPLのようなので、その部分だけGoogle Driveに載せておきます。最初Wordpressのメディアとしてアップロードしていたのですが、これでやるとダウンロード時に壊れるみたいです。何でだろう。wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gzpiからはアドレスが指定しにくいので、母艦のMacでダウンロードしてからSFTPで/home/piにアップロード。FileZillaを使っています。Mac用のFTPクライアントとしては一番使いやすいと思います。なのに何故かマイナー。

pi@raspberrypi:~ $ lswpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gzpi@raspberrypi:~ $ tar zxvf wpa_supplicant_hostapd-0.8_rtw_r7475.20130812.tar.gz wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/(中略)wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/COPYINGpi@raspberrypi:~ $ cd wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/pi@raspberrypi:~/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812 $ lsCOPYING  hostapd  README  src  wpa_supplicantpi@raspberrypi:~/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812 $ cd hostapd/pi@raspberrypi:~/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ make  CC  main.c(また中略)  LD  hostapd  CC  hostapd_cli.c  CC  ../src/common/wpa_ctrl.c  LD  hostapd_clipi@raspberrypi:~/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ lsAndroid.mk        dump_state.c            hostapd.8               hostapd.vlanbsd_hostapd.conf  dump_state.d            hostapd.accept          hostapd.wpa_pskChangeLog         dump_state.h            hostapd_cli             logwatchconfig_file.c     dump_state.o            hostapd_cli.1           main.cconfig_file.d     eap_register.c          hostapd_cli.c           main.dconfig_file.h     eap_register.d          hostapd_cli.d           main.oconfig_file.o     eap_register.h          hostapd_cli.o           Makefilectrl_iface.c      eap_register.o          hostapd.conf            nt_password_hash.cctrl_iface.d      eap_testing.txt         hostapd.deny            READMEctrl_iface.h      hlr_auc_gw.c            hostapd.eap_user        README-WPSctrl_iface.o      hlr_auc_gw.milenage_db  hostapd.radius_clients  srcdefconfig         hostapd                 hostapd.sim_db          wired.conf

コンパイルできました。hostapdとhostapd_cliが目的のファイルです。これらを/usr/sbinにコピーします。/usr/local/sbinではありません。。localに入れてしまうと置き換えられずに、コマンドラインから起動したら/usr/local/sbinの方が、起動スクリプトからだと/usr/localから起動してしまう。これで大分とハマりました。

pi@raspberrypi:~/wpa_supplicant_hostapd-0.8_rtw_r7475.20130812/hostapd $ sudo mv -f hostapd hostapd_cli /usr/sbin/

hostapdの設定

設定ファイルを編集。このファイルはもともとは無いので新規生成です。tabではファイル名補完できません。

pi@raspberrypi ~ $ nano /etc/hostapd/hostapd.conf

ssidとwpa_passphraseはお好みのものに変更してください。構文が厳格で1字でもダメだとパースエラーになります。エラーになるときにはバイナリエディタとかで1バイト単位で確認してください。改行コードは0aになってますか?

interface=wlan0driver=rtl871xdrvssid=rpi2hw_mode=gchannel=6macaddr_acl=0auth_algs=1ignore_broadcast_ssid=0wpa=2wpa_passphrase=12345678wpa_key_mgmt=WPA-PSKwpa_pairwise=CCMP

WPASupplicantとの干渉を排除する必要は無かった

最初から入っているWPASupplicantを抜く必要があるという情報が多く下記の設定をしていたが、これを抜いても状況は変わらなかった。後記の通りinterfacesとwpa_supplicant.confの設定を変える方がいい。

pi@raspberrypi:~ $ sudo mv /usr/share/dbus-1/system-services/fi.epitest.hostap.WPASupplicant.service ~/

この時点で再起動。

wpa_supplicantを動作させない

WPAsupplicantが動作するとそちらが優先してwlan0がWifiルータに接続しにいってしまう。fi.epitest.hostap.WPASupplicant.serviceの削除をしても改善されなかったので(細かい検証はできてません)、interfacesとwpa_supplicant.confの設定を変えて変更。

pi@raspberrypi:~ $ sudo nano /etc/network/interfaces

wpa-confをコメントアウト。

allow-hotplug wlan0iface wlan0 inet manual#    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

wpa_supplicant.confからは接続設定を外しておく。

pi@raspberrypi:~ $ sudo nano /etc/wpa_supplicant/wpa_supplicant.conf

ファイルの中身はこれだけ。接続関係の設定をすべて削除。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdevupdate_config=1

IPアドレスを固定化

アクセスポイントにするのでダイナミックIPは問題。そこで固定にします。Jessieから固定IP化の標準手順が変わり、/etc/dhcpcd.confに設定を記載するとの事です。

pi@raspberrypi:~ $ ifconfigeth0      Link encap:Ethernet  HWaddr b8:27:eb:f6:3c:22            inet addr:192.168.2.10  Bcast:192.168.2.255  Mask:255.255.255.0          inet6 addr: fe80::5451:ee7b:51eb:6a2c/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:100 errors:0 dropped:0 overruns:0 frame:0          TX packets:72 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:13075 (12.7 KiB)  TX bytes:9714 (9.4 KiB)lo        Link encap:Local Loopback            inet addr:127.0.0.1  Mask:255.0.0.0          inet6 addr: ::1/128 Scope:Host          UP LOOPBACK RUNNING  MTU:65536  Metric:1          RX packets:0 errors:0 dropped:0 overruns:0 frame:0          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)wlan0     Link encap:Ethernet  HWaddr 34:76:c5:5d:34:91            inet addr:192.168.0.108  Bcast:192.168.0.255  Mask:255.255.255.0          inet6 addr: fe80::84f:1a0b:2d1e:4137/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:767 errors:0 dropped:2 overruns:0 frame:0          TX packets:624 errors:0 dropped:4 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:126387 (123.4 KiB)  TX bytes:89388 (87.2 KiB)pi@raspberrypi:~ $ sudo nano /etc/dhcpcd.conf pi@raspberrypi:~ $ sudo ifdown wlan0pi@raspberrypi:~ $ sudo ifup wlan0ioctl[SIOCSIWAP]: Operation not permittedioctl[SIOCSIWENCODEEXT]: Invalid argumentioctl[SIOCSIWENCODEEXT]: Invalid argumentpi@raspberrypi:~ $ ifconfigeth0      Link encap:Ethernet  HWaddr b8:27:eb:f6:3c:22            inet addr:192.168.2.10  Bcast:192.168.2.255  Mask:255.255.255.0          inet6 addr: fe80::5451:ee7b:51eb:6a2c/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:229 errors:0 dropped:0 overruns:0 frame:0          TX packets:172 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:24618 (24.0 KiB)  TX bytes:22486 (21.9 KiB)lo        Link encap:Local Loopback            inet addr:127.0.0.1  Mask:255.0.0.0          inet6 addr: ::1/128 Scope:Host          UP LOOPBACK RUNNING  MTU:65536  Metric:1          RX packets:0 errors:0 dropped:0 overruns:0 frame:0          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0           RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)wlan0     Link encap:Ethernet  HWaddr 34:76:c5:5d:34:91            inet addr:192.168.10.1  Bcast:192.168.10.255  Mask:255.255.255.0          inet6 addr: fe80::84f:1a0b:2d1e:4137/64 Scope:Link          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:4 errors:0 dropped:5 overruns:0 frame:0          TX packets:13 errors:0 dropped:4 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:219213 (214.0 KiB)  TX bytes:131438 (128.3 KiB)

固定できました。dhcpcd.confの末尾に追記した設定内容はこちら。

interface wlan0static ip_address=192.168.10.1/24

hostapdで起動

サービスとして起動させる前に手動で実験。どこかの設定で失敗していてwlan0のIPが取れていないと、このメッセージが出てもAP名が配布されない。

pi@raspberrypi:~ $ sudo hostapd /etc/hostapd/hostapd.conf -ddrandom: Trying to read entropy from /dev/randomConfiguration file: /etc/hostapd/hostapd.confdrv->ifindex=3l2_sock_recv==l2_sock_xmit=0x0x17f5638BSS count 1, BSSID mask 00:00:00:00:00:00 (0 bits)Allowed channel: mode=1 chan=1 freq=2412 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=2 freq=2417 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=3 freq=2422 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=4 freq=2427 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=5 freq=2432 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=6 freq=2437 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=7 freq=2442 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=8 freq=2447 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=9 freq=2452 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=10 freq=2457 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=11 freq=2462 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=12 freq=2467 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=13 freq=2472 MHz max_tx_power=0 dBmAllowed channel: mode=1 chan=14 freq=2484 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=1 freq=2412 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=2 freq=2417 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=3 freq=2422 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=4 freq=2427 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=5 freq=2432 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=6 freq=2437 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=7 freq=2442 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=8 freq=2447 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=9 freq=2452 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=10 freq=2457 MHz max_tx_power=0 dBmAllowed channel: mode=0 chan=11 freq=2462 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=36 freq=5180 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=40 freq=5200 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=44 freq=5220 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=48 freq=5240 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=52 freq=5260 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=56 freq=5280 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=60 freq=5300 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=64 freq=5320 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=100 freq=5500 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=104 freq=5520 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=108 freq=5540 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=112 freq=5560 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=116 freq=5580 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=120 freq=5600 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=124 freq=5620 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=128 freq=5640 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=132 freq=5660 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=136 freq=5680 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=140 freq=5700 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=149 freq=5745 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=153 freq=5765 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=157 freq=5785 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=161 freq=5805 MHz max_tx_power=0 dBmAllowed channel: mode=2 chan=165 freq=5825 MHz max_tx_power=0 dBmCompleting interface initializationMode: IEEE 802.11g  Channel: 1  Frequency: 2412 MHzRATE[0] rate=10 flags=0x1RATE[1] rate=20 flags=0x1RATE[2] rate=55 flags=0x1RATE[3] rate=110 flags=0x1RATE[4] rate=60 flags=0x0RATE[5] rate=90 flags=0x0RATE[6] rate=120 flags=0x0RATE[7] rate=180 flags=0x0RATE[8] rate=240 flags=0x0RATE[9] rate=360 flags=0x0RATE[10] rate=480 flags=0x0RATE[11] rate=540 flags=0x0Flushing old station entriesDeauthenticate all stations+rtl871x_sta_deauth_ops, ff:ff:ff:ff:ff:ff is deauth, reason=2rtl871x_set_key_opsrtl871x_set_key_opsrtl871x_set_key_opsrtl871x_set_key_opsUsing interface wlan0 with hwaddr 34:76:c5:5d:34:91 and ssid 'rpi2'Deriving WPA PSK based on passphraseSSID - hexdump_ascii(len=4):     72 70 69 32                                       rpi2            PSK (ASCII passphrase) - hexdump_ascii(len=11): [REMOVED]PSK (from passphrase) - hexdump(len=32): [REMOVED]rtl871x_set_wps_assoc_resp_iertl871x_set_wps_beacon_iertl871x_set_wps_probe_resp_ieurandom: Got 20/20 bytes from /dev/urandomGet randomness: len=32 entropy=0GMK - hexdump(len=32): [REMOVED]Get randomness: len=32 entropy=0Key Counter - hexdump(len=32): [REMOVED]WPA: group state machine entering state GTK_INIT (VLAN-ID 0)Get randomness: len=16 entropy=0GTK - hexdump(len=16): [REMOVED]WPA: group state machine entering state SETKEYSDONE (VLAN-ID 0)rtl871x_set_key_opsrtl871x_set_beacon_opsrtl871x_set_hidden_ssid ignore_broadcast_ssid:0, rpi2,4rtl871x_set_aclwlan0: Setup of interface done.Wireless event: cmd=0x8b15 len=20

こんな感じでwlan0: Setup of interface done.となれば成功。これはOSXのWifiアイコンのプルダウン。電波3本びんびん立ってますね。こっちも。

OS起動時にhostapdを起動

自動起動させたいので設定ファイルを編集。起動スクリプトである/etc/init.d/hostapdがこのファイルを参照している。

pi@raspberrypi ~ $ sudo nano /etc/default/hostapd

行頭のコメントアウトを外してファイル名を指定。init.dに起動スクリプトがあるので、この設定をするだけで、OS起動時にhostapdが起動するようになる。

DAEMON_CONF=""/etc/hostapd/hostapd.conf""

DHCPサーバーのインストール

デフォルトではインストールされていないので、インストールする。

pi@raspberrypi:~ $  sudo apt-get install isc-dhcp-server(中略)invoke-rc.d: initscript isc-dhcp-server, action ""start"" failed.Processing triggers for systemd (215-17+deb8u3) ...

最初は設定ができていないので起動に失敗している。

DHCPサーバーがちゃんと起動できるようにする

まずどのネットワークインターフェースDHCPサーバーを作動させるかを指定する。

pi@raspberrypi:~ $ sudo nano /etc/default/isc-dhcp-server

末尾部分でINTERFACESの指定が空欄なのでここでwlan0を指定する。

INTERFACES=""wlan0""

次にどのようなルールでIPを割り当てるかを指定する。

pi@raspberrypi:~ $ sudo nano /etc/dhcp/dhcpd.conf

下記の部分はコメントアウト。

#option domain-name ""example.org"";#option domain-name-servers ns1.example.org, ns2.example.org;

ここのコメントは外す。

# If this DHCP server is the official DHCP server for the local# network, the authoritative directive should be uncommented.authoritative;

必要無いはずですが念のため起動を有効化。

pi@raspberrypi:~ $ sudo update-rc.d isc-dhcp-server enable

ルールを追加。

ping-check true; subnet 192.168.10.0 netmask 255.255.255.0 {option routers 192.168.10.1;option broadcast-address 192.168.10.255;option subnet-mask 255.255.255.0;option domain-name-servers 8.8.8.8,8.8.4.4;default-lease-time 600;max-lease-time 7200;range 192.168.10.101 192.168.10.199;}

Raspberry PiでIoTなIT:起動時dhcpcdによる無線LANインターフェースへのIP割り当てが遅くてisc-dhcp-serverが起動に失敗するここ書いたようにそのままだとOS起動時にはDHCPサーバーを起動できないので、時間待ちを設定。

pi@raspberrypi:~ $ sudo nano /etc/init.d/isc-dhcp-server

start-stop-daemonの前に5秒待ちを挿入しました。

case ""$1"" in        start)                test_config                log_daemon_msg ""Starting $DESC"" ""$NAME""                sleep 5                start-stop-daemon --start --quiet --pidfile ""$DHCPD_PID"" \                        --exec /usr/sbin/dhcpd -- \                        -q $OPTIONS -cf ""$DHCPD_CONF"" -pf ""$DHCPD_PID"" $INTERFA$                sleep 2

再起動してアクセスしてみる。

終了!

お疲れ様です。やっぱり一筋縄ではいきませんね。はい、疲れました。

   “””

Raspberry PiでIoTなIT:起動時dhcpcdによる無線LANインターフェースへのIP割り当てが遅くてisc-dhcp-serverが起動に失敗する

Raspberry Piをアクセスポイント化するための仕上げとしてisc-dhcp-serverをインストールしたところ、serverコマンドだと起動できるのに、起動時には起動できないという問題が発生。

pi@raspberrypi:~ $ ps ax | grep dhcp  604 ?        Ss     0:00 /sbin/dhcpcd -q -w  715 pts/0    S+     0:00 grep --color=auto dhcp

色々と分析してみると、起動時にwlan0のIP割り当てよりも早くDHCPサーバーが起動開始してしまい、作動対象のwlan0が存在していなくて、起動に失敗している模様。

Feb 10 22:08:31 raspberrypi dhcpd: Internet Systems Consortium DHCP Server 4.3.1Feb 10 22:08:31 raspberrypi dhcpd: Copyright 2004-2014 Internet Systems Consortium.Feb 10 22:08:31 raspberrypi dhcpd: All rights reserved.Feb 10 22:08:31 raspberrypi dhcpd: For info, please visit https://www.isc.org/software/dhcp/Feb 10 22:08:31 raspberrypi dhcpd: Internet Systems Consortium DHCP Server 4.3.1Feb 10 22:08:31 raspberrypi dhcpd: Copyright 2004-2014 Internet Systems Consortium.Feb 10 22:08:31 raspberrypi dhcpd: All rights reserved.Feb 10 22:08:31 raspberrypi dhcpd: For info, please visit https://www.isc.org/software/dhcp/Feb 10 22:08:31 raspberrypi dhcpd: Wrote 1 leases to leases file.Feb 10 22:08:31 raspberrypi ntpd[634]: Listen normally on 2 lo 127.0.0.1 UDP 123Feb 10 22:08:31 raspberrypi ntpd[634]: Listen normally on 3 eth0 192.168.2.10 UDP 123Feb 10 22:08:31 raspberrypi ntpd[634]: Listen normally on 4 lo ::1 UDP 123Feb 10 22:08:31 raspberrypi ntpd[634]: Listen normally on 5 eth0 fe80::5451:ee7b:51eb:6a2c UDP 123Feb 10 22:08:31 raspberrypi ntpd[634]: peers refreshedFeb 10 22:08:31 raspberrypi ntpd[634]: Listening on routing socket on fd #22 for interface updatesFeb 10 22:08:31 raspberrypi dhcpd: Feb 10 22:08:31 raspberrypi dhcpd: No subnet declaration for wlan0 (no IPv4 addresses).Feb 10 22:08:31 raspberrypi dhcpd: ** Ignoring requests on wlan0.  If this is not whatFeb 10 22:08:31 raspberrypi dhcpd:    you want, please write a subnet declarationFeb 10 22:08:31 raspberrypi dhcpd:    in your dhcpd.conf file for the network segmentFeb 10 22:08:31 raspberrypi dhcpd:    to which interface wlan0 is attached. **Feb 10 22:08:31 raspberrypi dhcpd: Feb 10 22:08:31 raspberrypi dhcpd: Feb 10 22:08:31 raspberrypi dhcpd: Not configured to listen on any interfaces!Feb 10 22:08:31 raspberrypi dhcpd: Feb 10 22:08:31 raspberrypi dhcpd: If you think you have received this message due to a bug ratherFeb 10 22:08:31 raspberrypi dhcpd: than a configuration issue please read the section on submittingFeb 10 22:08:31 raspberrypi dhcpd: bugs on either our web page at www.isc.org or in the README fileFeb 10 22:08:31 raspberrypi dhcpd: before submitting a bug.  These pages explain the properFeb 10 22:08:31 raspberrypi dhcpd: process and the information we find helpful for debugging..Feb 10 22:08:31 raspberrypi dhcpd: Feb 10 22:08:31 raspberrypi dhcpd: exiting.Feb 10 22:08:31 raspberrypi kernel: [   17.255254] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes readyFeb 10 22:08:31 raspberrypi dhcpcd[604]: wlan0: carrier acquiredFeb 10 22:08:31 raspberrypi hostapd[607]: Starting advanced IEEE 802.11 management: hostapd.Feb 10 22:08:31 raspberrypi systemd[1]: Started LSB: Advanced IEEE 802.11 management daemon.Feb 10 22:08:31 raspberrypi dhcpcd[604]: wlan0: IAID c5:5d:34:91Feb 10 22:08:31 raspberrypi dhcpcd[604]: wlan0: using static address 192.168.10.1/24Feb 10 22:08:31 raspberrypi avahi-daemon[349]: Joining mDNS multicast group on interface wlan0.IPv4 with address 192.168.10.1.Feb 10 22:08:31 raspberrypi avahi-daemon[349]: New relevant interface wlan0.IPv4 for mDNS.Feb 10 22:08:31 raspberrypi dhcpcd[604]: wlan0: adding route to 192.168.10.0/24Feb 10 22:08:31 raspberrypi avahi-daemon[349]: Registering new address record for 192.168.10.1 on wlan0.IPv4.Feb 10 22:08:31 raspberrypi dhcpcd[604]: wlan0: soliciting an IPv6 routerFeb 10 22:08:33 raspberrypi isc-dhcp-server[610]: Starting ISC DHCP server: dhcpdcheck syslog for diagnostics. ... failed!Feb 10 22:08:33 raspberrypi isc-dhcp-server[610]: failed!

rc3.dのスクリプトの順序を変えてみたのですが、その程度では間に合わないようです。そこで非常にローテクで美しくないのですが、その場的対策として、sleepで無理矢理起動開始を遅くします。

pi@raspberrypi:~ $ sudo nano /etc/init.d/isc-dhcp-server

start-stop-daemonの前に5秒待ちを挿入しました。

case ""$1"" in        start)                test_config                log_daemon_msg ""Starting $DESC"" ""$NAME""                sleep 5                start-stop-daemon --start --quiet --pidfile ""$DHCPD_PID"" \                        --exec /usr/sbin/dhcpd -- \                        -q $OPTIONS -cf ""$DHCPD_CONF"" -pf ""$DHCPD_PID"" $INTERFA$                sleep 2

これで起動をしたところ、isc-dhcp-serverのプロセスが生き残っていました。

pi@raspberrypi:~ $ ps ax | grep dhcp  605 ?        Ss     0:00 /sbin/dhcpcd -q -w  682 ?        Ss     0:00 /usr/sbin/dhcpd -q -cf /etc/dhcp/dhcpd.conf -pf /var/run/dhcpd.pid wlan0  713 pts/0    S+     0:00 grep --color=auto dhcp

ログを見るとisc-dhcp-serverの起動開始よりも4秒早くwlan0のIP割り当てが完了しています。

Feb 10 21:56:30 raspberrypi dhcpcd[605]: wlan0: IAID c5:5d:34:91Feb 10 21:56:30 raspberrypi dhcpcd[605]: wlan0: soliciting an IPv6 routerFeb 10 21:56:30 raspberrypi dhcpcd[605]: wlan0: using static address 192.168.10.1/24Feb 10 21:56:30 raspberrypi avahi-daemon[345]: Joining mDNS multicast group on interface wlan0.IPv4 with address 192.168.10.1.Feb 10 21:56:30 raspberrypi dhcpcd[605]: wlan0: adding route to 192.168.10.0/24Feb 10 21:56:30 raspberrypi avahi-daemon[345]: New relevant interface wlan0.IPv4 for mDNS.Feb 10 21:56:30 raspberrypi avahi-daemon[345]: Registering new address record for 192.168.10.1 on wlan0.IPv4.Feb 10 21:56:31 raspberrypi dhcpcd[605]: eth0: no IPv6 Routers availableFeb 10 21:56:32 raspberrypi hostapd: wlan0: STA d4:f4:6f:04:f3:49 IEEE 802.11: associatedFeb 10 21:56:32 raspberrypi hostapd: wlan0: STA d4:f4:6f:04:f3:49 RADIUS: starting accounting session 56BB337E-00000000Feb 10 21:56:32 raspberrypi hostapd: wlan0: STA d4:f4:6f:04:f3:49 WPA: pairwise key handshake completed (RSN)Feb 10 21:56:34 raspberrypi dhcpd: Internet Systems Consortium DHCP Server 4.3.1Feb 10 21:56:34 raspberrypi dhcpd: Copyright 2004-2014 Internet Systems Consortium.Feb 10 21:56:34 raspberrypi dhcpd: All rights reserved.Feb 10 21:56:34 raspberrypi dhcpd: For info, please visit https://www.isc.org/software/dhcp/Feb 10 21:56:34 raspberrypi dhcpd: Wrote 1 leases to leases file.Feb 10 21:56:34 raspberrypi dhcpd: Server starting service.Feb 10 21:56:35 raspberrypi ntpd[635]: Listen normally on 6 wlan0 192.168.10.1 UDP 123Feb 10 21:56:35 raspberrypi ntpd[635]: Listen normally on 7 wlan0 fe80::e49a:83c8:afde:dccb UDP 123Feb 10 21:56:35 raspberrypi ntpd[635]: peers refreshedFeb 10 21:56:36 raspberrypi dhcpd: DHCPREQUEST for 192.168.10.101 from d4:f4:6f:04:f3:49 (Yasuo-iPhone6) via wlan0Feb 10 21:56:36 raspberrypi dhcpd: DHCPACK on 192.168.10.101 to d4:f4:6f:04:f3:49 via wlan0Feb 10 21:56:45 raspberrypi systemd[1]: Time has been changedFeb 10 21:56:45 raspberrypi isc-dhcp-server[611]: Starting ISC DHCP server: dhcpd.Feb 10 21:56:45 raspberrypi systemd[1]: Started LSB: DHCP server.Feb 10 21:56:45 raspberrypi systemd[1]: Starting Multi-User System.

これで無事DHCPサーバーのインストールが完了です。毎回手動で起動するとかやってられないですよね。起動プロセスの最後にさらにもう一回isc-dhcp-serverを起動するという方法もありましたが、こちらの方法の方がスマートではないかと思います。”””