「えだまめ」しているラズパイ

30年ぶりに半田ごて握ってラズパイ勉強中。

ラズパイでメッシュWiFiネットワークを構築する(1) OS用SDカード・ラズパイの準備

◯やりたいこと

家の中に増殖しまくっているラズパイ群、

設置場所が広がりすぎてひとつのWiFiアクセスポイントだけでは家内全部をカバーしきれなくなってきました。そこでバケツリレー方式でデータを転送してくれるメッシュネットワークを利用し家内全てにWiFiが届くネットワークの再構築に向け準備を始める事にしました。

今回参考にさせていただいたのはこの記事。
ラズパイでメッシュネットワークを作成する 準備編その1:名刺サイズの超小型PC「ラズパイ」で遊ぶ(第62回) - ITmedia NEWS

記事はとても参考になりました。感謝です。
さらにこの記事の大元である
WiFiMeshRaspberryPi/README.md at master · binnes/WiFiMeshRaspberryPi · GitHub

を翻訳ページ
DeepL翻訳:世界一高精度な翻訳ツール

で訳しながら様々な利用シーンを想定していろいろと実験していきたいと思います。

◯やったこと

1. メッシュネットワーク全体の把握

今回構築するメッシュネットワークの第一到達点は原本記事内にある1番最初のネットワーク図。


(原本記事を和訳したものをワードに貼り付けて印刷、にらめっこしてます)

インターネットがつながるホームネットワークとは別のサブネットでメッシュネットワークを構築し、そのネットワーク内に
 ・ゲートウェイ(Gateway)
 ・ブリッジ(Bridge)
 ・ノード(NODE)
の3つをラズパイで立ち上げられれば第一段階が完成です。
インターネットにつながるホームネットワークが既にあることが前提条件です。

2. メッシュネットワーク構築用ラズパイの準備

2.-1. 使用するラズパイOS

メッシュネットワークに利用するラズパイのOSは新しく構築するということもあり最新版のbullseyeを使用します。あえて新規にインストールせず現在稼働中のラズパイにメッシュをインストールしても大丈夫なのですが、負荷のかかるゲートウェイとブリッジに関しては新規に専用マシンを準備する事にしました。OSの種類は32Bit版Lite、これをCUIでインストールします。(私のラズパイ開発環境は相変わらずiPadで階段下のWindowsマシンにリモートログインする一本指打法なので、実はCUI以外のOSのインストール方法が取れないというのが実情です)。

2-2. SDカード書込み機

SDカードにOSを書き込む方法は Windowsマシンで「Raspberry Pi Imager」を使うのが一般的ですが、やたらと遅いので私の場合ラズパイを利用して作成しています。

OSイメージを一度ダウンロードしてしまえば後は1〜2分で書込みが終了しますので開発時に何度もSDカードを作り直す際はとても重宝します。ここではWindowsマシンではなくあえてラズパイでSDカードを作る方法を記載しておきます。

2-3. OSの書込み

書込み用のラズパイはフルバージョンをインストールしてあり、iPadからリモートログインしてGUI操作ができるようになっています。ただ使用するのは XLTerminal で結果的に CUI での書込みとなります。

2-3-1. OSのダウンロード・解凍

32Bit Lite版 OS 「2022-09-22-raspios-bullseye-armhf-lite.img」をカレントディレクトリにダウンロードします。

wget https://ftp.jaist.ac.jp/pub/raspberrypi/raspios_lite_armhf/images/raspios_lite_armhf-2022-09-26/2022-09-22-raspios-bullseye-armhf-lite.img.xz

ダウンロードが完了したらファイルを解凍しOSイメージをカレントディレクトリに準備しておきます。

xz -dv 2022-09-22-raspios-bullseye-armhf-lite.img.xz


2-3-2. OSの書込み

空のSDカード(空でなくても問題ありません)をUSBカードリーダーにセットし書込み機に差し込みます。この時ディスクをマウントするか聞いてきますのでキャンセルして未マウントの状態を維持します。

dfコマンドで他のSDカードのマウントがない事を確認し、挿入したSDカードのデバイス名が/dev/sdaになる事を確認して以下の書込みコマンドを実行します。

sudo dd bs=4M if=2022-09-22-raspios-bullseye-armhf-lite.img of=/dev/sda status=progress conv=fsync

1分半ほどで書込みが終了します。


2-3-3. bootフォルダのセットアップ

書込みが終わったらこのSDカードで bootする際キー入力が不要となるよう必要なファイルを作成しておきます。
ここでカードリーダーを一度抜き差しします。すると再びマウントするか聞いてきますので今回は暗証番号を入力しSDカードをマウントします。

dfコマンドを実行すると /dev/sda1/(=/media/pi/boot)、/dev/sda2(=/media/pi/rootfs)の2つがマウントされているのが確認できます。

