Building your own custom postmarketOS image with custom kernels and settings. Then flash it to the device or build an image.
pmbootstrap custom imageの記事で、postmarketOSのイメージファイルを作成する方法に触れました。この方法は実際にはpmboostrapを使い、公式Gitlabリポジトリから各機種の設定ファイルをダウンロードし、プログラムで手作業風にビルドするものです。
pmbootstrapには新しい機種を移植する機能もあります。ユーザーは自分で機種を追加し、移植作業を進められます。
ただし今回話すのは、既存機種の設定ファイルを変更し、システムビルド時の構成を変更する方法です。たとえば追加ドライバーをLinuxカーネルへ組み込む、デフォルトパッケージを追加する、といった操作です。これはpmbootstrap initだけではやってくれません。そこまで甘くないので、APKBUILDファイルを変更する必要があります。
文末には、変更後のシステムをインストールする手順と、postmarketOSイメージファイルをビルドする方法も載せます。
1. 機種設定ファイルの場所を探す#
APKBUILDファイルは、Linuxカーネルをどう処理するかpmbootstrapへ伝えるスクリプトです。
では、目的の機種のAPKBUILDはどこにあるのでしょうか?
pmbootstrap initコマンドを使うと、pmbootstrapはGitlabリポジトリを1つ複製してきます。
すべての機種設定ファイルはここにあります。
~/.local/var/pmbootstrap/cache_git/pmaports/device/
postmarketOSでは、各機種に対応するlinux-始まりのディレクトリとdevice-始まりのディレクトリがあります。
linux-の中にはLinuxカーネルのコンパイル関連設定が書かれています。
device-始まりのディレクトリには、その端末のハードウェア情報が入っています。
たとえば、これはpine64-pinetab2の場合です(注:執筆時点ではPinetab2のAPKBUILDはまだGitlabリポジトリに入っていなかったため、pull requestから手動でcloneしたものです)。
├── device-pine64-pinetab2
│ ├── APKBUILD
│ ├── deviceinfo
│ └── uboot-script.cmd
└── linux-pine64-pinetab2
├── APKBUILD
└── config-pine64-pinetab2.aarch64すべての端末がメインラインカーネルを使えるわけではないため、postmarketOSでは各端末ごとにLinuxカーネル設定ファイルがあります。postmarketOSの設計では、多くの端末のLinuxカーネルはAPKパッケージになっており、“Downstream kernel specific package"と呼ばれます。これは上で述べたlinux-始まりのディレクトリに対応します。
すでに移植されGitlabリポジトリに入った端末では、カーネルも通常postmarketOSのedge branchパッケージリポジトリに収録されるため、手動コンパイルは不要です。
対応して、device-始まりのディレクトリは"Device specific package"と呼ばれます。このパッケージには、その端末のその他の設定ファイルが含まれます。
カスタムビルド設定をやると言ったからには、少し変更してみましょう。各端末にはビルド方法を記録したAPKBUILDファイルがあります。変更するのはこれです。
2. カーネルのAPKBUILDを変更する#
まず
pmbootstrapを実行し、ビルド対象の端末としてpine64-pinetab2を指定します。~/.local/var/pmbootstrap/cache_git/pmaports/device/linux-pine64-pinetab2ディレクトリへ入ります。APKBUILDファイルが見えます。中身はシンプルで分かりやすく、bashを書いたことがある人なら読めるはずです。
└── linux-pine64-pinetab2
├── APKBUILD
└── config-pine64-pinetab2.aarch64公式Wiki Downstream kernel specific packageの説明によると、APKBUILDの中にカスタムのビルドコマンドを追加したり、GCCバージョンを指定したり、追加でpatchを当てたりできます。
まず見るべきなのは、カーネルソースコードをどう取得しているかです。PineTab2の場合、メンテナー自身のリポジトリからtarg.gzファイルをダウンロードし、それをpmbootstrapに渡してコンパイルしています。
# Source
_tags="v6.6.4-danctnix2"
_config="config-$_flavor.$arch"
source="
$pkgname-$_tags.tar.gz::https://github.com/dreemurrs-embedded/linux-pinetab2/archive/$_tags.tar.gz
$_config
"
builddir="$srcdir/linux-pinetab2-${_tags:1}"
_outdir="out"- カーネルソースコードのURLが変わるたびに、通常はハッシュ値を再生成する必要があります。そのため端末で次のコマンドを実行し、pmbootstrapにハッシュ値を自動計算させてAPKBUILDへ書き戻します。
pmbootstrap checksum linux-pine64-pinetab2- その後、カーネルソースコードを操作できます。いくつかのカーネルオプションを有効化したいだけなら、kconfigへ入れば十分です。
pmbootstrap kconfig edit linux-pine64-pinetab2kconfigで編集したカーネルオプションは、同じディレクトリ内の
config-始まりのファイルへ保存されます。その後、カーネルの再コンパイルを試します。pmbootstrapのカーネルビルドは、ARM chroot内でcross-compileする方式です。
# カーネルがpostmarketOSの要件を満たしているか確認する
pmbootstrap kconfig check
# コンパイル時は-j8を付けると高速化できる
pmbootstrap build linux-pine64-pinetab2- まったく別のカーネルソースコードでコンパイルしたい場合は、自分で別ディレクトリに用意しておく必要があります(chroot内のものはアクセスしにくいです)。そして
--srcでカーネルソースコードのパスをpmbootstrapへ伝えます。
pmbootstrap build linux-pine64-pinetab2 --src=/home/user/Downloads/linux-pinetab2-kernel3. 端末のAPKBUILDを変更する#
~/.local/var/pmbootstrap/cache_git/pmaports/device/device-pine64-pinetab2ディレクトリへ入ると、次の内容があります。
├── device-pine64-pinetab2
│ ├── APKBUILD
│ ├── deviceinfo
│ └── uboot-script.cmddeviceinfoは主に機種のハードウェア情報で、APKBUILDファイルは端末の設定です。中身についてはWiki Device specific packageの説明を参照してください。たとえば、
subpackagesに追加パッケージをインストールする指示を追加します(複数パッケージは空白で区切ります)。ここではWikiの例を引用し、$pkgname-x11というsubpackageを追加し、さらにx11()関数を追加して、xf86-video-qxlパッケージをインストールするよう指示しています。
subpackages="
$pkgname-kernel-v0:kernel_v0
$pkgname-kernel-v2:kernel_v2
$pkgname-x11
"
x11() {
install_if="$pkgname=$pkgver-r$pkgrel xorg-server"
depends="xf86-video-qxl"
mkdir "$subpkgdir"
}- 次に、device packageをビルドします。
pmbootstrap build device-pine64-pinetab24. 完全なシステムイメージファイルを作成する#
変更したシステムを端末へインストールする時間です。
postmarketOSのビルド手順はpmbootstrap custom imageを参照してください。通常は次のビルド方法があります。
- SDカードへインストールする
- fastbootで書き込む
- 書き込み用ZIPでインストールする
後ろ2つの方法は元Android端末向けです。私のPineTab 2のような端末はU-boot対応の開発ボードなので、システムをSDカードまたはeMMCへ書き込めば済みます。
SDカードをPCへ挿し、lsblkでパーティションを確認してアンマウントします。
lsblk
sudo umount /mnt/sdcard次のコマンドを実行し、pmbootstrapにシステムをSDカードパーティションへ直接書き込ませます。途中でパスワード設定が必要です。
pmbootstrap install --dev=/dev/mmcblk0または、imageイメージファイルだけを作成します。
pmbootstrap installそしてtmpディレクトリからイメージファイルを取り出します。
pmbootstrap export
cd /tmp/postmarketOS-export
cp *.img /home/user/Downloads手動でddを使い、イメージファイルの内容をSDカードへ書き込みます。
sudo dd if=pine64-pinetab2.img of=/dev/mmcblk0 bs=1M status=progress conv=fsync

