雑木林

頭の中の整理と忘れないための確認メモ

raspberry pi zero w 初期設定

RasbianのStretchがリリースされてから、何回かOSを入れることがあったのでメモ

OSインストール

今回は以下の環境でインストールを実施

  • NOOBS 2.4.4
  • Rasbian Lite (Stretch)

インストールまでは以下を実施

  1. SD Card FormatterでMicroSDをフォーマット
  2. 展開したNOOSの中身を丸ごとコピー
  3. MicroSDから起動
  4. 無線LANに接続し、Rasbian Liteをインストール
    この時Languageは「English(US)」、Keyboardは「jp」とすること

初期設定

piユーザのパスワード変更

piユーザのでデフォルトパスワードはraspberryなので変更する。
以下のどちらかで実施

  • passwdコマンドによる変更
  • sudo raspi-configコマンドから「1 Cange User Password」を選択

rootユーザのパスワード変更

初期状態はrootユーザのパスワードは未設定、必要に応じて設定

  • sudo passwdコマンドによる変更

ホスト名の変更

デフォルトはraspberryのため、適宜変更する。
以下のどちらかで実施

  • sudo raspi-configコマンドから「2 Hostname」を選択
  • sudo vi /etc/hostname で直接編集

Localeの修正

インストール時にLangageを日本語にしていないため、修正する。
インストール時に日本語にすると、フォルダ名の一部が日本語になるためここで修正する。

  • sudo raspi-configコマンドから「4 Localisation Options」を選択
    • 「I1 Change Locale」を選択して、「ja_JP.UTF-8 UTF-8」にチェックを入れる。
      「了解」を選択し、デフォルトロケールは「ja_JP.UTF-8 UTF-8」を選択する。
    • 「I2 Change Timezone」を選択して、「Asia」「Tokyo」を順に選択する。
    • 「I4 Change Wi-fi Country」を選択して、「JP」を選択する。

SSH / I2Cなどの各種サービスの有効化

デフォルトではSSHが無効化されているため、有効化する。

  • sudo raspi-configコマンドから「5 Interfacing Options」を選択
    以下のサービスを有効化する。CLI環境のためVNCは無効化。
    • P1 Camera
    • P2 SSH
    • P5 I2C

環境変数LANG変更用スクリプト作成

ロケールを日本語環境にしていると、ターミナルで文字化けを起こすことがある。
ログインする環境に応じてLANGを変更するスクリプトを記述する。

$ sudo vi /etc/profile.d/lang.sh
#!/bin/sh

case $TERM in
  linux)
    LANG=C
    ;;
  *)
    LANG=ja_JP.UTF-8
    ;;
esac

export LANG=$LANG



$ chmod +x /etc/profile.d/lang.sh 

Wifi接続のパスフレーズの暗号化

GUIを利用してWifi接続すると設定ファイルにパスフレーズが平文で格納されます。
パスフレーズの漏洩を防ぐためにパスフレーズの暗号化を行います。

$ sudo wpa_passphrase "SSID" "PASS_PHRASE" >> /etc/wpa_supplicant/wpa_supplicant.conf

$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
#psk="PASS_PHRASE" の行を削除します。
また他に平文のものがあればそちらもnetworkブロックごと削除します。

Wifi自動再接続スクリプトの設定

raspberry piwifiは気がつくと切れていることがある。
自動再接続するためのスクリプトをcronで自動実行する。

$ sudo vi /usr/local/bin/reconnect_wifi
#!/bin/sh

OSVER=`grep VERSION_ID /etc/os-release | awk -F '"' '{print $2}'`

ping -c 1 `ip route | grep default | awk '{print $3;}'` >/dev/null 2>&1

if [ $? != 0 ] 
then
    logger "wifi connection error was occured. trying reconecct..."
    case $OSVER in
        "8")
        sudo sh -c "ifdown wlan0 && ifup wlan0" ;;
    "9")
        sudo systemctl restart dhcpcd ;;
    esac

    sleep 10
    
    if [ `ip route | grep default | wc -l ` -eq 0 ] 
    then
        logger "wifi is not connected."
    else
        logger "wifi is connected."
    fi        
fi 



$ sudo chmod +x /usr/local/bin/reconnect_wifi



$ sudo crontab -e
* * * * * sh /usr/local/bin/reconnect_wifi 

Wifiのパワーマネジメント機能をOFFにする(11/7追記)

デフォルトではWifiのパワーマネジメント機能が働いています。
これにより通信が不安定になったりすることがあるため、OFFにします。

$ sudo iwconfig wlan0
wlan0     IEEE 802.11  Mode:Master  Tx-Power=31 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:on


$ sudo /sbin/iw dev wlan0 set power_save off


$ sudo iwconfig wlan0
wlan0     IEEE 802.11  Mode:Master  Tx-Power=31 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off

起動時に設定するには/etc/rc.localなどにコマンドを書いておけばよい

cat /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

# Raspberry Pi Zero W WiFi Power Management off
sudo /sbin/iw dev wlan0 set power_save off

exit 0

【参考】本当にパワーマネジメントは有効になっているのか?
どうやらStretchではパワーマネジメント機能はデフォルトでオフになっているようです。
確かにdmesgには無効化しているログが出るのですが、iwconfigは有効で表示されます。
どっちが正しいかは正直よくわかりません。
ただ、現状だと表示が不一致になっているので上記は設定したほうがいいと思います。

$ dmesg | grep power
[ 16.969625] brcmfmac: power management disabled

$ sudo iwconfig wlan0 | grep 'Power Management'
Power Management:on