ラズパイにAlpine-Linuxを画面なしインストール

f:id:irieda:20200821094919j:plain
RaspberryPi 3 or 4 にAlpine-Linux(arm64)を画面とキーボードなしでインストールする方法。

144Labの入江田です。

alpine-linuxのインストールにはこれまで、画面とキーボードが必須だったのでインストールが結構面倒でした。 今回、ヘッドレスインストールに関する情報がAlpine-LinuxWiKiに投稿されましたのでそれを試してみました。

情報元

https://wiki.alpinelinux.org/wiki/Raspberry_Pi-Headless_Installation

予めダウンロード

基本のインストール手順

  1. マイクロSDカード8~32GBをFAT32でフォーマットします。ラベルは「ALPINE」で。
  2. 上記のalpine-rpi-3.12.0-aarch64.tar.gzをALPINEディスクに展開します
  3. 上記のheadless.apkovl.tar.gzを解凍せずにALPINEディスクにコピーします
  4. ALPINEディスクルートにwifi.txtを書く(「ssid WPA-PSK pass-phrase」の3単語を書いておきます)
  5. ALPINEディスクを取り外し操作をします

for macOS

sudo diskutil eraseDisk FAT32 ALPINE MBRFormat /dev/disk2
tar xzvf alpine-rpi-3.12.0-aarch64.tar.gz -C /Volumes/ALPINE/
cp headless.apkovl.tar.gz /Volumes/ALPINE/
echo <無線SSID> WPA-PSK <パスフレーズ> > /Volumes/ALPINE/wifi.txt
find /Volumes/ALPINE \( -name ".DS_Store" -or -name "._*" \) -delete
sudo diskutil unmountDisk /dev/disk2

初回ログイン方法

  1. 前述の方法で作成したマイクロSDをRaspberryPiに差し込んで電源ONします
  2. RaspberryPiはブート後、wifi.txtにしたがって無線接続します
  3. 無線ルーターlocalhostという名称で繋ぎにきてるデバイスIPアドレスを確認します
  4. ssh root@上記のIPアドレス」にてノーパスワードでログインできます

唯一環境に依存して難度が変わるのは、「ラズパイの動的IPアドレスの確認方法」です。 DHCPでアドレス払い出している状況を確認する必要があります。(一般的なルーターは管理画面で確認できます)

初回ログイン後に必要な作業

setup-ntp -c chrony
setup-keymap jp jp
setup-hostname <ホスト名>
setup-timezone -z UTC
setup-apkrepos -1
hostname $(cat /etc/hostname)
setup-lbu mmcblk0p1
setup-apkcache /media/mmcblk0p1/cache
apk add rng-tools
rc-update add rngd boot
rc-update add wpa_supplicant boot
rc-update add urandom boot
mount -o remount,rw /media/mmcblk0p1
rm /media/mmcblk0p1/*.apkovl.tar.gz
rm /media/mmcblk0p1/wifi.txt
rc-update del local default
rm /etc/local.d/headless.start
apk add dbus avahi curl
cd /root
install -d .ssh -m 700
cd .ssh
curl -L http://github.com/<GitHubユーザーID>.keys > authorized_keys
chmod go-r authorized_keys
rc-update add dbus
rc-update add avahi-daemon
echo IPQoS 0x00 >> /etc/ssh/sshd_config
lbu add /root/.ssh/authorized_keys
lbu commit -d
reboot

このあと、「ssh root@<ホスト名>.local」でログインできるようになってます。

この方法の特徴

  • LinuxFAT32をそのまま利用します
  • そのため、SDカードに予め書いておいたファイルを読むこともできます
  • ディスクレスモード動作のためSDカードへの書き込み頻度が非常に少ない(ユーザーが操作した時だけ)
  • 「mount -o remount,rw /media/mmcblk0p1」コマンドにてSDカードに大量のファイルを書き込むこともできます
  • SDカードのサイズに依存せずにインストールでき、SDカードの容量をフルに利用できます
  • インストール作業がとにかく短時間で済みます(SDへの書き込みは100MB以下)

ディスクレスモードについて

  • SDカード、電源の切ったり入れたりが乱暴な運用に向いています
  • apk経由インストールバイナリのみディスク負担がSDカードのFATパーティションにオフロードします
  • RAMの容量で書き込み量の上限が決まっています(特にRAM1GiB以下モデルは要注意)
  • apk以外のディスク消費の大きな作業をするとすぐディスクフルになってしまう
  • lbu add/lbu commitして初めてそれまでに積み上げた変更が永続化されます
  • commitされていない変更はリブート時に破棄されます
  • 基本sshでログインしての作業は最小限の操作しかしないようにしましょう
  • ターゲット上でビルド作業とかはしてはいけません
  • ホストマシンのdocker(arm64ベース)でビルド作業をするか、Go言語のクロスビルドを使いましょう

dockerのススメ

macOSWindows版のdockerは標準で別アーキテクチャCPUのイメージを実行することができます。(Linux版はいくつか追加作業が必要かも?)

docker run -it aarch64/alpine

以上の環境でビルドなり開発作業を行い、成果物だけをRaspberryPiに置いて使います。成果物がかなり巨大な場合はSDカードのFAT領域に置くこともアリです。