# RasPi向けArch Linux ARMのheadlessセットアップ

# はじめに

先週の記事で触れたようにRaspberry Pi(初代Type B Rev.2)を更新することにしたが、それに際しOSとしてこれまで使ってきた(Raspbian改め)Raspberry Pi OS (opens new window)ではなくArch Linux ARM (opens new window)を選択した。このインストールについてSDカードを挿入するだけで使用可能になるように構成する。

# 具体的なゴール

  • sshdの自動起動
  • ネットワーク及びwifi接続に関連する設定

を行えれば同一ネットワーク内からからssh接続が可能になる。これを目指す。

# 公式ドキュメントにおけるheadless setupについて

headless setupというキーワードは公式ドキュメント (opens new window)に登場し、まさにこの記事でやりたいことを達成する方法が記載されている。ただしこれはRaspberry Pi OSに限った設定方法のため、他のOSではそのままでは適用できないことに注意する(具体的には各設定を実現するsystemdサービスはRasPiOSにしか含まれていないことによる)。

# Arch Linux ARMのインストール

様々なハードについて公式にやり方が丁寧に紹介されている (opens new window)。今回は自分の環境に合わせarmv6向けRaspberry Piの設定 (opens new window)に従いSDカードを準備する。ただしこれからファイルシステムの中身を覗くためにumountはしないでおく。

以降、セットアップしたいSDカードのルートファイルシステムが/mntにマウントされているとする。

# systemctl enableについて

systemdで管理されているサービスを有効にするサブコマンドとしてenableがあるが、これが本質的に何をしているのかを雑に言うと/etc/systemd/以下の適切な場所にサービスファイルを指すsymlinkを作成している。つまり手作業でsystemd enableをしたければその適切な場所に適切なsymlinkを貼ればいいということになる。

適切な場所というのはまあもちろんサービスによるんだけど、今回登場するものに関しては/etc/systemd/system/multi-user.target.wants/について考えればいい。

# デフォルトのサービス

現在Archのルートファイルシステムが/mntにマウントされているから、Archでインストール時点で有効になっているサービスを調べるには

$ ls /mnt/etc/systemd/system/multi-user.target.wants/
remote-fs.target sshd.service systemd-networkd.service systemd-resolved.service

とすればよい。これによりすでにsshdが有効になっていることがわかる。

# ネットワーク及びwifi接続に関連する設定

RasPiOSのデフォルトはdhcpcdだが、先の結果からArchではsystemd-networkdがデフォルトで有効になっていることがわかるので、それに乗っかる形で設定をするのが良い。

# systemd-networkd

デフォルトで含まれる接続設定は

$ ls /mnt/etc/systemd/network
eth.network
# cat /mnt/etc/systemd/network/eth.network
[Match]
Name=eth0

[Network]
DHCP=yes
DNSSEC=no

となっている。これはraspiにくっついてるEthernetポートに対応する設定だが、今回は無線LANアダプタに固定IPを割り当てたいので以下のようなnetworkファイルを作成した。

[Match]
Name=wlan0

[Network]
# 環境により適切に設定を読み替える
Address=192.168.1.100/24
Gateway=192.168.1.1
DNS=192.168.1.1
# Cloudflare派
DNS=1.1.1.1
DNS=1.0.0.1

ところでデバイスに名前を対応させるudevは最近のバージョンではもはやwlanNという命名を行わずwlpNsMみたいな名前を使うらしい。armv6のArchではwlanNの形式がまだ使われているっぽいけどもしそれ以降のものを使うならName=wl*とかにしたほうがいいかもしれない。

# wpa_supplicant

無線LANに関する設定をしておかなければならない。例えばwpa_supplicantiwdなどが知られているが

$ ls /mnt/usr/bin/wpa_*
wpa_cli wpa_passphrase wpa_supplicant

$ ls /mnt/usr/bin/iw*
iw iwconfig iwevent iwgetid iwlist iwpriv iwspy

と、wpa_supplicantはあるがiwdは無いので前者を使うのが良い。

上で書いたようにwlan0向けの設定を行う。wpa_supplicant-wlan0.confを用意し、/etc/wpa_supplicantの下に置く。

# wpa_supplicant-wlan0.confは手書きでもいい
wpa_passphrase $SSID $passphrase > wpa_supplicant-wlan0.conf
chmod 0600 wpa_supplicant-wlan0.conf
cp wpa_supplicant-wlan0.conf /etc/wpa_supplicant/wpa_supplicant-wlan0.conf

続いてサービスを有効化する。systemdとしての操作はsystemctl enable wpa_supplicant@wlan0.serviceであるため、wpa_supplicant@.servicewpa_supplicant@wlan0.serviceとしてsymlinkを張ることに注意する。

ln -s \
    /usr/lib/systemd/system/wpa_supplicant@.service \
    /mnt/etc/systemd/system/multi-user.target.wants/wpa_supplicant@wlan0.service

# 結果

SDカードを差してしばらく待ってからsshで接続できた。めでたしめでたし。

$ ssh alarm@192.168.1.100
# ok

接続できたら公式マニュアルの残り部分をやっておこう。

$ su -
# Password: root

$ pacman-key --init
$ pacman-key --populate archlinuxarm
# ...

# 参考文献

Last Updated: 2020-11-20T21:15:18+09:00