スキップしてメイン コンテンツに移動

Raspberry PiのArchで無線LANに接続する巻

RaspberryPiは超可愛いけど、有線LANでネットワークに接続してると近くに置いて作業することができなくて不便なので無線LANの設定をすることにした。

もちろん無線LANモジュールは本体には載ってないのでUSBで接続するやつを使うしかない。



まず必要なものをpacmanで入れる。
# pacman -S  wpa_supplicant wireless_tools dhclient
dhcpcdを使う人はdhclientは入れなくてもおk。
アダプタは複数刺してなければだいたいwlan0のはず。
わからん場合はip linkで調べるとわかる。
んで、アダプタを有効化する。
# ip link set wlan0 up
これで有効化されたので、接続したい無線LANを探す。
とりあえず何があるのか表示
# iwlist wlan0 scanning|grep "ESSID"
出てきた中から接続したいやつの詳細を表示する。
# iwlist wlan0 scanning|grep "MyHouse" -A 20 -B 5
自宅の無線LANの名前がMyHouseの場合はこれで情報が出てくるはず。周りにあんま無線LANが飛んでないような環境ならgrepしなくてもいい感じ。

次に接続プロファイルを作成する。接続プロファイルには直接パスワードを書き込むこともできるっぽいけれどもあんまりよくないのでコマンドを使って暗号化された鍵を生成する。MyHouseは接続先の名前、Passはパスワードを入れる。
# wpa_passphrase MyHouse Pass > /etc/wpa_supplicant/wpa_supplicant.conf
ちなみにwpa_supplicant.confには最初設定例がいろいろ書いてあるので消したくない人はバックアップをとっておくか">>"で追記にすればよい。

で、このファイルをエディタで開くと
#nano /etc/wpa_supplicant/wpa_supplicant.conf
network={
        ssid="MyHouse"
        #psk="Pass"
        psk=****
}
みたいになってるはず。#psk="Pass"はいらないので消しておく。

僕の家のwifiはiwlistで調べた結果によるとWPA2-PSK・AESなので、以下のようにnetwork={}の中に追記。
暗号化方式がTKIPの場合はCCMPのところをTKIPに変える。
network={
        ssid="MyHouse"
        psk=****
        proto=RSN
        key_mgmt=WPA-PSK
        pairwise=CCMP
        group=CCMP
        priority=1
}
終わったら接続してみる。
# wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf
接続できるとcompletedと表示されるのでとりあえずCtrl+Cでキャンセルする。

うまくいかない場合はパスワードが間違っている可能性があるのでチェックする。最悪パスワードを平文で入力してみる。平文で入力する場合はダブルクオーテーションで囲む。
psk="Pass"
んで-Bをつけてもう一度コマンドを実行する。-Bはバックグラウンドで実行するオプション。

バックグラウンドでこいつが動いてる状態でdhclientを使ってローカルIPアドレスの割り当て要求をDHCPサーバーに出す。
# dhclient wlan0
んで、つながっているか確認する。
# ifconfig wlan0
つながってたらローカルのIPアドレスが表示される。これでとりあえず接続できるようになった。

最後にシステムが起動したときに自動で接続するように設定を行う。自動起動にはArchではsystemdを利用する。systemdについて詳しくはArch wikiを読む。
自動起動するためのユニットファイルを作成。
# nano /etc/systemd/system/wlan0.service
wlan0.serviceの内容を以下のように編集。Descriptionは説明なので適当に、RequiresとAfterを利用してこのカスタムユニットを読み込む前に起動するユニットを指定。
[Unit]
Description=wlan0
Requires=network.target sys-subsystem-net-devices-wlan0.device
After=network.target sys-subsystem-net-devices-wlan0.device
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ip link set dev wlan0 up
ExecStart=/usr/sbin/wpa_supplicant -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -B
ExecStart=/usr/sbin/dhclient wlan0
[Install]
WantedBy=multi-user.target
んで、この設定を有効化する。
# systemctl enable wlan0
これでrebootしてifconfig wlan0で接続を確認する。

ローカルIPアドレスが割り当てられていれば成功。

接続できていない場合、以下のコマンドを利用して原因を探るとよい。
・失敗しているものを一覧表示
# systemctl --failedwlan0.service loaded failed failed wlan0.service
・ユニットの状態を確認
# systemctl status wlan0
例えばipコマンドで失敗している場合以下のように表示される。
# =>ip[114]: Cannot find device "wlan0"
この場合、wlan0がそもそも存在しないと言っているので、wlan0が物理的に刺さっているか、カスタムユニットが起動する前にnetwork.targetsys-subsystem-net-devices-wlan0.deviceが起動しているかなどを確認する。systemctlは起動時に読み込まれるため、起動順が非常に重要になってくることに注意しなければならない。

接続が完了したら、IPアドレスが変わると面倒くさい場合はDHCP払い出しIPを固定しておくとよい。

接続の管理についてはnetctlとかでもできそう。

コメント

このブログの人気の投稿

WindowsRTを脱獄して遊ぶ

あけましておめでとう。今年もゆるーくめもを書いていきますたぶん。 とりあず寝れないのでてきとうに記事でも書こうかと思っただけ。