pi-genを使ってオリジナルのRaspberry Pi OSをつくろう!
初期設定済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
を使って構築する手順を説明していきます。
環境構築
ここでは、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.txt
や config.txt
は stage1/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を作るための設定はこのようになりました。
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://ubuntu.com/tutorials/how-to-kubernetes-cluster-on-raspberry-pi#4-installing-microk8s ↩︎
-
https://www.raspberrypi.com/products/raspberry-pi-4-model-b/specifications/ ↩︎
-
Ubuntuであれば64bitのイメージがCanonicalから提供されています。このイメージはcloud-initによる初期設定に対応しています https://ubuntu.com/download/raspberry-pi ↩︎
Discussion