[Raspberry Pi] USBメモリに書いたファイルでWi-Fi設定を変更する起動スクリプトを書いてみた

Raspberry PiのWi-Fi設定は、/boot/wpa_supplicant.conf を記述しておくだけで変更できます。 しかし、この方法だと、一旦、MicroSDを外してMacでマウントしなければなりません。(といってもそれだけですが・・・) そこで、より一般的に利用可能な、USBメモリに設定ファイルを書き込むことで、Wi-Fi設定が変更できるようにしてみました。
2018.09.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

Raspberry PiのWi-Fi設定は、/boot/wpa_supplicant.conf を記述しておくだけで変更できます。

しかし、この方法だと、一旦、MicroSDを外してMacでマウントしなければなりません。(といってもそれだけですが・・・)

そこで、より一般的に利用可能な、USBメモリに設定ファイルを書き込むことで、Wi-Fi設定が変更できるようにしてみました。

下記のように、USBメモリを差し込んで起動するだけで、WI-Fiの設定を変更できます。

※本記事は、2018-06-27-raspbian-stretch.img で作業しています。

2 USBメモリ

Raspberry PiにUSBメモリを挿入すると、下記のように自動的にマウントされて利用可能になります。マウント先は、/media/pi/ボリューム名となります。

$ df -k
Filesystem     1K-blocks    Used Available Use% Mounted on
・・・略・・・
/dev/sda2       14891008   37160  14853848   1% /media/pi/Wi-Fi

USBメモリ内のファイルにアクセスするには、ボリューム名が必要なので、今回は、Wi-Fiというボニューム名をつけることにしました。

このUSBメモリの中に、wpa_supplicant.confというファイルを作成します。(USB内には、その他のファイルが入っていても問題ありません)

wpa_supplicant.confは、通常の設定ファイルと同じです。起動時に、このファイルが /etc/wpa_supplicant/wpa_supplicant.conf に上書きされることになります。

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
   ssid="Free001"
   psk="password"
}

3 rc.local

起動時に、USBメモリの中のwpa_supplicant.confをコピーして、wpa_supplicantを再起動するシェルは、rc.localに追加しました。

_WPA="wpa_supplicant"
_EXE="/sbin/${_WPA}"
_SRC="/media/pi/Wi-Fi/${_WPA}.conf"
_DST="/etc/${_WPA}/${_WPA}.conf"

for i in `seq 0 30`
do
  logger -p syslog.info -t EXT_WPA "LOOP i = $i"
  if [ -e ${_SRC} ]; then
    cp ${_SRC} ${_DST}
    pkill -f ${_WPA}
    sleep 1s
    ${_EXE} -Dnl80211,wext -iwlan0 -c${_DST} -B
    break
  fi
  sleep 1s
done

動作の内容は以下のとおりです。

  • USBメモリがマウントされ、/media/pi/Wi-Fi/wpa_supplicant.confが見つかるのを待つ(30秒間だけ待機する)
  • wpa_supplicant.conf/etc/wpa_supplicant/ にコピーする
  • 既に起動している wpa_supplicantを停止する
  • wpa_supplicant を起動する(バックグラウンド起動)

4 最後に

今回は、USBメモリに書き込んだファイルでWi-Fi設定の変更を試してみました。使ってみると思ったより便利かもって感じです。

当初、/etc/systemd/system/expanded-wpa_supplicant.serviceみたいなサービスへの追加を検討しましたが、この時点では、まだUSBメモリがマウントされていないため、実装できませんでした。

また、USBメモリを挿入したタイミングで動作させようと、/etc/udev/rules.d/ にルールを追加する事も試してみましたが、このタイミングだと、マウントが完了する前に実行されるため、うまくファイルにアクセスできなくて断念しました。

なお、本構成は、セキュリティについて一切考慮されておりません事を予めご了承下さい。