ラズベリーパイ3の内蔵wifiを使ってAPを提供しているのですが、どうもパワーマネジメントが有効になっているらしく勝手にお休みして、このままではAPとして役に立たず困ります。というわけでwifiパワーマネジメントをoffにする方法を解説します。
まず、現在wifiインタフェースのパワーマネジメントが有効になっているかどうかは、iwconfigで調べます。次は私のラズベリーパイ3での例です。
pi@RPi-Dev:~$ iwconfig wlan0 IEEE 802.11bgn Mode:Master Tx-Power=31 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:on ...
wlan0のPower Managementを見てください。ここがonになっているとパワーマネジメントが有効になっています。普通はこれをiwconfigのオプションでオフにできます。
pi@RPi-Dev:~$ sudo iwconfig wlan0 power off
しかし、ラズベリーパイ3の内蔵wifiでは、このコマンドを実行すると次のエラーメッセージが出てパワーマネジメントを無効に出来ないことがあります。(メッセージが出なくてもパワーマネジメントを無効に出来きてないこともあります)
Error for wireless request "Set Power Management" (8B2C) : SET failed on device wlan0 ; Invalid argument.
というわけで色々調べてみたら、iwコマンドを使う方法なら無効にできるとわかりました。
pi@RPi-Dev:~$ sudo iw dev wlan0 set power_save off
これを実行したあとのiwconfigの出力は次のようになりました。
pi@RPi-Dev:~$ iwconfig wlan0 IEEE 802.11bgn Mode:Master Tx-Power=31 dBm Retry short limit:7 RTS thr:off Fragment thr:off Power Management:off
Power Managementがoffになっていることを確認してください。
さて私のwlan0はAPとして使用しているので、Power Managementは必ずoffになっていて欲しいものです。しかしリセットすると元に戻ってしまうので、確実に毎回実行されるようにしましょう。幾つか方法がありますが、どれも一長一短なので、自分に合った方法を選んでください。
カーネルモードドライバのパラメータで変更する方法
実際にハードウェアのドライバレベルで指定されているパラメータを調べるには次のコマンドを使います。8192cuはRealtekのwifiチップで、私のラズベリーパイ3のものです。
cat /sys/module/8192cu/parameters/rtw_power_mgnt
この値が1ならパワーマネジメントを起動時に有効にするように指定されています。これを無効にするには、/etc/modprobe.d/8192cu.conf
というファイルを作り、次の行を追加してセーブして下さい。
options 8192cu rtw_power_mgnt=0 rtw_enusbss=0
/etc/network/interfaceで指定する方法1
/etc/network/interfaceのアダプタの設定で、wireless-power off
を指定すると、パワーマネジメントを無効に出来ます。次がその例です。
allow-hotplug wlan1 iface wlan1 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf wireless-power off
(この方法が本来のDebian系wifiマネジメントのお勧めなのですが、wireless firmwareとカーネルのバージョンの組合せ次第ではpi3内蔵wifiでは動かないことがあります。その場合は、方法2を試してください。)
/etc/network/interfaceで指定する方法2
iwconfigを使うwireless-power offは使えなくても、iwコマンド自体は動くので、それを実行しましょう。ifaceの設定には、pre-up(インタフェース起動前), post-up(起動後), pre-down(終了前), post-down(終了後)のイベント毎に実行させるコマンドを指定することが出来ます。そこで、wifiインタフェースが起動した後のpost-upイベントでiwコマンドを実行させます。
allow-hotplug wlan0 iface wlan0 inet static address 172.24.1.1 netmask 255.255.255.0 network 172.24.1.0 broadcast 172.24.1.255 post-up /sbin/iw dev wlan0 set power_save off
/etc/rc.localで設定する方法
起動時に実行されるrc.localでコマンドを直に叩くのももちろん有りです。rc.localのexit 0より前の行に次の一行を追加しましょう。
/sbin/iw dev wlan0 set power_save off