Raspberry Pi 2 Alpine Linux(3.8.1)

前回から作業を進めているRaspberry Pi ZERO(W)のAlpine Linux(3.8.1)ですがOSとしては動作するのですがDockerの運用となるといろいろ問題があるようです。

Dockerは有線(eth0)に対してブリッジを張るようでwifiのみではdockerはboot時でクラッシュしてしまいます。ちなみにpiの仕様上と思いますがLANケーブルを接続しなくても認識できるeth0デバイスを接続すればwifiからdockerは使用可能になります。
但し公式のコンテナでも特にエラーは出ないのですが動かない(lsリストに載ってこない)ものが多いということで折角zeroで環境を作ったので予備のpi2での運用に切り替えることにしました。

カードの作成

今回は32GBのカードを使ってみました。disklessとあってOSの起動領域は本当少なくていいですね。

一応1000MiBで3個残りをdocker用に割り当てました。
インストールをやり直す時はbootのFAT32をフォーマット、再度書き込めばOKです。
基本のカード作成だけは2〜3分で完了できるようになりました。

ssh接続

前回からまた何度かカードを作り直したのですが初回の接続からキャンセルを喰らうようになりました。初期設定が面倒ですが鍵認証で行くことにしました。
鍵認証の具体的な方法は他を参照してもらうとして接続する側(pi3 root)でssh-keygenを実行、鍵を作成します。パスフレーズは空が使いやすいでしょう。公開鍵は作成したパーテーションに保存。ポイントは以下のとおり
インストールが正常に完了したら鍵(id_rsa.pub)をauthorized_keysに読み込ます
sshd_configを編集、rootログイン可とする
設定が保存できるようにlbu.listを作成

# mkdir ~/.ssh && chmod 700 ~/.ssh
# mount /dev/mmcblk0p2 /mnt
# cp /mnt/id_rsa.pub ~/.ssh
# cd ~/.ssh
# cat id_rsa.pub >> authorized_keys
# chmod 600 authorized_keys
# vi /etc/ssh/sshd_config
PermitRootLogin yes
# vi /etc/apk/protected_paths.d/lbu.list
+root/*/
+root/*/*
# lbu ci -d 忘れずに!
# reboot

rebootして設定が消えていないことを確認
OKだったらカードをZERO(Pi2)に挿し替えて起動
鍵認証はバッチリですねパスワードなしOK
user作成時などパスワード変更を求めてくることがありますが正規の手順でOKです。また戻すことも可能です。

環境設定

# apk add bash vim shadow tmux

sudoはエラーでうまく動かなかったのでroot lohinで運用することにしました。

Persistent storage(永続ストレージ)

当初の設定はほとんどZEROで実行しています。disklessのためメモリの50%の中で動作しているようです。

OSや最低限のツール、dockerを導入するとほぼ一杯になってしまいます。
tmpfs 217.1M 186.2M 30.9M 86% /
そこでwiki.alpinelinux.org/wiki/Raspberry_PiにあるPersistent storage(永続ストレージ)を設定してみました。
OS領域には1GB取っているので512MBをを割り当てることにしました。

# mount /media/mmcblk0p1 -o rw,remount
/etc/fstab 手作業で編集(ro -> rw)
/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=524288
0+0 records in
0+0 records out
# apk add e2fsprogs
# mkfs.ext4 /media/mmcblk0p1/persist.img

# mkfs.ext4 /media/mmcblk0p1/persist.img
mke2fs 1.44.4 (18-Aug-2018)
Creating filesystem with 131072 4k blocks and 32768 inodes
Filesystem UUID: 0d7ee3d4-8734-4c8f-8ac0-72b35e2ac35a
Superblock backups stored on blocks: 
	32768, 98304
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

# echo "/media/mmcblk0p1/persist.img /media/persist ext4 rw,relatime,errors=remount-ro 0 0" >> /etc/fstab
# mkdir /media/persist 
# mount -a

/etc/fstab に追記されます。

/media/mmcblk0p1/persist.img     /media/persist ext4 rw,relatime,errors=remount-ro 0 0
overlay /usr overlay lowerdir=/usr,upperdir=/media/persist/usr,workdir=/media/persist/.work 0 0
# lbu ci -d 忘れずに!

さてこのPersistent storageですがapk addしたパッケージはlbu ci -dを実行するとメモリに読み込まれ実行しなければPersistent storageの/usr以下に保存されます。(rebootしておくのがいいtでしょう)
但しdockerのようにbootから起動が必要なものはlbu ci -dしてメモリに保存しなければいけません。システムに直接関係しているアプリケーションはやはりメモリにインストールが必要です。

dockerインストール

Docker https://wiki.alpinelinux.org/wiki/Docker

# apk add docker
# rc-update add docker boot
# lbu ci -d 忘れずに!
# reboot

# docker -v (起動を確認)
Docker version 18.06.1-ce, build d72f525745
当サイトの目的はAlpine Linux上で走るdockerだったりするので/var/lib/dockerを用意していたmmcblk0p4にマウントします。またmmcblk0p2,mmcblk0p3もマウント
外部のストレージはマウントできません。

# mkdir /media/reserve
# mkdir /media/share

/etc/fstab 編集(当サイト現状のfstab)

/dev/cdrom      /media/cdrom     iso9660 noauto,ro 0 0
/dev/usbdisk    /media/usb       vfat    noauto,ro 0 0
/dev/mmcblk0p1  /media/mmcblk0p1 vfat    rw,relatime,fmask=0022,dmask=0022,errors=remount-ro 0 0
/dev/mmcblk0p2  /media/reserve   ext4    defaults,noatime  0 0
/dev/mmcblk0p3  /media/share     ext4    defaults,noatime  0 0
/dev/mmcblk0p4  /var/lib/docker  ext4    defaults,noatime  0 0
/media/mmcblk0p1/persist.img     /media/persist ext4 rw,relatime,errors=remount-ro 0 0
overlay /usr overlay lowerdir=/usr,upperdir=/media/persist/usr,workdir=/media/persist/.work 0 0
# lbu ci -d 忘れずに!
# reboot

冒頭に述べたとおりZEROではDockerの運用に問題があったためPi2に挿し替えました。

ネットワークは有線です。
pi2ではtmpfsも大分余裕ができました。
/var/lib/dockerやその他も正常にマウントできています。
Persistent storageはoverlay /usrとして見えています。
Docker ComposeはPersistent storageにインストールしていますがまだ試すに至っていないので正しく動作するかはわかっていません。


次回はこのRaspberry Pi 2 + Alpine Linux + Docker で簡単なテストをしてみたいと思います。