Raspberry Pi3 ZERO(W) Alpine Linux(3.8.1)インストール

Alpine Linux(3.8.1)がリリースされています。
dockerコンテナを運用するにはやはり軽量OSがいいでしょうということで学習用にAlpine LinuxをRaspberry Piにインストールしてみたいと思います。

Alpine Linuxは超軽量ということもあってdebian系と比べるとシステム系のコマンドが大分違うように感じます。またRaspberry Piに配布されているイメージはdiskless modeというこれまた一癖ある仕様かなと思います。
Alpine Linuxに関する情報はTutorials and Howtos当りにあります。(一部古いものもある)
検索すると結構関連情報(ヒント)が見つかると思います。
Raspberry Pi3,zero(W)のwifiドライバーは調べるとbrcmが使われるようです。raspbianのdmesgを調べるとこれが見つかります。

$ dmesg | grep brcm
[    6.140562] brcmfmac: brcmf_fw_map_chip_to_name: using brcm/brcmfmac43430-sdio.bin for chip 0x00a9a6(43430) rev 0x000001

一旦alpineをインストールして調べると/lib/firmware/brcm以下に見つかります。
以上を踏まえて有線なしwifiインストールでいってみたいと思います。

インストール環境

基本の初期インストールはどうしてもディスプレー、キーボードが必要になってしまいます。
運用についてはzero(W)を想定していますがディスプレーやらキーボードを繋ぎ変えるのが面倒(設定も)なためRaspberry Pi3でカードを作成、インストール、ネットワーク設定まで実施、その後はzero(W)に挿し替えてRaspberry Pi3からsshでzero(W)に接続、設定を続行します。

カードの作成

パーティションエディタ(gparted)を起動(作成するカードを間違えないように!)

alpineのOS領域とデータ保存などにするためパーテーションを分けて作成します。
8GBのカード(/dev/sdaで認識)を3000MiBで切ってFAT32でフォーマット、alpineに割り当てて残りをEXT4にしています。
パーテーションを作成したらsda1のフラグをbootにチェックを入れます。


https://alpinelinux.org/downloads/からRASPBERRY PI(armhf)をダウンロード
sda1にコピーして展開、元ファイルは削除します。
特に編集する項目はありません。抜き差しして正常にマウント、ファイルが見えていればOK

Alpine Linux(3.8.1)のインストール

wifiセットアップのため接続情報を用意しておきます。
Pi3にカードをセットしてpower on

# root Enter
# setup-alpine
keyboard
Select keyboard layout [none]: jp
Select variant []: jp

ホスト名はかっこいい名前を!

Enter system hostname (short form, e.g. 'foo') [localhost]: alpine

IPはdhcpで設定してみます。([dhcp]でアドレスを指定すると固定IPになる)
表示はコピーできないので大分端折っています。

