Raspberry Pi Zero WにLEDEをインストールして自分専用の携帯用WiFiアクセスポイントにする
※この記事の投稿時点ではLEDEを選択していますが、2018年にLEDEとOpenWrtはマージされたので、これ以降の選択肢はLEDEではなくOpenWrtとなります。最新のOpenWrtでも基本的な導入手順は同じなので、参考程度のお読みください。
Raspberry PI Zero W が日本国内でも発売となりましたね。とはいえ、スイッチサイエンスやKSYの販売分は品薄が続いているようで、当分は入手が難しい様子。
自分はというと、PIMORONI から Zero W + Adaptors + Pibow Zero W のセットを買ってみました。この通販サイトは在庫はそれなりに潤沢なようです。
Raspberry Pi Zero Wshop.pimoroni.com
手元に届いたのは日本の技適のマークや番号がシルク印刷されているので各種法令上の問題は多分無いと認識しています。
さて、Raspberry Pi Zero W を入手した目的なのですが、「出張時に持ち運びが容易なWiFiアクセス」にしようと考えています。この構成を Raspbian で手作業でいろいろやってもよいのですけど、簡単に設定できる管理画面が欲しいので LEDE でやることにします。
なお LEDE というのは openwrt からフォークしたプロジェクトです。openwrt は Pi 3 や Zero W 向けのインストールイメージが現時点 (2017/08時点) では存在しないのですけど、LEDE は Pi 3 や Pi Zero W 向けのインストールイメージが公開されているので、Raspberry Pi で使う場合は LEDE のほうが便利なのです。
準備物
必要なもの
- Raspberry Pi Zero W
- HDMIアダプタ
- USBキーボード
- microUSB給電ケーブル
- USB-LANアダプタ
USBキーボードとUSB-LANアダプタを除けばこういうセット品が便利ですけど、若干割高な気がしなくもないです。この金額にもうちょい足せばRaspberry Pi 3 が買えてしまいます。品薄感がもうちょっと減ればもうすこしお手頃な価格になるのかなあ、とも思うのですが、当面は厳しいんでしょうねえ。
あったほうがよいもの
- USB-HUB
USB-HUB はあったほうがよいです。USBキーボードとUSB-LANアダプタの両方を同時に使うためには絶対に必須。
これが無い場合はコンソール操作のときにキーボードとLANを同時に使えないのでとても面倒なことになります。
今回の購入先である PIMORONI で販売されているような 3ポートUSBハブ + Ethernet アダプタがあると大変便利なのですが、そうなると全部入りな RasPi3 の方が良いかもしれませんから判断は微妙です。。。
Three Port USB Hub with Ethernet - microB connectorshop.pimoroni.com
作業手順
LEDE は Ethernet + WiFi なRaspberry Pi 3 に導入するのはとてもカンタンなのですが、Pi Zero W は Ethernet を含まないのでセットアップのハードルが少々上がります。そこで、作業の手間を省くために uci コマンドを活用することにします。
LEDEは通常はWebの管理画面で設定を行いますが、USB-HUBが無い場合や手持ちのUSB-LANアダプタが認識されない場合はシェル上で uci コマンドを用いて WiFi ルータの機能を有効化するのが一番カンタンなのですよ。
サマリ
- Raspberry Pi Zero W 向けの LEDE イメージの入手
- 使用するUSB-LANアダプタ用の追加ドライバの入手と導入
- uci コマンドによる設定の投入
- 動作確認
Raspberry Pi Zero W 向けの LEDE イメージの入手
下記のページによると、Pi Zero W 向けの LEDE イメージは snapshot のものがある、ということになっています。
https://lede-project.org/toh/hwdata/raspberrypifoundation/raspberrypifoundation_raspberry_pi_zero_w
しかし実際に探してみると、snapshotの他にも17.01.4 ベースのイメージが下記の場所にありました。(2017年12月時点)
https://downloads.lede-project.org/releases/17.01.4/targets/brcm2708/bcm2708/
このバージョンは KRACKs 対応パッチが当たっているので安心して使えます。
ここから lede-17.01.4-brcm2708-bcm2708-rpi-ext4-sdcard.img.gz というファイルをダウンロードして microSDHC に焼いておきます。
焼く手順は通常どおりに dd ですから、この説明は省略します。
使用するUSB-LANアダプタ用の追加ドライバの入手と導入
LEDE のイメージには、私が持っているLANアダプタのドライバは含まれていませんでした。そこで、USB-LAN アダプタの動作に必要なドライバを予め microSDHC に入れておくことにします。そうすれば、LEDE の起動後にコンソールからの操作でUSB-LAN向けのドライバを導入可能になります。
LEDE 17.01.4 向けの Pi Zero W で利用できるドライバはここからダウンロードできます。
Index of /releases/17.01.4/targets/brcm2708/bcm2708/packages/
USB-LAN アダプタを扱うための必須パッケージはここらへんの6つ。
https://downloads.lede-project.org/releases/17.01.4/targets/brcm2708/bcm2708/packages/kmod-libphy_4.4.92-1_arm_arm1176jzf-s_vfp.ipk https://downloads.lede-project.org/releases/17.01.4/targets/brcm2708/bcm2708/packages/kmod-mii_4.4.92-1_arm_arm1176jzf-s_vfp.ipk https://downloads.lede-project.org/releases/17.01.4/targets/brcm2708/bcm2708/packages/kmod-usb-net_4.4.92-1_arm_arm1176jzf-s_vfp.ipk http://downloads.lede-project.org/releases/17.01.4/packages/arm_arm1176jzf-s_vfp/base/usbutils_007-7_arm_arm1176jzf-s_vfp.ipk http://downloads.lede-project.org/releases/17.01.4/targets/brcm2708/bcm2708/packages/librt_1.1.16-1_arm_arm1176jzf-s_vfp.ipk http://downloads.lede-project.org/releases/17.01.4/packages/arm_arm1176jzf-s_vfp/base/libusb-1.0_1.0.21-1_arm_arm1176jzf-s_vfp.ipk
さらにUSB-LANアダプタ固有のパッケージをインストールします。PIMORONI の3ポートUSBハブ+LANアダプタの場合はRTL8152のドライバを用意します。
https://downloads.lede-project.org/releases/17.01.4/targets/brcm2708/bcm2708/packages/kmod-usb-net-rtl8152_4.4.92-1_arm_arm1176jzf-s_vfp.ipk
また、自分の手元にあったUSB-LANアダプタ2種類のドライバは下記の通りでしたので、自分の場合はこれも入れておきます。
https://downloads.lede-project.org/releases/17.01.4/targets/brcm2708/bcm2708/packages/kmod-usb-net-asix-ax88179_4.4.92-1_arm_arm1176jzf-s_vfp.ipk https://downloads.lede-project.org/releases/17.01.4/targets/brcm2708/bcm2708/packages/kmod-usb-net-pegasus_4.4.92-1_arm_arm1176jzf-s_vfp.ipk
なお、自分が所有しているLANアダプタのドライバがよくわからない、という方は、最低限必要な6種類をインストールの後に lsusb コマンドで認識されているデバイスを表示させてみると良いでしょう。以下は PIMORONI の3ポートUSBに Microsoft のタッチパッド付きワイヤレスキーボードを接続している状態です。
root@LEDE:~# lsusb Bus 001 Device 005: ID 0bda:8152 Realtek Semiconductor Corp. RTL8152 Fast Ethernet Adapter Bus 001 Device 003: ID 045e:0801 Microsoft Corp. Bus 001 Device 002: ID 1a40:0101 Terminus Technology Inc. Hub Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
この出力から、PIMONORI のデバイスは Realtek RTL8152 を使っていることがわかります。この情報で Google 検索するなどして、適切なドライバを探します。
必要なファイルがそろったら LEDE を焼いたあとの microSDHC に転送しておきます。このファイルは LEDE では /boot 上にあります。
なお、microSDHC には、本記事の後半に記載の「uci を使った設定投入用のスクリプト」も入れておいてください。これをこの時点で入れておくと、いろんな意味で手間が省けるはずです。
さて、LEDE を Pi Zero W で起動したら、上記のファイルをインストールします。ファイルは /boot にあるはずです。これを以下のようにインストールします。
cd /boot opkg install *.ipk
インストールすると、こんなメッセージが出るかもしれませんが、これは無視して構いません。他のエラーの場合はパッケージが足りないために出ているはずですから不足するパッケージを追加してインストールしてください。
Collected errors: * pkg_run_script: package "kmod-usb-net" postinst script returned status 255. * opkg_configure: kmod-usb-net.postinst returned 255.
このエラーメッセージが出ないようにするには、下記記事に記載の対処を行います。 pslabo.hatenablog.com
インストールできたら LEDE を reboot します。この reboot は uci コマンド実行の前提となる環境を作るために必須です。
uci コマンドによる設定の投入
LEDE はブラウザからの管理画面で設定できるのですが、Pi Zero W をアクセスポイント化するための設定を行うのは意外にめんどくさいので、ここはサクッとコマンドで設定投入するのがよいだろうと思います。
手元の環境でGUIからの設定を行う前と後で設定内容が変わった箇所を抽出してみると、こんな感じになっておりました。
#!/bin/sh uci set dhcp.lan.ra_management='1' uci delete dropbear.@dropbear[0].RootPasswordAuth='on' uci set network.wan.ifname='eth0' uci set network.wan.proto='dhcp' uci set network.wan=interface uci delete network.lan.ifname='wlan0' uci set network.lan._orig_bridge='true' uci set network.lan._orig_ifname='wlan0 wlan0' uci set network.lan.ipaddr='192.168.4.1' uci set system.@system[0].conloglevel='8' uci set system.@system[0].cronloglevel='8' uci set system.@system[0].log_proto='udp' uci set wireless.default_radio0.encryption='psk2' uci delete wireless.radio0.disabled='1' uci set wireless.radio0.country='JP' uci set wireless.default_radio0.ssid='[設定するSSID名]' uci set wireless.default_radio0.key='[WPA-PSKのパスフレーズ]'
これを microSDHC の /boot にスクリプトとして保存しておき、LEDE のコンソールから実行すれば一通りの設定が完了します。SSID名やパスフレーズは適切に設定しておいてください。
またこの設定では LAN 側 (WiFi側) のIPアドレスが 192.168.4.1 になっています。これも適切に変更しておいてください。
実行した時にエラーメッセージが2つ出る場合があるかもしれませんが、特に問題ありません。(修正の手間に対して得るものがないので放置しています。。。)
設定したら uci commit して reboot してみてください。
動作確認
USB-LANアダプタを接続した状態で、設定したSSIDに接続してインターネット通信できていれば基本的にはOKです。
ただしこの状態は LEDE の管理画面のパスワード設定を行っていない状態ですので、パスワードはかならず設定してください。
また、WAN側には管理画面の口が開かないように dropbear の設定を lan に限定しておきましょう。
その他の設定調整
管理画面を日本語化したい場合は luci-i18n-base-ja を追加した上で System の設定から Language を日本語に変更します。