🔧

pi-genを使ってオリジナルのRaspberry Pi OSをつくろう!

2021/12/13に公開

初期設定済Raspberry Pi OSがほしい!

皆さんはRaspberry Pi を持っていますか?Raspberry Piで遊んでいますか?Raspberry PiにどのようなOSをインストールしていますか?

様々なRaspberry Piの使い道としてのひとつに、Kubernetes clusterの構築というものがあります。Raspberry Piを用いてKuberneters clusterを構築するためには、cgroupの設定をcmdline.txt から変更する必要があります[1]

Kubernetes clusterの構築に限らず、その他にも様々な設定を行ったり、特定のパッケージをインストールして使うことは多いと思います。

そんなとき、自分の使いやすいようにあらかじめ設定されている OS image があると、とても便利ですよね。この記事では、自分専用のRaspberry Pi のOS imageを RPi-Distro/pi-gen を使って構築する手順を説明していきます。

https://github.com/RPi-Distro/pi-gen

環境構築

ここでは、Windows上のVirtualBoxにUbuntu 20.04をインストールして、その中で作業を行うことにします。理由は、WSLでもできるかもしれませんが、環境を汚したくないからです。
このとき、仮想ハードディスクの容量はそこそこ大きめ(50GB程度?)にしておくのをお勧めします。

apt-cacher-ngのインストール

imageの作成過程で、debを何度もダウンロードするので、それのcache serverの役目をしてくれるapt-cacher-ngをインストールします。dockerによるビルドを行う場合にはdocker composeで起動させることもできます。

$ sudo apt install apt-cacher-ng

pi-genのclone

ローカルのどこかに、

$ git clone https://github.com/RPi-Distro/pi-gen.git

などでpi-genをcloneします。

必用なパッケージのインストール

pi-genのREADMEに記載があるように、必用となるパッケージを以下のコマンドでインストールします。

$ sudo apt install coreutils quilt parted qemu-user-static debootstrap zerofree zip \
dosfstools libarchive-tools libcap2-bin grep rsync xz-utils file git curl bc \
qemu-utils kpartx

pi-genの設定

お好みのimageを作るためにpi-genの設定をしていきます。設定項目はREADMEに記載されていますが、ここでは重要もしくは設定しておくと便利な項目について取り上げます。
https://github.com/RPi-Distro/pi-gen#config

名前 説明
IMG_NAME これは今から作成するOSの名前になります
APT_PROXY さっきインストールしたapt-cacher-ngのURLを設定します。http://127.0.0.1:3142 のはず
LOCALE_DEFAULT localeのデフォルト値になります
TARGET_HOSTNAME hostnameを設定できます
KEYBOARD_KEYMAP keymapを設定できます
FIRST_USER_NAME 最初のユーザー名、いわゆる pi を指定できます
FIRST_USER_PASS 最初のユーザーのパスワード、いわゆる raspberry を指定できます
ENABLE_SSH SSHを有効にするかどうかを指定できます
PUBKEY_SSH_FIRST_USER 最初のユーザーがSSHで接続するときの公開鍵を指定します
WPA_ESSID WPA_PASSWORD WPA_COUNTRY ここで指定したWi-Fi APに自動で接続してくれます

これらの値を以下のような書式で config というファイルに書きます。

IMG_NAME=myraspbian
APT_PROXY=http://127.0.0.1:3142/
LOCAL_DEFAULT=en_us.UTF-8
KEYBOARD_LAYOUT="English (US)"

また他にも、pi-genにはstageという概念があります。各stageのディレクトリ内に "SKIP" 及び "SEKIP_IMAGES" というファイルを作成することでそのstageのbuildをしないこともできます。例えばKubernetes clusterのNodeとして設定する場合にはGUIは不要ですから、"stage3" と "stage4" と "stage5" をskipします。

ビルドしてみる

一度、configに上記設定を記入したものでビルドできるかを確認してみます。以下のコマンドでビルドが始まりますが、結構長い時間がかるのでご注意ください。ちなみにDockerを用いてビルドできるともREADMEに記載がありますが、私の場合はうまくいきませんでした。

$ sudo ./build.sh

ビルドが成功すれば、 deploy というディレクトリにイメージが出来上がっています。

カスタマイズする

それでは、configで設定できる項目以上のカスタマイズをしてみましょう!

例えば cmdline.txtconfig.txtstage1/00-boot-files/files にあるので、ここで好きなように設定ができます。cgroup_enable=memory cgroup_memory=1 を追加したりできますね。

apt repositioryの設定は stage0/00-configure-apt/files 以下にあります。ここで sources.list を追加したり、鍵を配置することでkubeadmのrepositoryを追加することができます。そしてstage2の stage2/01-sys-tweaks/00-packages でkubeadm、kubelet、kubectlのインストールを行うように指定できます。

そうして、kubeadm、kubelet、kubectlをインストールしたimageを作るための設定はこのようになりました。

https://github.com/haruelico/pi-gen/commit/ffbebc89071b9787e7c0cf39508b8c79780b0ddd

64bitのimageをつくる

Raspberry Pi OSは、32bitのものしか公式からは提供されていません。しかし、Raspberry Pi 4に搭載されているCPUは64bitに対応している[2]ので、どうせなら64bitのOSを使いたい[3]です。

なんと64bitのimageを作成できるようにするPull Requestが出ているので、このbranchを使えば64bitのimageをビルドすることができます。(先ほどのKubernetes用のカスタマイズもこのbranchから変更を加えています)

https://github.com/RPi-Distro/pi-gen/pull/426

脚注
  1. https://ubuntu.com/tutorials/how-to-kubernetes-cluster-on-raspberry-pi#4-installing-microk8s ↩︎

  2. https://www.raspberrypi.com/products/raspberry-pi-4-model-b/specifications/ ↩︎

  3. Ubuntuであれば64bitのイメージがCanonicalから提供されています。このイメージはcloud-initによる初期設定に対応しています https://ubuntu.com/download/raspberry-pi ↩︎

Discussion