Ideal Reality

興味の赴くままに

Raspberry PiにAlpine Linuxをsysモードでインストールする

Raspberry PiにAlpine Linuxを公式の通りにインストールすると、ディスクレスモードでの起動になります。

これはLinux Liveのようなもので、起動中にファイルを編集してもストレージには書き込まれず、一旦Ramdiskに変更を確保しておいて、lbu commitを打つとストレージに保存される動作になります。

こうすることで、起動中に電源が突然落ちてもファイルシステムが壊れる可能性が少なく、組み込み用途では安定した動作が見込めます。ただ、この場合Ramの容量分しか一度にファイルを書き込めないので、結構すぐに容量が足りなくなる。

一応Persistent storageの設定方法もあるのだが、fat32にイメージファイルを作ってそこに保存させるようにする形なので、結局4GB以上は保存できない。そうなるとalpine-sdkpythondockerと...って色々パッケージ入れていくとすぐに容量がなくなる。というか、なぜ16GBのmicroSD使ってるのに4GBしか使えないんじゃい。

というわけで、Raspberry Piでも通常のPCのようにext4パーティションにAlpine Linuxをインストールしてみました。(sys mode)

Contents
スポンサーリンク

パーティションの準備

必要なのはRaspberry Piのブートローダーが使うfat32パーティションと、Alpine Linuxをインストールするext4パーティションです。

microSDの先頭にbootlbaフラグを付けた256MBのfat32パーティションを作って、残りをext4にしてください。Linuxだとgpartedを使うのが楽なので、その様子を下に置いておきます。

Alpine Linuxのダウンロードと展開

downloads | 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で使えなくなってしまって原因の切り分けと対処に手間取りました。でも、ちゃんと動いてよかったです。

やっぱり軽いのは正義ですよ。

スポンサーリンク

コメント

投稿されたコメントはありません

名前

メールアドレス(任意)

コメント

関連する投稿

QEMUにaarch64版のAlpine Linuxをインストールする