Raspbian stretchなRaspberry PiをWiFiホットスポット化する

Raspberry Pi 3
Raspberry Pi 3のRASPBIAN STRETCHでWiFiアクセスポイント化するスクリプトがやっと動きました。
時々動かない時があるんだけど・・・



Raspbian jessieで動くホットスポット化をするスクリプトを以前に作りました。
外出時にRaspberry Pi 3を起動すると自動的にホットスポットになるスクリプトを作りました(RPi3_Switchable_HOTSPOT)
これはRaspbian stretchで動きませんでした。

stretchではネットワーク周りの動作が変わってしまい、スクリプトの動作をすべて見直しました。

RPi3_Switchable_HOTSPOTの紹介

RPi3_Switchable_HOTSPOTはHOTSPOT化に必要なパッケージとネットワーク環境の設定を行うスクリプトです。
スクリプトはこちらにあります。
RPi3_Switchable_HOTSPOT / GitHub
この記事公開時ではタグv0.2が最新です。
hostapdを使ってRaspberry PiをWiFiホットスポットにします。
コマンドで簡単にホットスポット化と解除を行えます。
自宅や会社のWiFiアクセスポイントの名前を登録しておくと、アクセスポイントが見える時は通常のWiFi接続を、アクセスポイントが見えない時はホットスポット化をします。
ホットスポット化を行わない時はRaspbian stretchの初期状態と同じになるようにしています。

RPi3_Switchable_HOTSPOTのインストール

"install.sh"スクリプトを実行すると必要なパッケージとネットワークの設定を行います。
Raspberry Pi 3以外の場合はUSBのWiFiドングルを接続してください。
cd ~/Downloads
git clone https://github.com/SignalFlagZ/RPi3_Switchable_HOTSPOT.git
cd RPi3_Switchable_HOTSPOT
./install.sh
LANポートが一つ、WiFiポートが一つないとスクリプトは何もせず終了します。
LANが2つ以上、あるいはWiFiが2つ以上ある場合はどのインターフェースを使うかたずねられます。使うインターフェースが番号と共に表示されるので番号で選択してください。

WiFiアクセスポイントの登録

インストールが終わったら自宅や会社のWiFiアクセスポイント名を登録しておきましょう。
/etc/network/interfaces.d/hotspot ファイルを開きます。
次のように書かれている場所を探します。
mapping wlan0
  script /usr/local/bin/apscan.sh
  map YOUR_ESSID1,home
# map YOUR_ESSID2,home
# map YOUR_ESSID3,office
  map hotspot0
"YOUR_ESSID1"とある部分を自宅などのWiFiアクセスポイントの名前と置き換えます。

RPi3_Switchable_HOTSPOTが行っている事

RPi3_Switchable_HOTSPOTはhostapdを使ってホットスポット化を行います。

インターフェース名について

前回の記事 Raspbian stretchのインターフェース設定に苦戦中です で書いたようにstretchからインターフェース名が変わってしまいました。

これに対応するためスクリプトの最初にインターフェース名を指定するようにしました。インターフェース名が"e"から始まるインターフェースは有線LANとして、"w"から始まるインターフェースはWiFiとして解釈します。
有線あるいはWiFiインターフェースが2つ以上あるとどれを使って良いかスクリプトでは判断できないため、番号付きの一覧を表示しユーザーに選択してもらうようにしました。
一つしかない場合は聞いてきません。

/etc/network/interfacesについて

前回の記事 Raspbian stretchでは/etc/network/interfacesファイルを使わない方が良いようだ で書いたように、interfacesファイルは変更していません。
替わりに/etc/network/interfaces.d/ディレクトリにhotspotというファイルを作成します。hotspotファイルは従来のinterfacesと同じように記述しています。

dhcpcdについて

dhcpcdの動作が未だによくわかりません。ifupdownコマンドと相性が悪いようです。さらにdhcpcdが動いているとhostapdが正しく動かないようです。WiFiのホットスポット化ができませんでした。

dhcpcdはデスクトップのWiFi設定にも関わっており、停止するのは問題が多いと考えています。dhcpcdを停止するとhostapdは動きますが、LANのIPアドレスが取得できなくなります。DHCPクライアントを停止したのですから当然ですね。この時、どうやってLANのDHCPアドレスをもらえば良いかわかりませんでした。iface文でdhcpと書けば取得できるのですが、他のDHCPクライアントを安易に動かすと後々dhcpcdと競合してしまいます。

