[メモ] Raspbery Pi OS 64bit イメージ作成 (2020年冬版)

<!-- 
[メモ] Raspbery Pi OS 64bit 作成 (2020年冬版)
-->

# 概要

- Raspberry Pi OSの2020年12月2日(`Release date: December 2nd 2020`)から、64bitベータ版がオモテから消えましたよね?
- Raspberry Pi OSイメージ作成スクリプトの[pi-genのarm64](https://github.com/RPi-Distro/pi-gen/tree/arm64)というブランチで、raspiosの64bitを作成しよう。  
- 現在、Troubleshootingのところで、下のようにあるので、x86_64ではうまく動かないっぽい？

    > Please note there is currently an issue when compiling with a 64 Bit O

- 以前のメモ: [\[メモ\] Raspbian: 最新イメージ作成](https://qiita.com/mt08/items/2eae1cbf2172835b0471)

- 結果
	- ラズパイ4BとSSDで、Liteと通常Desktopのイメージが30分程度(APTキャッシュサーバ使用で、初回ではないので、外部からのダウンロード時間は含まれてない、と思う)


# 環境

- Raspberry Pi 4
    - [Ubuntu Server 20.04.1 LTS (64bit)](https://ubuntu.com/download/raspberry-pi) または、
    - [raspios\_lite\_arm64-2020-08-24](https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2020-08-24/)
- USB-SATA & SSD
- Docker使用

# 手順(概要)

1.  ビルド環境準備
    1.  OS (Ubuntu arm64 か、Raspberry Pi OS 64bitベータ版)
    2.  dockerインストール
    3.  apt-cacher-ng : APTのキャッシュサーバ
2.  [`RPi-Distro/pi-gen`](https://github.com/RPi-Distro/pi-gen.git)
    1.  `config` ファイル作成
    2.  スクリプトをちょいと変更
    3.  スクリプト実行


# 手順(詳細)
## 注意点
- build-docker.sh でビルド時、`deploy`フォルダが存在してると、生成物がうまくコピーされないので、削除しておく

## ビルド環境準備
1. ベースOSを焼く
	1. imgファイルを入手
	2. [Raspberry Pi Imager](https://www.raspberrypi.org/software/)で、
		- CHOOSE OS => Use custom にて、イメージファイルを指定。(zipのままいける。)
3. dockerインストール

    ```bash:例
    # Docker
	# https://docs.docker.com/engine/install/debian/#install-using-the-convenience-script
    curl -fsSL https://get.docker.com -o get-docker.sh
	sudo sh get-docker.sh
    sudo usermod -aG docker ${USER}

    # docker-compose
	sudo apt update
	sudo apt install -y python3-pip libffi-dev
	sudo pip3 install docker-compose
	```
	
3. apt-cacher-ng : APTのキャッシュサーバ



## pi-gen: イメージ作成

- キホン (実際には、`echo "IMG_NAME='raspios64'" > config`の代わりに、`config`をうまく編集・設定してから、やる)

	```bash:例
	# レポジトリをクローン、ついでに、arm64ブランチをCheckout
	git clone https://github.com/RPi-Distro/pi-gen.git -b arm64

	cd pi-gen
	git reset --hard # リセット
	git clean -fdx   # クリーン

	# config 作成 (必要最小限)
	echo "IMG_NAME='raspios64'" > config

	# スクリプト変更 i386のイメージを持ってきてしまうのをなおす
	sed -i -e 's@i386/@@g' build-docker.sh

	# ビルドスクリプト実行
	time bash ./build-docker.sh 2>&1 | tee ../build.log

	# deployフォルダの中に、zipファイルがある、はず
	```

- `config` を設定する
`config`ファイルを編集することで、初期設定ができる。(時間帯、言語、キーボードとか、ラズパイの公式イメージは、英国がデフォルト。)
	- `IMG_NAME`(<font color='red'>必須</font>): 生成物のファイル名に使用される
	- `APT_PROXY`: aptキャッシュサーバ指定
	- `DEPLOY_ZIP`: 1:ZIPで出力(既定値) / 0:imgで出力
	- `LOCALE_DEFAULT`: 言語(既定値:``en_GB.UTF-8``)
	- `KEYBOARD_KEYMAP`: キーマップ(既定値:`gb`)
	- `KEYBOARD_LAYOUT`: キーレイアウト(既定値:`English (UK)`)
	- `TIMEZONE_DEFAULT`: タイムゾーン (既定値:`Europe/London`)
	- `FIRST_USER_NAME`: ユーザ(既定値:`pi`)
	- `FIRST_USER_PASS`: ユーザパスワード(既定値:`raspberry`)
	- `WPA_ESSID` `WPA_PASSWORD` `WPA_COUNTRY`: Wifi設定
	- `ENABLE_SSH`: SSH 1:有効 / 0:無効(既定値)

	```bash:config例
	IMG_NAME=orenoraspios64
	APT_PROXY=http://172.17.0.1:3142
	DEPLOY_ZIP=0
	LOCALE_DEFAULT=en_US.UTF-8
	KEYBOARD_KEYMAP=us
	KEYBOARD_LAYOUT="English (US)"
	TIMEZONE_DEFAULT="America/Los_Angeles"
	ENABLE_SSH=1
	FIRST_USER_NAME=`ore`
	FIRST_USER_PASS=`orenopasuwa-do`
	WPA_ESSID=wifi-ssid
	WPA_PASSWORD=wifi-no-password
	WPA_COUNTRY=US
	ENABLE_SSH=1
	```


### Liteイメージだけ作りたい。

- `build-docker.sh`を実行する前に、↓をする

```bash:
touch ./stage3/SKIP ./stage4/SKIP ./stage5/SKIP
rm -rfv ./stage3/EXPORT* ./stage4/EXPORT* ./stage5/EXPORT*
```

- 説明
	- 下の、機械翻訳したところみると、`stage`X(X=0,1,2,3,4,5)フォルダごとにすすむ。
	- stage2で、Lite、stage4で、通常デスクトップ版、stage5がFullといってるイメージ
	- stage*/のフォルダ内に、`SKIP`というファイルがあると、処理されずに次のステージにいく。
	- `EXPORT_IMAGE`という設定ファイルがあると、そこでの結果をimgに出力する

### パッケージを追加したい
- うまい段階の`stageX/00-install-packages/` フォルダの中の、`00-packages` または、`00-packages-NR` に、記述する。
- ``-NR`のほうは、`--no-install-recommends`オプション付きとのこと。
- 例
	- `stage4/00-install-packages/00-package`に、`fcitx-mozc`とか、追加してみてはどうだろうか?



# その他
- deployフォルダの削除は忘れずに



---
---
---
# メモ)2020-12-16 (一部)日本語訳 ～ [www.DeepL.com/Translator（無料版）で翻訳](http://www.DeepL.com/Translator)
- `image`が`画像`と訳されてたところを、`イメージ`に変更

## How the build process works (ビルドプロセスの仕組み)

以下のような手順でイメージを構築していきます。

- すべてのステージディレクトリを英数字順にループします。
    
- このステージディレクトリに `"SKIP"`というファイルが含まれている場合は、次のディレクトリに移動します。
    
- `prerun.sh` スクリプトの実行。これは通常、ステージ間でビルドディレクトリをコピーするために使用されます。
    
- 各ステージのディレクトリでは、各サブディレクトリをループして、それに含まれるインストールスクリプトをそれぞれ実行してください。これらのスクリプトには、先頭に 2 桁の数字を入れて名前を付ける必要があります。いくつかの異なるファイルやディレクトリがあり、ビルドプロセスの異なる部分を制御するために使用できます。
    
    - **`00-run.sh`** - unix シェルスクリプト。実行可能にする必要があります。
    - **`00-run-chroot.sh`** \- イメージのビルドディレクトリの chroot で実行される unix シェルスクリプト。実行するためには実行可能にする必要があります。
    - **`00-debconf`** \- このファイルの内容は、ロケールなどを設定するために debconf-set-selections に渡されます。
    - **`00-packages`** \- インストールするパッケージのリスト。1 行に複数個、スペースで区切って書くことができます。
    - **`00-packages-NR`** \- 00-packages と同じですが、apt-get の --no-install-recommends -y パラメータを使ってインストールされます。
    - **`00-patches`** \- quilt を使って適用されるパッチファイルを含むディレクトリ。もし 'EDIT' という名前のファイルがディレクトリ内にある場合、ビルドプロセスは bash セッションで中断され、パッチを作成/修正できるようになります
- ステージディレクトリに `"EXPORT_NOOBS"`または `"EXPORT_IMAGE"`というファイルがある場合、このステージをイメージのリストに追加して生成します。
    
- 指定したステージのイメージを生成する
    

詳細については、`build.sh`を調べてみることをお勧めします。

* * *

## Stage Anatomy (ステージの詳細)

### Raspbian Stage Overview(概要)

Raspbian のビルドは論理的にわかりやすく、モジュール化するためにいくつかの段階に分けられています。これは初期の複雑さの原因となりますが、メンテナンスを簡素化し、より簡単なカスタマイズを可能にしています。

- **Stage 0** \- bootstrap  
    このステージの主な目的は、使用可能なファイルシステムを作成することです。これは主に `debootstrap` を使用することで達成されます。これは Debian システム上で `base.tgz` として使用するのに適した最小限のファイルシステムを作成します。この段階では、apt の設定も行い、`debootstrap` が見逃した `raspberrypi-bootloader` をインストールします。ミニマルコアはインストールされていますが、設定はされていません。
    
- **Stage 1** \- truly minimal system (真のミニマムシステム)  
    このステージでは、/etc/fstab のようなシステムファイルをインストールしてシステムを起動可能にし、ブートローダを設定し、ネットワークを操作可能にし、raspi-config のようなパッケージをインストールします。この段階では、システムはローカルコンソールに起動し、そこからシステムの設定やインストールに必要な基本的なタスクを実行する手段を持っています。これは、システムができる限り最低限のものであり、伝統的な意味では、おそらくまだ実際には使えないでしょう。それでも、最低限のことをしたいのであれば、これは最低限のことであり、残りの部分はシステム管理者として自分で合理的に行うことができます。
    
- **Stage 2** \- lite system  
    このステージでは Raspbian-Lite イメージを生成します。最適化されたメモリ機能のインストール、timezone と charmap のデフォルト設定、fake-hwclock と ntp のインストール、無線 LAN と bluetooth のサポート、dphys-swapfile、その他ハードウェア管理のための基本的な機能のインストールを行います。また、必要なグループを作成し、πユーザに sudo と標準コンソールのハードウェア権限グループへのアクセス権を与えます。  
    基本的なPythonやLuaパッケージ、`build-essential`パッケージなど、ミニマムなシステムでの開発にはあまり意味のないツールがいくつかあります。pi-gen と一緒である必要はありませんが、これらはより重要なパッケージと一緒にまとめられています。これらは Raspbian のターゲット層にとっては理解できるものですが、もし本当にミニマルなものと Raspbian-Lite の中間のものを探していたならば、ここからトリミングを始めることになります。
    
- **Stage 3** \- desktop system  
    ここでは、X11とLXDE、Webブラウザ、開発用のgit、RaspbianのカスタムUIの強化など、完全なデスクトップシステムを手に入れることができます。これは基本的なデスクトップシステムで、いくつかの開発ツールがインストールされています。
    
- **Stage 4** \- Normal Raspbian image  
    4GB のカードに収まるように設計されています。これはシステムドキュメントのように、Raspbian を新しいユーザに優しいものにするためのほとんどのものをインストールする段階です。
    
- **Stage 5** \- The Raspbian Full image  
    Raspbianのフルイメージ。より多くの開発ツール、メールクライアント、Scratchのような学習ツール、`sonic-pi`のような専門的なパッケージ、オフィスの生産性など。
    

### Stage specification (仕様)

指定したステージまでビルドしたい場合(ライトシステムの場合はステージ2までビルドするなど)、インクルードしないようにしたい`./stage`ディレクトリに`SKIP`という名前の空のファイルをそれぞれ配置します。

そして、SKIP_IMAGES という空のファイルを ./stage4 と ./stage5 (ステージ2までビルドする場合)、または ./stage2 (ミニマムシステムをビルドする場合) に追加します。

```
# Example for building a lite system ライトシステムの構築例
echo "IMG_NAME='Raspbian'" > config
touch ./stage3/SKIP ./stage4/SKIP ./stage5/SKIP
touch ./stage4/SKIP_IMAGES ./stage5/SKIP_IMAGES
sudo ./build.sh  # or ./build-docker.sh
```

lite システムの上に (例えば) 更なる設定を構築したい場合は、`./stage3` と `./stage4` の内容を削除して、同じフォーマットで独自の内容に置き換えることもできます

### Skipping stages to speed up development (ステージをスキップして開発を加速させる)

特定のステージでの作業であれば、推奨される開発プロセスは以下のようになります。

- `EXPORT_*`ファイルを含むディレクトリに`SKIP_IMAGES`というファイルを追加します(現在はstage2、stage4、stage5)
- ビルドしたくないステージに`SKIP`ファイルを追加します。例えば、ライトイメージをベースにしている場合、ステージ3、4、5に追加します。
- [build.sh](http://build.sh) を実行してすべてのステージをビルドします。
- ビルドに成功した初期のステージに`SKIP`ファイルを追加します。
- ラストステージの修正
- `sudo CLEAN=1 ./build.sh` を使って、最後のステージだけを再構築します。
- イメージに満足したら、`SKIP_IMAGES` ファイルを削除して、テスト用にイメージをエクスポートします。