ブログを見返したら、エアコンリモート操作ソリューションが進化した「エアぴっぴ」のことを書いてませんでした。ええと、もともとEjectコマンド工作用に書いたエアコンサーバーのPHPに手を加えて、今自宅で使っているエアコンリモート環境(Raspberry Pi+DS18B20+フォトカプラを使って電源を間接的に制御するやつ)をもうちょい他の人にも使えるようにしてみたプロダクトです。実際に、社内でネコを飼い始めた人に頼まれて作ったので、例によって需要ありきで制作されています。OSC2015北海道のEjectセミナーでちょっと触れたんですが、まだレポート書きかけだわ……。
で、もちろんオープンソースとして(MITライセンスで)公開していますが、例によって人が読めるレベルではありませんというかいきなりAnsible playbookになっちゃっててああこれだめなんでは。
前振りが長くなりましたが、要望として無線LANで使えるようにしたいというのがあったので、色々調べた結果、NetworkManagerを使うことになりました。
なんでNetworkManagerを使うの
まず、Raspberry Piと言うかRaspbianで無線LANを使うには、USB無線LAN子機を挿してwpa_supplicantにAP情報を書いて、/etc/network/interfacesに書いてifupするのが一般的ではないかと思います。ですがこれ、無線LANが切れると再接続してくれません。USB無線LAN子機を挿し直すと、旧モデルたちではリブートしてしまい残念感が漂います。
んで出てくるのがネットワークマネージャです。こいつを使うと自動接続とか、再接続とかをやってくれるようです。ググるとWicdというのが出てくるのですが、試したところ、自動接続がいまいち安定しないこと(後述)と、開発者不足による開発停滞とか書かれていてなんとなく不安を感じたので、名前はよく聞くNetworkManagerを使うことにしました。無効化するものとしてよく聞く……。
使えるようにする
まずはRaspbianにインストール。
sudo apt-get install network-manager
そして、旧来のネットワーク管理ツールを一掃します。
sudo apt-get remove ifplugd dhcpcd5
馴染みの設定ファイルたちも空にします。
- /etc/network/interfaces を空にする(loopbackは残してても特に何もなかった?)
- /etc/wpa_supplicant/wpa_supplicant.conf のネットワーク設定も残ってたら消す
旧来のネットワークマネージャたちが残っていると、無線LANデバイスに対して二重にIPアドレスを取得(NetworkManagerがとった後に、dhcpcdがさらに取るっぽい)してました。
無線LANの接続情報は、 /etc/NetworkManager/system-connections ディレクトリ以下にファイルを作成します。ファイル名はAP名など任意で良いようです。また、ファイルの所有者・グループはroot、パーミッションは0600とします。
[connection] id=<この設定の名前> uuid=11111111-1111-1111-1111-111111111111 (複数のファイルを置くときはuuidを適宜変えたほうが良さそう) type=802-11-wireless timestamp=0 autoconnect=true [802-11-wireless] ssid=<無線LANのSSID> mode=infrastructure security=802-11-wireless-security [802-11-wireless-security] key-mgmt=wpa-psk psk=<WPAのパスフレーズ> [ipv4] method=auto
WEPの時はこうだとおもう。ただ、そもそもWPA2とかに移行したいところ。要望に合わせてひとまず設定したので結果は明日以降聞けるというドキドキなアレ。違ったら後で修正しますん。
[802-11-wireless-security] key-mgmt=none wep-key-type=NM_WEP_KEY_TYPE_KEY wep-key0=<WEPキー>
各項目の解説はこの辺りを参照。これも探すのに手間取りました……。
eth0は設定を書かなくても、NetworkManagerが勝手にDHCPでやってくれるので何も書かなくて良いようです。固定したい場合は設定を書く必要があるでしょうけど。
ただ、これを色々調べながらTwitterでツイートしてたら、GUIでNetworkManagerの設定をやって、設定ファイルをコピーしたほうが無難と言う話もあったので、そういう方法を使うのもありなんだと思います。
最後は再起動をかけたら終わり。
課題
Wicdの挙動がいまいち不安定だったときに、ifplugdとかdhcpcdを止めていませんでした。もしかすると、そのせいでうまく動いていなかったのかもしれません。これは気になったのでまたそのうち試してみたいところです(追記)試したの下の追記を参照。ただ、設定ファイルの書き方という点ではWicdもまともそうなドキュメントがなさそうな雰囲気を感じたので、まあNetworkManagerのほうが良いかなと言う印象を持ちました。WicdもNetworkManagerも、GUI環境下(Wicdはwicd-cursesと言うCUIの設定画面もあるけど)で使われることを想定したもの、なんでしょうかね。
あとは、この設定を手動でやらずに済ませられる方法を確率したいです。エアぴっぴのWeb画面から設定できるのが理想ですけど、セキュリティ対策とか考えたくないので、Ansible Playbook側で対処するか……悩ましい。
参考にしたURL
- Reference: Configuring a NetworkManager Wireless Connection without Graphics | Peter K. G. Williams
- NetworkManager D-Bus Reference Manual: Network Configuration Setting Specification
あああと、ifplugdでも、なんかスクリプトを書けば再接続はできる模様。どうなんでしょうね。
追記: Wicdも使えました
やはり、ifplugd/dhcpcd5を消して設定もさっぱりさせることで、Wicdも使えました。というわけで、好きな方を使えばいいと思います(?)。