Raspberry PiにAlpine Linuxをsysモードでインストールする
Raspberry PiにAlpine Linuxを公式の通りにインストールすると、ディスクレスモードでの起動になります。
これはLinux Liveのようなもので、起動中にファイルを編集してもストレージには書き込まれず、一旦Ramdiskに変更を確保しておいて、lbu commit
を打つとストレージに保存される動作になります。
こうすることで、起動中に電源が突然落ちてもファイルシステムが壊れる可能性が少なく、組み込み用途では安定した動作が見込めます。ただ、この場合Ramの容量分しか一度にファイルを書き込めないので、結構すぐに容量が足りなくなる。
一応Persistent storageの設定方法もあるのだが、fat32にイメージファイルを作ってそこに保存させるようにする形なので、結局4GB以上は保存できない。そうなるとalpine-sdk
とpython
とdocker
と...って色々パッケージ入れていくとすぐに容量がなくなる。というか、なぜ16GBのmicroSD使ってるのに4GBしか使えないんじゃい。
というわけで、Raspberry Piでも通常のPCのようにext4パーティションにAlpine Linuxをインストールしてみました。(sys mode)
パーティションの準備
必要なのはRaspberry Piのブートローダーが使うfat32パーティションと、Alpine Linuxをインストールするext4パーティションです。
microSDの先頭にboot
とlba
フラグを付けた256MBのfat32パーティションを作って、残りをext4にしてください。Linuxだとgpartedを使うのが楽なので、その様子を下に置いておきます。
Alpine Linuxのダウンロードと展開
普通にここからダウンロードしてください。ちなみに、ダウンロードするアーキテクチャは、Zeroや初代はarmhf
、2ならarmv7
、3以降ならaarch64
がベストです。今回はaarch64
をRaspberry Pi 3+と4でテストしてますが、他のモデル・アーキテクチャでも同様にインストールできるはずです。
tarファイルがダウンロードできたら、そのままmicroSDのfat32パーティションに中身全てをコピーしてください。
ちなみに、今回の記事で使用しているバージョンは3.13.2
です。バージョンが変わるとインストール方法も変わる可能性があるのでご注意ください。
起動
microSDをRaspberry Piに挿して起動してください。ユーザーはroot
で、パスワードなしでログインできます。
Welcome to Alpine Linux 3.13
Kernel 5.10.16-0-rpi on an aarch64 (/dev/tty1)
localhost login: root
Welcome to Alpine!
The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org/>.
You can setup the system with the command: setup-alpine
You may change this message by editing /etc/motd.
localhost:~#
setup-alpine
setup-alpine
を実行して初期設定を行ってください。この時注意して欲しい点がいくつかあります。
レポジトリの設定
レポジトリの一覧にアクセスできず、設定できないことがあります。(というか、失敗することがほとんど。たまーに成功する。)その時は以下のように手動で設定するといいです。正常にレポジトリが取得できたならこの手順は必要ありません。
wget: can't connect to remote host: Host is unreachable
wget: can't connect to remote host: Host is unreachable
r) Add random from the above list
f) Detect and add fastest mirror from above list
e) Edit /etc/apk/repositories with text editor
Enter mirror number (1-0) or URL to add (or r/f/e/done) [1] https://dl-3.alpinelinux.org/alpine/v3.13/main
ミラーのURL一覧が取得できていないので、ミラーの番号を打ち込むところに直接レポジトリのURLを叩き込みます。URLのv3.13は適宜自分がインストールしているバージョンに合わせてくださいね。
インストール先の指定
ストレージへのインストールは手動で行うため、ディスク選択や保存先の指定を求められたら全てnone
でスキップしてください。
No available disks found. Unmount /media/mmcblk0p1 and retry? (y/n) [n]
Enter where to store configs ('floppy', 'mmcblk0p1', 'usb' or 'none') [mmcblk0p1] none
Enter apk cache directory (or '?' or 'none') [/var/cache/apk] none
ext4パーティションへのインストール
まずは必要なパッケージをインストールしてから、インストール先のext4パーティションをマウントします。
apk add e2fsprogs
mount /dev/mmcblk0p2 /mnt
そしたらsetup-disk
という、ストレージにシステムをコピーするスクリプトを実行するんですけど、実はこのスクリプト3.13からRaspberry Piに対応してます。
setup-disk: add rpi support · alpinelinux/alpine-conf@c2f6f7d
ただ、これだとfat32以外のパーティションにインストールさせてくれないので、Raspberry Piだということを分からなくして、ブートローダーをgrubと偽ってsetup-alpine
を実行します。
chmod -r /proc/device-tree/model
export BOOTLOADER=grub
export USE_EFI=1
setup-disk -m sys /mnt
もちろんgrubではないので、grub関連のエラーが出ますが、/mnt
にファイルがコピーされてinitramfsが生成されたならば上々です。
カーネルとinitramfsの配置
ext4パーティションにインストールした時点では、Linuxカーネルやinitramfsはext4パーティションの/boot
ディレクトリ内に保存されます。ただ、Raspberry Piのブートローダーはfat32のパーティションからカーネルやinitramfsを読み込もうとするので、これらを移動させなければいけません。
まずはfat32パーティションを書き換えられるようにリマウントしたら、インストーラーを起動するのに使ったカーネルやinitramfsは不要なので削除します。
mount -o remount,rw /media/mmcblk0p1
rm -f /media/mmcblk0p1/boot/*
次に、ext4パーティション内の/boot
にある不要なシンボリックリンクを消したら、/boot
ディレクトリの中身を全部fat32パーティションに移動させます。
cd /mnt
rm boot/boot
mv boot/* /media/mmcblk0p1/boot/
そして、ext4パーティション内の/boot
があった場所に、fat32パーティション内のboot
ディレクトリへのシンボリックリンクを置くのですが、そもそもfat32パーティションの自動マウントの設定をしてないので、まずこちらから用意します。
mkdir media/mmcblk0p1
vi etc/fstab
マウントポイントを作って、エディタでfstabを開いたら、/dev/cdrom
から始まる行と/dev/usbdisk
から始まる行を消して、以下の行を追加してください。
/dev/mmcblk0p1 /media/mmcblk0p1 vfat defaults 0 0
あとはboot
ディレクトリのシンボリックリンクを作ればOKです。
rm -rf boot
ln -s media/mmcblk0p1/boot boot
cmdline.txt
の編集
ルートディレクトリがext4パーティションだってことを起動オプションで指定してやらないと、initramfsのinitプログラムはちゃんとchrootをしてくれません。なので、
vi /media/mmcblk0p1/cmdline.txt
cmdline.txt
をエディタで開いたら、以下のように末尾にroot=/dev/mmcblk0p2
を追加してください。
modules=loop,squashfs,sd-mod,usb-storage quiet console=tty1 root=/dev/mmcblk0p2
保存してviを終了したらインストールは完了です。reboot
で再起動してください。そうしたらext4にインストールしたAlpineから起動するはずです。実際にmountコマンド叩いたら/
が/dev/mmcblk0p2
になってることが確認できます。
rpi3p:~# mount
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
devtmpfs on /dev type devtmpfs (rw,nosuid,relatime,size=10240k,nr_inodes=107754,mode=755)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
shm on /dev/shm type tmpfs (rw,nosuid,nodev,noexec,relatime)
/dev/mmcblk0p2 on / type ext4 (rw,relatime)
tmpfs on /run type tmpfs (rw,nodev,relatime,size=93376k,mode=755)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,nosuid,nodev,noexec,relatime)
configfs on /sys/kernel/config type configfs (rw,nosuid,nodev,noexec,relatime)
tracefs on /sys/kernel/debug/tracing type tracefs (rw,nosuid,nodev,noexec,relatime)
/dev/mmcblk0p1 on /media/mmcblk0p1 type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
まとめ
Classic install or sys mode on Raspberry Pi - Alpine Linux
実は3.12だと上記のAlpineのWikiと、ほとんど同じ方法でインストールが可能で、それについて記事を書こうと思ってたのですが、3.13で使えなくなってしまって原因の切り分けと対処に手間取りました。でも、ちゃんと動いてよかったです。
やっぱり軽いのは正義ですよ。
コメント