この状態で以下の3つの作業を行います。

a.起動後 SSHでログインできるようsshディレクトリを作成

sudo mkdir /media/pi/boot/ssh

b.WiFi接続用の設定ファイルを作成

sudo nano /media/pi/boot/wpa_supplicant.conf

ファイル内容

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
    ssid="YOUR-SSID"
    psk ="YOUR-PASSWORD"
}


c.ログインユーザーを登録するファイルを作成
前もってログインユーザーのパスワードをハッシュ化しておきます。

echo 'YOUR-PASSWORD' | openssl passwd -6 -stdin

結構長いアルファベット・数字の文字列が出力されますが、これを以下のファイル内で設定するパスワードとして使用します。

sudo nano /media/pi/boot/userconf.txt

ファイル内容

pi:ハッシュ化されたYOUR-PASSWORD


2-3-4. マウントの解除

最後にマウントを解除して完成したSDカードを抜きます。

umount /dev/sda1
umount /dev/sda2


2-4. 作成したSDカードでラズパイを起動

いよいよ 2-3 で準備したSDカードをラズパイにセットして起動します。bootフォルダに書込んでおいた.ssh、wpa_supplicant.confなどのファイルは一度起動してしまうと消去されてしまいますのでセットアップは一発勝負です。セットアップに失敗した場合は2-3に戻って起動ファイルの再設定が必要になりますので注意してください。

2-4-1. IPアドレスの確認

ここからがCUIインストールのむずかしいところです。起動したラズパイにはモニターがつながっていませんのでキチンと起動したかどうかが不明です。そこで NetEnumなどの IPアドレス検索ツールを使ってラズパイが WiFiにつながり DHCPから IPアドレスをきちんともらっているのかどうかを確認します。順調に進んでいれば新しいアドレスが割り振られメーカー名などが表示されます。
この時保険として LANケーブルもつないでおけば WiFiで接続に失敗しても有線で確実に IPアドレスを取得できるので安心です。
割り振られた ipアドレスは次の sshログイン時に必要になりますので別にひかえておきます。

2-4-2. SSHでログイン

WindowsマシンからTeraTermPuttyなどの SSHターミナルを使い、2-4-1 で取得した IPアドレスに 2-3-3.c でセットしたユーザー・パスワードを使ってログインします。

2-4-3. ラズパイのセットアップ

無事ログインできたら以下のコマンドを入力してラズパイのセットアップを行います。
a. 次回起動時に sshでログインできるようホームディレクトリに .sshフォルダを作成

mkdir -m 700 .ssh

b. ファイルシステムの再構築

sudo raspi-config nonint do_expand_rootfs

c. ローカル言語を日本語にセット

sudo raspi-config nonint do_change_locale ja_JP.UTF-8

d. ローカル時間を東京にセット

sudo raspi-config nonint do_change_timezone Asia/Tokyo

e. rootのパスワードを設定

echo -e "YOUR-PASSWOR\nYOUR-PASSWORD\n" | sudo passwd root

YOUR-PASSWORDの部分を任意のパスワードに置き換えて入力します。
f. カーネルのアップデート

echo y | sudo rpi-update ; sudo reboot

ここで再起動しますので再び sshでログインしたら

g. パッケージのアップデート

sudo apt update; sudo apt -y full-upgrade
sudo apt -y autoremove; sudo apt autoclean

でセットアップが完了です。

2-4-4. セットアップおまけ

以下のコマンドは必要であれば実行しておきます。
h. ホストネームの変更

sudo raspi-config nonint do_hostname hoge

g. SDカードを長寿命化するため /tmpフォルダを RAMディスク化

echo tmpfs  /tmp tmpfs defaults,size=256m,noatime,mode=1777 0 0 | sudo tee -a /etc/fstab

h. 同上 /var/logフォルダを RAMディスク化

echo tmpfs  /var/log  tmpfs defaults,size=16m,noatime,mode=0755 0 0 | sudo tee -a /etc/fstab

/var/logフォルダをRAMディスク化する場合は、一度作られたフォルダがないとアプリケーションによっては動作不良になってしまう場合があるので注意が必要です(sanba等)。再起動で消えてしまったフォルダを起動時にスクリプトで再作成しておく必要があります。

以上のコマンドは再起動すると有効になります。

〜 続く 〜

◯現在快調に動作中

本来WiFi電波が届かないところに電波を届けるため、中間地点くらいにバケツリレー用のラズパイ(NODE)をおき

NTPを利用した時計を表示させるラズパイ(NODE)をおくとあら不思議。

インターネット通信してNTPからキチンと正しい時刻を取得し表示しています。中継機の電源を切るとネットが途切れ時間が狂うのでバケツリレーは正しく動作しているようです。メッシュネットワーク、かなり便利なツールの予感がし始めています。