Which one do you want to initialize? [eth0] Enter
Ip addres for eth0?  [dhcp] Enter
which one ----- initialize? [wlan0] Enter
Buffallo-G-110=psk (ステーションが表示)
Type the ---- connct to: Buffallo-G-110
---- --- Pre Shared key: xxxxxxxxxxxxxx
Ip address for wlan? [dhcp] Enter
Do you want ------ ? [no] Enter
wdhcpc:sending select for 192.168.0.166 (dhcpでIP取得)
Changing password for root
New password: (rootパスワード)
Retype password: (rootパスワード)
Which timezone are you in? ('?' for list) [?] Asia/Tokyo
HTTP/FTP proxy URL? (http://proxy:8080') [none] Enter
Enter mirror number [f]: done (ネットワークが有効になっていないので取得できない)
Which SSH server? [openssh] Enter
Which NTP client to run? [chrony] Enter
Which disk(s) would you like to use? [none] Enter
---- ----- ----- ----- ---- [mmcblkp01] Enter
---- ----- ----- --- [media/mmcblkp01/cache] Enter
alpine #

取り敢えずインストールが完了しました。
# ip aで見ると設定した内容が反映されていますがまだ有効になっていません。

起動時wifiを有効にします。

# rc-update add wpa_supplicant boot

rebootする前に変更を記憶します。disklessの場合はなにか変更を加えたら必ず実行します。

# lbu ci -d

再起動してネットワークが有効になっているか確認します。

# ip a
2: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether b8:27:eb:95:d9:14 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.166/24 scope global wlan0

yahooはpingを返してくれます。

# ping -c 3 yahoo.co.jp
PING yahoo.co.jp (182.22.59.229): 56 data bytes
64 bytes from 182.22.59.229: seq=0 ttl=47 time=35.139 ms
64 bytes from 182.22.59.229: seq=1 ttl=47 time=20.057 ms
64 bytes from 182.22.59.229: seq=2 ttl=47 time=21.332 ms

--- yahoo.co.jp ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 20.057/25.509/35.139 ms

setup-alpineは何度でもやり直しできます。(一からですが)
有線では2度目にリポジトリを取得します。wifiは初期化するので無理
同一ネットワーク帯に2個のIPを配置することはできないのでwifiを使用する時は/etc/network/interfacesのeth0を無効(コメントor削除)にしておきます。
繋がるネットワークができたら以降はこのファイルで有線、無線、固定、dhcpの変更ができます。
apk addできるまではデフォルトのviエディタを使うことになると思います。
数回インストールをやり直しましたが慣れてくるとカード作成からここまで10分もかからないでできます。

デフォルトのsshはrootからログインできません。userを作成するまでrootからのログインを許可
32行目当りに追記

/etc/ssh/sshd_config
#PermitRootLogin prohibit-password
PermitRootLogin yes

# lbu ci -d 忘れずに!
# poweroff

zero(W)にカードをセット起動、pi3からログイン
zero(W)から起動するとdhcpから取得するIPは変わってしまうと思います。なんらかの方法でIPを捜す必要があります。スマホを利用するとか当サイトではPi3にnmapをインストールしています。

# apt install nmap
# nmap -sP 192.168.0.0/24

Raspberry Pi特有の問題としてクロックを変更する必要があるようです。

# rc-update add swclock boot
 * service swclock added to runlevel boot
# rc-update del hwclock boot
 * service hwclock removed from runlevel boot

# lbu ci -d 忘れずに!
rebootして再ログイン

# rc-status
なんか出てますね。
acpid [ crashed ]
pi3では出ていなかったのでzero(W)特有の問題と思われます。

取り敢えずサービスを止めます。

# rc-update del acpid
 * service acpid removed from runlevel default

# lbu ci -d 忘れずに!

以下は試しに有線でインストール取得したリポジトリです。
正規に取得した場合2行目のmain以降はコメント扱いになっているので解除してやります。
/etc/apk/repositoriesに追記

/media/mmcblk0p1/apks
http://dl-cdn.alpinelinux.org/alpine/v3.8/main
http://dl-cdn.alpinelinux.org/alpine/v3.8/community
http://dl-cdn.alpinelinux.org/alpine/edge/main
http://dl-cdn.alpinelinux.org/alpine/edge/community
http://dl-cdn.alpinelinux.org/alpine/edge/testing

# lbu ci -d 忘れずに!

 # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/main/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.8/community/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/main/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/armhf/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/testing/armhf/APKINDEX.tar.gz
v3.8.1-1-g91d49cb572 [http://dl-cdn.alpinelinux.org/alpine/v3.8/main]
v3.8.1-1-g91d49cb572 [http://dl-cdn.alpinelinux.org/alpine/v3.8/community]
v3.8.0-1995-gca2ab7494b [http://dl-cdn.alpinelinux.org/alpine/edge/main]
v3.8.0-1944-g009fc7167b [http://dl-cdn.alpinelinux.org/alpine/edge/community]
v3.8.0-1940-g1a4a0a7c7c [http://dl-cdn.alpinelinux.org/alpine/edge/testing]
OK: 21677 distinct packages available

ユーザー作成
ディフォルトではadduserが使えます。

adduser -u 1000 -g 1000 -h /home/pi pi

# lbu ci -d 忘れずに!
忘れないでlbuしたのですが再起動するとpiのホームディレクトリや/rootにscpしたファイルがきれいさっぱり無くなってしまいました。
調べてみるとlbuで保存する対象も設定が必要ということです。まだよくわかっていないのですがWeb情報を頼りに以下を設定しています。
piのホームディレクトリはmkdir chownで再作成
/etc/apk/protected_paths.d/lbu.list 新規作成

+home/*/
+home/*/*
+root/*/
+root/*/*

# lbu ci -d 忘れずに!
# lbu lsすると保存リストを表示します。
再起動すると無事保存されるようです。但しネットワークなどを変更すると無くなってしまうこともあるようです。

/dev/mmcblk0p2のマウント
ホームディレクトリや設定ファイルのバックアップなどにも使えます。
/mntは汎用に使うとして/srvにマウントしました。

/etc/fstab 追記
/dev/mmcblk0p2  /srv    ext4    defaults,noatime  0 0

パッケージインストール

# apk add bash tmux sudo shadow

以降適宜 # lbu ci -d 忘れずに! # reboot
shell 変更

# chsh -s /bin/bash

# apk add docker メインの実験環境
# apk add bind-tools ネットワークツール

sshに叱られる
当初は順調に稼働していたのですが次第にssh接続が切れる、最後にはログインできなくなってしまいました。
メッセージは次のとおり
root@192.168.0.188’s password:
PTY allocation request failed on channel 0
WARNING: Your password has expired.
Password change required but no TTY available.
Connection to 192.168.0.188 closed.
パスワードをチェンジしろと言っています。
接続できているときにrootでpasswdしても変更を拒否されてしまいます。
pi3にカードをセットして直ログイン、パスワードを変更、IPを固定IPに変更しました。
詳しいことはわかりませんが原因は2枚のカードを作り直す際に同Ip、同パスワードを使い廻したため不正ログインとPi3にみなされたようです。

追記
#鍵認証でログインすると問題なく接続できるようです。

その後は問題なく稼働しています。
.bashrc .vimrcなどコピーしてさらに必要なコマンドは都度追加、unix系コマンド操作に関してはraspbian lite並になりました。
若干変態的なところがありますが設定ファイルが非常にシンプル、ディレクトリ構成もシンプルなところに好感が持てます。
どこまで使いこなせるかわかりませんがもう少し勉強してみたいと思います。