Raspberry PiにAlpine Linux入れてデスクトップ環境を構築した…い (1)

ちょっとした実験や軽いものの実行環境としてRaspberry PiにRaspbianを入れて使っています。しかしLite版でも最初から色々入っていて軽量、という所では今ひとつな感じです。そこでDockerでもお馴染み、Alpine Linuxを使ってみようと試行錯誤してみました。まだ目的を完遂できていないので理解できたかもしれないメモとして残します。正直わからない部分のほうが多いので、理解次第修正ということで。

alpinelinux.org

Alpine LinuxRaspberry Pi用にファイルシステムが公開されています。簡単なインストール手順としては公式の手順を参考にします。  

wiki.alpinelinux.org  

まず手頃なSDカードを用意し、FAT形式でフォーマットします。ブートフラグが立っていることが必要です。このSDカードにイメージを配置します。後ほど確保する永続化領域(Persistent storage)もFAT領域内で問題ないようですが、パーティションを分け、ext4で別途フォーマットする方法でも行けるようです。今回は簡単のため前者を採用しました。  

ダウンロードしたtar.gzを展開し、できたファイルをSDカードに書き込みます。armhf版はRaspberry Pi Zeroや1。armv7版はRaspberry Pi 2、3、3+。aarch64はRaspberry Pi 3用…という理解です。アーキテクチャの分類はたまにゴッチャになります…。

イメージを書き込んだSDカードをRaspberry Piに挿し込み電源を入れブートします。最初のセットアップではモニタとキーボードが必要です。ログインプロンプトが表示されたらユーザー名はroot、パスワードは無しでログインできます。

ログインしたらログインメッセージにあるようにalpine-setupコマンドを実行してセットアップを進めます。今回デフォルト以外で設定したのは下記のとおりです。

  • キーボードと言語はjp指定
  • ネットワークは有線(eth0)のみでdhcpを使用
  • wlanはdoneを指定し設定なし
  • apkリポジトリは速いところをfで測定
  • rootのパスワードは適宜

セットアップが一通り終わったら、apkリポジトリの編集を行います。今回はopenJDK8を使用したいのでmainの他にcommunityも有効化します。apk updateも忘れずに。

/etc/apk/repositories

http://nl.alpinelinux.org/alpine/v3.9/main
http://nl.alpinelinux.org/alpine/v3.9/community
#http://nl.alpinelinux.org/alpine/edge/main
#http://nl.alpinelinux.org/alpine/edge/community

 

次に作業を楽にするために外部からsshで入れるように設定します。rootでsshログインするのであくまで一時的なものとお考えください。設定を書き換えたらrc-service sshd restartで再起動します。

/etc/ssh/sshd_config (一部抜粋)

PermitRootLogin yes

次にRaspberry PiのSPIとI2Cを有効化し、UARTもTinyUARTではない方を有効化します。UARTの切り替えはBluetoothと排他のはずですのでご注意ください。この設定のために起動時に読み込まれる設定ファイルを修正します。修正のために一部マウントの再設定が必要です。

/media/mmcblk0p1/config.txt または /media/mmcblk0p1/usercfg.txt (新規作成)

# mount -o rw,remount /media/mmcblk0p1
# vi /media/mmcblk0p1/user.txt
(下記4行を追記)
dtparam=spi=on
dtparam=i2c_arm=on
enable_uart=1
dtoverlay=pi3-miniuart-bt
(上書き保存後)
# rc-update add hwdrivers

次にI2CとSPI用のモジュールを読み込むための設定を行います。

/etc/modules

(下記2行を追記)
i2c-dev
spi-bcm2835

ここまでの作業の締めにPersistent Storage (永続ストレージ)を設定します。Alpine Linuxは通常の手順でインストールするとOSをRAMディスク上に展開して実行するDisk lessモードになります。電源を切ると変更分が失われますが、SDカードへの書き込みが基本的に無いためにSDカードが長持ちします。ただしRaspberry PiのRAM(ここでは50%の512MB?)を使用するため容量的には言うほど大きくありません。そこで永続ストレージを使用するようです。永続ストレージの大きさは必要に応じて指定します。

# mount /media/mmcblk0p1 -o rw,remount
# vi /etc/fstab
(/media/mmcblk01pのマウント設定行でroをrwに変更する)
- /dev/mmcblk0p1 /media/mmcblk0p1 vfat ro,relatime,fmask=0022,dmask=0022,errors=remount-ro 0 0
+ /dev/mmcblk0p1 /media/mmcblk0p1 vfat rw,relatime,fmask=0022,dmask=0022,errors=remount-ro 0 0

# dd if=/dev/zero of=/media/mmcblk0p1/persist.img bs=1024 count=0 seek=1048576
# apk add e2fsprogs
# mkfs.ext4 /media/mmcblk0p1/persist.img
# echo "/media/mmcblk0p1/persist.img /media/persist ext4 rw,relatime,errors=remount-ro 0 0" >> /etc/fstab
# mkdir /media/persist 
# mount -a
# mkdir /media/persist/usr 
# mkdir /media/persist/.work 
# echo "overlay /usr overlay lowerdir=/usr,upperdir=/media/persist/usr,workdir=/media/persist/.work 0 0" >> /etc/fstab 
# mount -a

最後に今までの変更分を反映させ再起動します。

# lbu ci -d
# reboot

ここまでで最低限CUIの設定ができている、はずです。永続ストレージを作ったおかげで完全なDisk lessとはなっていない部分もあると思います。公式では永続ストレージを作った場合はlbu ci -dを実行しないよう書いてあります。英語苦手なのでよくわかりませんが、せっかく永続ストレージにインストールしてもlbu commitでRAM側に展開されてしまい意味がないって事でしょうか。となると、apk addで追加した場合はlbu commitせずに再起動したほうがいいのではないかと思います。でもこの設定では/usrがoverlayFSによってマージされますが、例えば/etcにある設定ファイルの扱いなどが気になります。この辺りはもっと理解を深めないといけません。

この時点で再起動した直後のメモリ使用量は100MBほどでした。これはこれで使い勝手がいいので、一度SDカードの中身をごっそりPCに保管します。これでバックアップはオッケーという手軽さ。次はlxdmとxfce4を使ってデスクトップ環境を構築してみたいと思います。