ひこぽんのーと

覚書と雑記です。

Raspberry Piに Arch Linux Armをインストールするのこと

Arch Linux Arm on Raspberry Pi

RaspbianからArch Linux Armに載せ替えてみた。
GUIなどはインストールしなかった分、起動は早かった……ような気がする。
以下に手順を残しておく。

ガイドに従ってインストール

サイトの指示に従ってインストールする。
ガイドは作業PCがLinux前提で書いてあるけど、
Windowsだったらどうするんだろうなぁ。
Raspberry Pi | Arch Linux ARM

環境設定

以下はArch Linuxをインストールした時と同じ手順で行えた。
初期起動時点でsshdは起動しているのでリモートで作業できる。
nagamitsu1976.hatenadiary.jp

GW-900Dのドライバ導入

うちのRaspberry Piは初期型なのでWifiはドングルを使っている。
このドングルはドライバが用意されていないので、
ソースからビルドする必要があるのはRaspbianと変わらない。

ビルド環境の準備

ビルド環境とgitをインストール

$ pacman -S base-devel
$ pacman -S linux-raspberrypi-headers
$ pacman -S git
RTL8812au ドライバの作成&インストール
$ cd [適当なworking directory]
$ git clone https://github.com/gnab/rtl8812au.git
$ cd rtl8812au
$ nano Makefile
# ターゲットCPUをi386からarmに変更
$ make
$ cp 8812au.ko /lib/modules/extramodules--raspberrypi/kernel/drivers/net/wireless/
$ depmod
$ reboot

再起動したらlsmodとdmesgでドライバがロードされているか確認。*2
ip linkでネットワークインターフェイス名を確認し、wifiのI/Fが確認できればOK。

Pacmanフックの追加

カーネルが更新されるとwifiドライバもビルドし直しとなる。
手動ビルドも面倒なので、Pacmanフックを使って自動化してみる。
Pacmanフックを設定するには/etc/pacman.d/hooks配下にhookファイルを配置する。
Arch Linuxwiki Pacmanフックの項を参考に作ってみたhookファイルはこんな感じ。

/etc/pacman.d/hooks/rtl8812au.hook
……
[Trigger]
Operation = Upgrade
Type = Package
Target = linux-raspberrypi
Target = linux-raspberrypi-headers

[Action]
Depends = linux-raspberrypi-headers
Depends = make
Depends = gcc
When = PostTransaction
Exec = /usr/local/src/rtl8812au/8812au_make.sh
……

カーネルカーネルヘッダの更新をトリガーとして、
それらが更新された後にExecで指定したmake用のシェルを実行する、
といった感じ。ドライバのビルドにはカーネルヘッダが必要なので
依存条件にカーネルヘッダが入れてある。*3

wpa_supplicantの設定

接続情報の設定

wpa_passphreseでssidのパスワードを自動生成しておく。
/etc/wpa_supplicant/wpa_supplicant-wlan0.confを新規作成し、以下の内容を記述する。

ctrl_interface=/run/wpa_supplicant
update_config=1
network={
	ssid="XXXXXXXXXXX"
	proto=RSN
        key_mgmt=WPA-PSK
	pairwise=CCMP
	group=CCMP
	#psk="xxxxxxxxxxxxx"
	psk=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ012345678901
	scan_ssid=1
}
wpa_supplicant起動パラメータの編集

このまま起動するとこんな感じで、ドライバー未サポートのエラーが出る。

Successfully initialized wpa_supplicant
nl80211: Driver does not support authentication/association or connect commands
wlan0: Failed to initialize driver interface

Arch Linuxwikiにあるwpa_supplicantの項に対処方法が書いてあるので、
wikiに従って対処する。
WPA supplicant - ArchWiki

$ nano /usr/lib/systemd/system/wpa_supplicant@.service
……
# ExecStartの行の最後に「-Dnl80211,wext」を追加する。
ExecStart=/usr/bin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I -Dnl80211,wext
……
wpa suppliantサービスの有効化

wpa suppliantサービスの有効化を行う。

$  systemctl start wpa_supplicant@wlan0
$ systemctl status wpa_supplicant@wlan0
# ステータス確認で問題なければenableする。
$ systemctl enable wpa_supplicant@wlan0

IPアドレスの割り当て

IPアドレスはsystemd-networkdが管理しているようなので*4、以下を編集する。
ファイルの書き方はここを参照。*5

Ethernetポートの場合

/etc/systemd/network/eth0.networkを編集

[Match]
Name=eth0

#[Network]
#DHCP=yes
[Address]
Address=192.168.10.32/24

[Route]
Gateway=192.168.10.1
Wifiの場合

/etc/systemd/network/wlan0.networkを編集。
ファイルがなければ/etc/systemd/network/eth0.networkをコピーしてリネームしてから編集する。

[Match]
Name=wlan0

#[Network]
#DHCP=yes
[Address]
Address=192.168.10.33/24

[Route]
Gateway=192.168.10.1

systemd-networkdのリロード

systemd-networkdをリロードして、
ip aでIPアドレスが設定通りか確認する。

$ systemctl restart systemd-networkd

再起動

再起動して、ネットワークが自動起動すればOK。

Congraturations!

初期設定はこんな感じでおしまい。

*1:日本のサイトが無いので台湾にした

*2:/lib/modules/extramodules--raspberrypiの配下であれば読み込んでくれるらしい

*3:rtl8812auのMakefileではuname -rの結果をターゲットバージョンとするので、Pacmanフックでビルドする場合は、ターゲットバージョンの取り方を書き換えておく必要がある

*4:http://archpi.dabase.com/

*5:https://wiki.archlinux.jp/index.php/Systemd-networkd