最近構築した「専用Wi-Fiアクセスポイント(AP)」 を、ついいつものアクションでUpdateしてしまったら、使えなくなってしまいました。一度記事を起こした手前、原因を調べておかないと不味いなぁと…
どうせ作り直すならと最新OSで再構築してみますが、ネット上にある古い記事の通りに試すと高確率で泥沼に叩き落とされてしまいます。
そのため、今回は過去の方法をすべてリセットし2026年現在の最新仕様に真っ向からチャレンジしてみました。
なぜ今、最新OSでWi-Fiアクセスポイントを作り直すのか?
ネットで「ラズパイ アクセスポイント化」と検索すると、内蔵Wi-Fiだけを使って受信(STA)と発信(AP)を同時にこなす「仮想AP(STA+AP同時モード)」の記事がたくさん見つかります。
しかし、結論から言うと、最新のRaspberry Pi OS(Bookworm)において、1つのチップに頼る仮想APは『迷宮への入り口』です。Linux公式ドライバの仮想APサポートはとにかく挙動が怪しく、OSの小さなアップデートや接続するスマホの機種(Pixelなど)との相性によって、昨日まで動いていたものが突然動かなくなってしまいます。
そこで今回は、不確実な仮想APを諦め、安価に買える外付けUSB Wi-Fiドングルを1本追加した「物理2枚差し(2チップ構成)」を採用しました。
物理的に役割を分けることで怪しいバグを根本からシャットアウトし、OS標準のネットワーク管理ツールである「NetworkManager(nmtui)」だけで完結する、絶対に裏切らない最安定のアクセスポイントを目指します。
採用したUSB Wi-Fiドングルについて
今回利用したUSB Wi-Fiドングルは、使わなくなって仕舞い込んでいた古いものです。
Raspberry Piで使うために購入した製品なので、特に何も設定しないでも認識しました。
導入した製品はこちら。
外部ツール不要!nmtui で作るアクセスポイント(基本編)
外部ツール(create_apなど)は使わず、画面の指示に従って矢印キーとスペースキーだけで設定できる nmtui を使います。その方が後々見返した時に役に立ちそうです。
nmtuiでのAP作成
ターミナルで以下のコマンドを実行し、設定画面を開きます。
sudo nmtui- 「接続の編集(Edit a connection)」 ➔ 「追加(Add)」 ➔ 「Wi-Fi」 を選択。
- 設定画面で以下のように入力します。
- プロファイル名 / SSID:
Wi-Fi AP(お好みの名前) - モード:
アクセスポイント(Access Point) - デバイス:
wlan1(外付けUSBドングルを指定) - セキュリティ:
WPA & WPA2 Personal(スマホ等から接続する際のパスワードを設定)
- プロファイル名 / SSID:
- 「OK」で保存して画面を閉じます。
インターネット共有(NATルーティング)の有効化
NetworkManagerを使って、インターネットをスマホと共有する設定を行います。
sudo nmcli connection modify "Wi-Fi AP" ipv4.method shared設定後、一度接続を立ち上げ直して、スマホから電波が見えるかテストしてみましょう。
sudo nmcli connection up "Wi-Fi AP"再起動してもネットに繋がる!自動起動の完全最適化(設定編)
「動いた!」と喜んだのも束の間、ラズパイを再起動するとスマホが「インターネット未接続」になってしまう壁にぶち当たりました。原因は、最新OSで採用されているネットワーク初期設定ツール「Netplan」と「NetworkManager」による起動直後の主導権争いです。
起動直後にNetplanがネットワーク全体をリフレッシュしてしまうため、NetworkManagerがせっかく組み立てた「インターネット共有(NAT)」の仕組みを初期化していたのです。これを先回りして100%解決する対策が以下の2ステップです。
OSレベルでのパケット転送の恒久化
ラズパイのOS自体に「常にパケットを横流していいよ」という許可設定を永続的に書き込みます。
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.d/30-ipforward.conf
sudo sysctl --system主導権争いを調整する「10秒ウェイト」の割り込みスクリプト
Netplanの割り込み処理が完全に落ち着いた後に、アクセスポイントを自動起動させる仕掛けを作ります。
以下のコマンドをそのままコピペして実行し、専用のトリガースクリプトを作成します。
sudo tee /etc/NetworkManager/dispatcher.d/99-wifi-ap-trigger.sh << 'EOF'
#!/bin/bash
INTERFACE=$1
ACTION=$2
# wlan0(インターネット側)が完全にアクティブになったら発動
if [ "$INTERFACE" = "wlan0" ] && [ "$ACTION" = "up" ]; then
# Netplanの落ち着きを待つために10秒待機
sleep 10
# Wi-Fi APを確実に叩き起こす
nmcli connection up "Wi-Fi AP"
fi
EOFシステムが自動実行できるように、実行権限を与えます。
sudo chmod +x /etc/NetworkManager/dispatcher.d/99-wifi-ap-trigger.shこれで、ラズパイの電源を入れるだけで、100%確実にインターネットまで繋がった電波が使える最強のWi-Fiインフラが完成しました。