試行錯誤の結果、hostapdを起動する時にdhcpcdが停止していれば良さそうでした。hostapdが動いてからdhcpcdを動かしても問題は起きないようです。そのためinterfaces(hotspot)ファイルの記述では、pre-upでdhcpcdサービスを停止しpost-upでdhcpcdを再起動しています。

固定IPアドレスを使いたい場合はdhcpcdの設定ファイルに書いてください。

mappingスタンザについて

自宅にいる時はWiFiにつながって、外出時には自動的にホットスポットになるという事を目指しました。そのために、interfacesのmappingスタンザを使っています。
mappingスタンザを使った事例があまりにも少なく、1年前に自分で書いたスクリプトの意味も忘れていました。
apscan.shスクリプトではアクセスポイントの一覧を取得し、map文と同じ名前のアクセスポイントがあるか判断し起動すべき論理インターフェース名を返します。
map文の最後にカンマ区切りの無い論理インターフェース名だけの文を書いておきます。アクセスポイント名が一致しない場合はこの論理インターフェースを起動します。これがホットスポット化の論理インターフェース名になります。

起動時にホットスポット化がうまく行われない場合があるようです。外出時ではアクセス手段が無くなり、電源を入れ直すしかありません。数分待ってもホットスポットが見えない時はこんな状態かもしれません。
ドライバなどの読み込みが完了していないせいか?とも考えましたが、手動で起動しようとしても時々動かない事があります。
$ sudo ifup wlan0
command failed: Read-only file system (-30)
ifup: error trying to executing mapping script /usr/local/bin/apscan.sh on wlan0
この直後にもう一度実行すると動いたりします。誰かがファイルをつかんで離さないような挙動です。
なぜこのような事が起こるのか全く分かりません。

RPi3_Switchable_HOTSPOTの使い方

/etc/network/interfaces.d/hotspotファイルのmap文に自宅や会社のWiFiアクセスポイントの名前を設定します。カンマで区切ってその時起動する論理インターフェース名を指定します。ifupコマンドでWiFiを起動する時のアクセスポイントの状況により、いずれかの論理インターフェース名で起動されます。
WiFi認証はdhcpcdで起動されるWPA_Supplicantに任せています。デスクトップのWiFi設定がそのまま使えます。

Raspberry Piを起動した時に登録したWiFiアクセスポイントが見つからなければホットスポットとして動きます。

ホットスポット名とパスワード

/etc/hostapd/hostapd.conf ファイルで設定してあります。初期値は次のようにしています。
essid : My_AP
password : My_Passphrase

ホットスポット化のオン/オフ

コマンドでもホットスポットのオン/オフができます。

ホットスポット オン

sudo ifdown wlan0
sudo ifup wlan0=hotspot0

ホットスポット オフ

sudo ifdown wlan0
sudo ifup wlan0=home

アクセスポイント名による自動オン/オフ

sudo ifdown wlan0
sudo ifup wlan0

ホットスポット化の強制

/usr/local/bin/hotspot_varファイルを作り"1"と書いてください。

あとがき

ifupdownコマンドは使われなくなっていくようです。できるだけ使わないようにと思ったのですが、ネットワーク設定を簡単に切り替える方法が分かりませんでした。
interfacesファイルのように簡単にネットワークを切り替える仕組みは他にあるのでしょうか?systemdでは複雑な条件分岐をどうやるのか見当もつきません。

dhcpcdの動作もよくわかりません。インターフェース名が複雑になってしまったためGUIやCUIのネットワークマネージャが欲しい所です。Raspbian stretchではdhcpcdがその役割も担っているようです。重要な役割なのにその動作が全くわかりません。
いっそsystemdに完全移行してくれればすっきりするのに。GUIでお手軽設定がまだできないからですかね。

Linuxでは同じディストリビューションでもバージョンが変わっただけで設定が全く変わってしまいます。そして新しい仕組みを無効にして以前と同じに戻したり。なんと不毛な世界でしょう。私はできるだけ最新状態で使いたいと思っていますが、あーめんどくさい。

コメント

最近のコメント

Threaded Recent Comments will be here.