テキストモードでWi-Fi接続を安定にする(Buster)
Jessie(Debian 8)が新しくなって systemd が導入され、色んな局面で従来の方法が通じなくなりました。
ここでは、Raspbian に於ける Wi-Fi 接続での安定化を目指した一つの方法を通じて、systemd に馴染みたいと思います。あくまでテキストモードで動かしたい事情の元での話で、グラフィック・モード(GUI)で利用される場合は、標準でインストールされる wicd の利用をお勧めします。
このような事態に陥った理由には、今まで Network Manager をストップさせ wpa_supplicant.conf と interfaces の記述で安定的に運用できていたものが、dhcpcd の導入で固定アドレスの指定は /etc/dhcpcd.conf にて指定しなければならなかったり、その為に dhcpcd が行おうとする、すべてのインターフェースに対する挙動が不安定さを招いたりと、満足いく結果が得られなかったことです。
そこで、今後の展開も考慮すれば折角導入された systemd に沿ったやり方で安定運用できない物かとの考えに至ったと言う訳です。
=MEMO= 2019年6月20日正式に Raspbian 10 Buster がリリースされました。2020年2月28日現在も内容は変更無く利用出来ています。
=MEMO= 2017年8月17日正式に Raspbian 9 Stretch がリリースされました。仕様が変更されており、LANインターフェース名も wlx0022cfea2fba (wlan0)の様に wlxに続いてMACアドレスを指定する形式になっています。下記の説明中 eth0 や wlan0 を 新しい呼称に置き換えると Stretch に対応します。
テキストモード起動に限定する方法
●inittab が有りません。さてどうすれば?
systemd の導入に伴って inittab そのものが無くなってしまいました。従って runlevel 3 にすることによる限定は出来ません。
- ディスプレイマネージャーの起動を止める
- ディスプレイマネージャーの起動を止めるもう一つの方法
実は私の場合、今まではディスプレーマネージャーの lightdm を自動起動から外して(sudo chkconfig –del lightdm)いました。(chkconfig は sudo apt-get install chkconfig にて別途インストールしています)
同様にchkconfig –list には lightdm が有り、同じ操作をしてみても再起動すると起動してしまいます。理由は、lightdm.service というサービスが既定で Enable になっているからです。そして、このサービスの属性は static で、コマンドでは外せません。
GNU nano 2.2.6 File: /etc/X11/default-display-manager
コメントアウトします。(#を付けるだけです。)これで標準ディスプレイマネージャーは無しと言うことになります。再起動後テキストモードのログイン・プロンプトで止まります。(お急ぎの方は次の Wi-Fi の章までスキップしてください。)
確認してみましょう。
unitとは、起動の時どういう挙動をするか規定した物で、そのファイルを一覧するコマンドです。sudo は要りません。一覧が表示されたらスペースキーで1ページずつスクロールしますので、lightdm.service を確認してください。
ついでに lightdm のユニットファイルを確認しておきましょう。
GNU nano 2.2.6 File: /lib/systemd/system/lightdm.service
Description=Light Display Manager
Documentation=man:lightdm(1)
After=systemd-user-sessions.service
[Service]
# temporary safety check until all DMs are converted to correct
# display-manager.service symlink handling
ExecStartPre=/bin/sh -c ‘[ “$(cat /etc/X11/default-display-manager 2>/dev/null)” = “/usr/sbin/lightdm” ]’
ExecStart=/usr/sbin/lightdm
Restart=always
BusName=org.freedesktop.DisplayManager
先にコメントアウトしたファイルを参照することが書かれています。
上述の確認でも分かるように lightdm.service のユニットファイルが /lib/systemd/system/lightdm.service だと分かっていますのでこれをリネームしてしまっても動きません。
$ sudo mv lightdm.service lightdm.service.org
systemd ベースの Wi-Fi 環境を設定する
●wpa_supplicant を使った systemd のサービスを構成する
- インターフェース用ユニットファイルの作成
- wpa_supplicant@.service を新規に作成
- そこで次に、wpa_supplicant-wlan0.conf を作成する
- サービスを自動起動可能に設定します
- このサービスの元になる systemd-networkd.service の稼働を確認する
ユニットファイルの名前はどんな物でも判別しやすければ構いません。
GNU nano 2.2.6 File: /etc/systemd/network/wireless.network
Name=wlan0
[Network]
DHCP=yes
次にケーブル接続のユニットファイルも示します。後ほど通常のネットワークサービスをすべて無効化しますので、ケーブル接続が必要な場合は一緒に作成しておきましょう。
GNU nano 2.2.6 File: /etc/systemd/network/wired.network
Name=eth0
[Network]
DHCP=yes
#DHCP=no
#Address=192.168.0.10/24
#Gateway=192.168.0.1
GNU nano 2.2.6 File: /etc/systemd/system/wpa_supplicant@.service
Description=WPA supplicant daemon (interface-specific version)
Requires=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device
Before=network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/sbin/wpa_supplicant -i%i -Dwext -c/etc/wpa_supplicant/wpa_supplicant-%i.conf
[Install]
Alias=multi-user.target.wants/wpa_supplicant@%i.service
サービスの名前が wpa_supplicant.service ではなく wpa_supplicant@.service である事に注意してください。また、コマンドライン中の -Dwext については Wi-Fi子機のドライバーの違いによって不要な場合があります。記述せずに動く場合はそれで構いません。
=MEMO= Bookwormでは-Dwext を外してください。
また wpa_supplicant のコマンドライン・オプションに於いてはスペースが不要なので -D wext、-i %iの様に記述する必要は有りません。また %i には運用上、今回の場合、wlan0 が代入されて起動します。つまり上記の場合、wpa_supplicant-wlan0.conf と認識されます。
今回は、wpa_passphrase による暗号化の出力をコピー&ペーストするのではなく、そのまま目標のファイルにリダイレクトしてファイルを作成します。> は新規に記入、>> はその後ろに加えて記入となります。
例のように、WARPSTAR-8FE884 は対象ルータの SSID、またその後ろの13桁はWPA暗号化キーです。
=MEMO= 直接 /etc/wpa_supplicantフォルダを指定しても書き込めないので、一旦homeにファイルを作って後で mv します。
$ sudo wpa_passphrase AndroidHotspot9999 256tugh6755ef >> wpa_supplicant-wlan0.conf
$ sudo mv wpa_supplicant-wlan0.conf /etc/wpa_supplicant/
GNU nano 2.2.6 File: /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
ssid=”WARPSTAR-8FE884″
#psk=”0046D824FE72C”
psk=19f5f008061fd70d815cfa74377a73222e0e42df442f76225f73b30d9bd3fb18
}
network={
ssid=”AndroidHotspot9999″
#psk=”256tugh6755ef”
psk=5162a3ce57038a908e5eda9e238f87f419e38f288ed327d77ea60dfa0f97019f
}
ファイルを確認したら、#psk=”—-” の部分はパスワード同然なので [Ctrl]+[k]で行削除しましょう。
[Ctrl]+[o]で保存、[Ctrl]+[x]で終了したら、ファイルへのアクセス権限を制限します。
黄色で示したように @ の後ろにインターフェース名を加えることにより、そのインターフェースに限った機能を提供することが可能です。
disabled
$ sudo systemctl enable systemd-networkd.service
関連コマンド ここでは実行しないでください。
$ sudo systemctl status systemd-networkd.service
●不要なサービスを自動起動から外します
- networking の無効化
- wpa_supplicant.service の無効化 wpa_supplicant@.service ではないので注意
- dhcpcd.service の無効化 Bookwormでは不要
$ cd /lib/systemd/system
$ sudo mv dhcpcd.service dhcpcd.service.org
これは私のケースでは通常の disable コマンド(最上行)で無効化できず、やむを得ずディスプレイマネージャ無効化の2.の方法(下2行)を採用しました。
●DNS を DHCP に設定してもらう設定
-
Bookowormではsystemd-resolvedは標準ではありません
- systemd-resolved を自動起動に設定し、起動させます
新たにインストールしてください。
disable
$ sudo systemctl enable systemd-resolved
$ sudo systemctl start systemd-resolved
さらに、通常存在する etc フォルダの resolv.conf を削除して、代わりに systemd のリゾルバの作成する resolv.conf のリンクを etc に置きます。
$ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
これですべての設定は終わりです。sudo reboot すればネットワークに接続しているはずです。
Wifiが起動しない場合、rfkillでブロックされている場合があります。
ブロック解除は $ sudo rfkill unblock wifi