Back

6月 13 2016

テキストモードでWi-Fi接続を安定させる(Jessie)

Raspberry Mark

Jessie(Debian 8)が新しくなって systemd が導入され、色んな局面で従来の方法が通じなくなりました。

ここでは、Raspbian に於ける Wi-Fi 接続での安定化を目指した一つの方法を通じて、systemd に馴染みたいと思います。あくまでテキストモードで動かしたい事情の元での話で、グラフィック・モード(GUI)で利用される場合は、標準でインストールされる wicd の利用をお勧めします。
このような事態に陥った理由には、今まで Network Manager をストップさせ wpa_supplicant.confinterfaces の記述で安定的に運用できていたものが、dhcpcd の導入で固定アドレスの指定は /etc/dhcpcd.conf にて指定しなければならなかったり、その為に dhcpcd が行おうとする、すべてのインターフェースに対する挙動が不安定さを招いたりと、満足いく結果が得られなかったことです。

そこで、今後の展開も考慮すれば折角導入された systemd に沿ったやり方で安定運用できない物かとの考えに至ったと言う訳です。


=MEMO= 2017年8月17日正式に Raspbian 9 Stretch がリリースされました。仕様が変更されており、LANインターフェース名も wlx0022cfea2fba (wlan0)の様に wlxに続いてMACアドレスを指定する形式になっています。下記の説明中 eth0 や wlan0 を 新しい呼称に置き換えると Stretch に対応します。


テキストモード起動に限定する方法

●inittab が有りません。さてどうすれば?