なかなかイカついアンテナです。
もう10年も前の製品なんですよね。
現場のトラブル解決ポイント(深掘りコラム)
今回の検証で遭遇したトラブルの共有です。もし繋がらない場合はここをチェックしてみてください。
USB Wi-Fiドングルの「パワーセーブ(省電力)」の罠
スマホが接続を試みた瞬間に、ドングルがOSからブツッと消えてしまう(デバイス消失)怪奇現象が起きました。
原因は通信がバーストした瞬間の電力不足(ハングアップ)です。 無線チップの省電力を明示的にオフにすることで、嘘のように安定します。
sudo iw dev wlan1 set power_save offWi-Fiの「国コード(電波法)」の罠
OSのクリーンインストール直後は、ラズパイ全体のWi-Fi国コードが初期化されがちです。日本の電波法に合わないチャンネルでスマホと通信しようとしてチップがクラッシュするのを防ぐため、必ず「JP」に固定します。
sudo iw reg set JP
sudo raspi-config nonint do_wifi_country JP有線と無線の「ハイブリッド運用」
普段は内蔵無線(wlan0)でインターネットを拾い、メンテナンス時に有線LAN(eth0)を挿すと自動で有線経由の爆速モードに切り替わるように、ネットワークの優先順位(メトリック値)を黄金比率で固定しておくと、ルーティングが迷子にならず超快適です。
# 有線(eth0)の優先度を一番高く(数字を小さく)
sudo nmcli connection modify "netplan-eth0" connection.autoconnect-priority 100 ipv4.route-metric 10
# 内蔵無線(wlan0)の優先度を有線より少し低く(※接続名は環境に合わせてください)
sudo nmcli connection modify "netplan-wlan0-YOUR_SSID" connection.autoconnect-priority 50 ipv4.route-metric 50ディスクトップ起動とCUI起動の切り替え
CUI(コマンドライン)モードで起動させるにはディスクトップから設定アプリで行うのが通常ですが、Raspberry PI 3だととっても重くて使いづらいです。SSH接続でコマンドラインから変更できると色々と捗ります。
GUIとCUIの切り替えはsystemdターゲットを変更することで可能となります。
systemdターゲットとは
systemdターゲットは、関連するユニット(サービス、ソケット、デバイスなど)をグループ化し、システムの特定の状態に移行させるための設定です。
- poweroff.target: システムをシャットダウンする
- rescue.target: シングルユーザーモード
- multi-user.target: マルチユーザーモード
- graphical.target: マルチユーザーモードでグラフィカルインターフェースを提供する
- reboot.target: システムを再起動する
CUIモードに切り替えるには以下のコマンドを実行します。
sudo systemctl set-default multi-user.target現在のターゲットを確認するには以下のコマンドです。
sudo systemctl get-defaultCUIモードから一時的にGUIを使う場合は以下のコマンドです。
startx日本語ターミナルのインストール
SSH接続していると気にならないのですが、本体HDMIにモニターを接続するとそのままでは文字化けしてしまいます。
一番簡単なのはfbtermですので、とりあえずインストールしておくことをお勧めします。
日本語フォントが別途必要なので注意してください。(最近はJPを設定すると自動でインストールされると思っていますが、もしかしたら違うかも…)
sudo apt install fbtermCUIモードが前提の場合は自動で起動する様にしておくと便利です。
私は以下の様に設定しています。
nano .bashrc
…省略…ファイルの最後に以下を追記します…
if [ -z "$DISPLAY" ] && [ "$(tty)" = "/dev/tty1" ]; then
echo "fbterm starts in 2 seconds. Press Ctrl + C to cancel..."
sleep 2
exec fbterm
fitty1のみで起動:[ "$(tty)" = "/dev/tty1" ]により、最初の仮想コンソールにログインした時のみfbtermが起動するように制限します。これを設定しないと、全TTYでループが発生してログインできなくなる恐れがあります。- キャンセルの猶予:
sleep 2とechoを挟むことで、万が一の設定ミス時にCtrl + Cを押して自動起動をキャンセルし、シェルに戻れるようにします。 - fbtermをデフォルトにしている: startxは失敗します。注意してくださいね。
ドライバーの確認方法
USB Wi-Fiドングルのドライバーは以下のコマンドで確認できます。インストールが必要なので備忘録として書き残しますね。
sudo apt install lshw
sudo lshw -C network自動再起動を設定しておきます
立ち上げっぱなしは自然と不安定になってしまいます。システムの高度化が進むとしょうがないですよね。毎週日曜の深夜に再起動する様に仕込んでおきます。
sudo crontab -e
…省略…ファイルの最後に以下を追記します…
# 毎週日曜日、AM01:00 に再起動
00 02 * * 0 /sbin/reboot動作確認は以下のコマンドです。
systemctl status cron.serviceまとめ
今回のアクセスポイント構築は、最新OSの仕様変更やUSBドングルの給電バグなど、一筋縄ではいかないトラブルの連続でした。もし個人で海外のニッチなフォーラムを放浪していたら、解決までに10倍以上の時間を費やしていたはずです。
しかし、今回の本当に大きな成果は「Wi-Fiが繋がったこと」だけではありません。「人間とAIがどのように連携してゴールに辿り着いたか」という、これからの新しい開発スタイルを実践できたことです。
膨大な情報を持つAIは、エラーログを渡せば即座に的確な原因(USBの電力不足や国コードの罠など)を突き止めてくれます。ですが、情報が豊富すぎるがゆえに、時に過去のセオリーに引っ張られて問題を複雑な沼へ沈めてしまうこともあります。
そこで重要になるのが、人間の「手綱さばき」です。 「少し複雑になりすぎたから、一度すべてリセットして、OS標準機能(nmtui)でシンプルにいこう」という大局的な決断は、現場の勘を持つ人間にしかできません。
技術の手順はいつか古くなりますが、この「AIとの理想的な協力関係」の築き方こそが、これからのモノづくりを何倍も加速させる最強のスキルになると確信しています。
記事を起こすのにも積極的に活用したいと考えています。サクサクと記事にして共有することのほうが有益だと考えてAIが紡ぐ記事を活用する方針にしました。少々AI風味が強くなってしまいましたがご承知おきいただければ幸いです。
皆さんもぜひ、AIという最高の相棒と一緒に日々の自由研究にチャレンジしてみてください



コメント