systemd の導入に伴って inittab そのものが無くなってしまいました。従って runlevel 3 にすることによる限定は出来ません。

  1. ディスプレイマネージャーの起動を止める
  2. 実は私の場合、今まではディスプレーマネージャーの lightdm を自動起動から外して(sudo chkconfig –del lightdm)いました。chkconfig は sudo apt-get install chkconfig にて別途インストールしています)

    同様にchkconfig –list には lightdm が有り、同じ操作をしてみても再起動すると起動してしまいます。理由は、lightdm.service というサービスが既定で Enable になっているからです。そして、このサービスの属性は static で、コマンドでは外せません。

    $ sudo nano /etc/X11/default-display-manager
      GNU nano 2.2.6                   File: /etc/X11/default-display-manager
    # /usr/sbin/lightdm

    コメントアウトします。(#を付けるだけです。)これで標準ディスプレイマネージャーは無しと言うことになります。再起動後テキストモードのログイン・プロンプトで止まります。(お急ぎの方は次の Wi-Fi の章までスキップしてください。


    確認してみましょう。

    $ systemctl list-unit-files

    unitとは、起動の時どういう挙動をするか規定した物で、そのファイルを一覧するコマンドです。sudo は要りません。一覧が表示されたらスペースキーで1ページずつスクロールしますので、lightdm.service を確認してください。

    ついでに lightdm のユニットファイルを確認しておきましょう。

    $ sudo nano /lib/systemd/system/lightdm.service
      GNU nano 2.2.6                   File: /lib/systemd/system/lightdm.service
    [Unit]
    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

    先にコメントアウトしたファイルを参照することが書かれています。
     
     

  3. ディスプレイマネージャーの起動を止めるもう一つの方法
  4. 上述の確認でも分かるように lightdm.service のユニットファイルが /lib/systemd/system/lightdm.service だと分かっていますのでこれをリネームしてしまっても動きません。

    $ cd /lib/systemd/system
    $ sudo mv lightdm.service lightdm.service.org

 

systemd ベースの Wi-Fi 環境を設定する

●wpa_supplicant を使った systemd のサービスを構成する

  1. インターフェース用ユニットファイルの作成
  2. ユニットファイルの名前はどんな物でも判別しやすければ構いません。

    $ sudo nano /etc/systemd/network/wireless.network
      GNU nano 2.2.6                   File: /etc/systemd/network/wireless.network
    [Match]
    Name=wlan0

    [Network]
    DHCP=yes

    次にケーブル接続のユニットファイルも示します。後ほど通常のネットワークサービスをすべて無効化しますので、ケーブル接続が必要な場合は一緒に作成しておきましょう。

    $ sudo nano /etc/systemd/network/wired.network
      GNU nano 2.2.6                   File: /etc/systemd/network/wired.network
    [Match]
    Name=eth0

    [Network]
    DHCP=yes

    #DHCP=no
    #Address=192.168.0.10/24
    #Gateway=192.168.0.1

     

  3. wpa_supplicant@.service を新規に作成
  4. $ sudo nano /etc/systemd/system/wpa_supplicant@.service
      GNU nano 2.2.6                   File: /etc/systemd/system/wpa_supplicant@.service
    [Unit]
    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子機のドライバーの違いによって不要な場合があります。記述せずに動く場合はそれで構いません。

    また wpa_supplicant のコマンドライン・オプションに於いてはスペースが不要なので -D wext-i %iの様に記述する必要は有りません。また %i には運用上、今回の場合、wlan0 が代入されて起動します。つまり上記の場合、wpa_supplicant-wlan0.conf と認識されます。
     

  5. そこで次に、wpa_supplicant-wlan0.conf を作成する
  6. 今回は、wpa_passphrase による暗号化の出力をコピー&ペーストするのではなく、そのまま目標のファイルにリダイレクトしてファイルを作成します。> は新規に記入、>> はその後ろに加えて記入となります。
    例のように、WARPSTAR-8FE884 は対象ルータの SSID、またその後ろの13桁はWPA暗号化キーです。

    $ sudo wpa_passphrase WARPSTAR-8FE884 0046D824FE72C > /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
    $ sudo wpa_passphrase AndroidHotspot9999 256tugh6755ef >> /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
    $ sudo nano /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
      GNU nano 2.2.6                   File: /etc/wpa_supplicant/wpa_supplicant-wlan0.conf
    network={
    ssid=”WARPSTAR-8FE884″
    #psk=”0046D824FE72C”
    psk=19f5f008061fd70d815cfa74377a73222e0e42df442f76225f73b30d9bd3fb18
    }
    network={
    ssid=”AndroidHotspot9999″
    #psk=”256tugh6755ef”
    psk=5162a3ce57038a908e5eda9e238f87f419e38f288ed327d77ea60dfa0f97019f
    }

    ファイルを確認したら、#psk=”—-” の部分はパスワード同然なので [Ctrl]+[k]で行削除しましょう。
    Ctrl]+[o]で保存、[Ctrl]+[x]で終了したら、ファイルへのアクセス権限を制限します。

    $ sudo chmod 600 /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

     

  7. サービスを自動起動可能に設定します
  8. $ sudo systemctl enable wpa_supplicant@wlan0.service

    黄色で示したように @ の後ろにインターフェース名を加えることにより、そのインターフェースに限った機能を提供することが可能です。
     

  9. このサービスの元になる systemd-networkd.service の稼働を確認する
  10. $ sudo systemctl is-enabled systemd-networkd.service
    disabled
    $ sudo systemctl enable systemd-networkd.service

    関連コマンド

    $ sudo systemctl start systemd-networkd.service
    $ sudo systemctl status systemd-networkd.service

 

●不要なサービスを自動起動から外します

  1. networking の無効化
  2. $ sudo systemctl disable networking
  3. wpa_supplicant.service の無効化 wpa_supplicant@.service ではないので注意
  4. $ sudo systemctl disable wpa_supplicant.service
  5. dhcpcd.service の無効化
  6. $ sudo systemctl disable dhcpcd.service

    $ cd /lib/systemd/system
    $ sudo mv dhcpcd.service dhcpcd.service.org

    これは私のケースでは通常の disable コマンド(最上行)で無効化できず、やむを得ずディスプレイマネージャ無効化の2.の方法(下2行)を採用しました。

 

●DNS を DHCP に設定してもらう設定

  1. systemd-resolved を自動起動に設定し、起動させます
  2. $ sudo systemctl is-enabled systemd-resolved
    disable
    $ sudo systemctl enable systemd-resolved
    $ sudo systemctl start systemd-resolved

    さらに、通常存在する etc フォルダの resolv.conf を削除して、代わりに systemd のリゾルバの作成する resolv.conf のリンクを etc に置きます。

    $ sudo rm /etc/resolv.conf
    $ sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

これですべての設定は終わりです。sudo reboot すればネットワークに接続しているはずです。

Back
Back to Top