メインコンテンツへスキップ

pmbootstrapでカスタムシステムimageをビルドし、カーネルAPKBUILD設定を変更する

·
カテゴリー スマートフォン 真のLinuxスマホ
タグ PostmarketOS Linux Kernel
目次

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を変更する
#

  1. まずpmbootstrapを実行し、ビルド対象の端末としてpine64-pinetab2を指定します。

  2. ~/.local/var/pmbootstrap/cache_git/pmaports/device/linux-pine64-pinetab2ディレクトリへ入ります。

  3. APKBUILDファイルが見えます。中身はシンプルで分かりやすく、bashを書いたことがある人なら読めるはずです。

└── linux-pine64-pinetab2
    ├── APKBUILD
    └── config-pine64-pinetab2.aarch64
  1. 公式Wiki Downstream kernel specific packageの説明によると、APKBUILDの中にカスタムのビルドコマンドを追加したり、GCCバージョンを指定したり、追加でpatchを当てたりできます。

  2. まず見るべきなのは、カーネルソースコードをどう取得しているかです。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"
  1. カーネルソースコードのURLが変わるたびに、通常はハッシュ値を再生成する必要があります。そのため端末で次のコマンドを実行し、pmbootstrapにハッシュ値を自動計算させてAPKBUILDへ書き戻します。
pmbootstrap checksum linux-pine64-pinetab2
  1. その後、カーネルソースコードを操作できます。いくつかのカーネルオプションを有効化したいだけなら、kconfigへ入れば十分です。
pmbootstrap kconfig edit linux-pine64-pinetab2
  1. kconfigで編集したカーネルオプションは、同じディレクトリ内のconfig-始まりのファイルへ保存されます。

  2. その後、カーネルの再コンパイルを試します。pmbootstrapのカーネルビルドは、ARM chroot内でcross-compileする方式です。

# カーネルがpostmarketOSの要件を満たしているか確認する
pmbootstrap kconfig check

# コンパイル時は-j8を付けると高速化できる
pmbootstrap build linux-pine64-pinetab2
  1. まったく別のカーネルソースコードでコンパイルしたい場合は、自分で別ディレクトリに用意しておく必要があります(chroot内のものはアクセスしにくいです)。そして--srcでカーネルソースコードのパスをpmbootstrapへ伝えます。
pmbootstrap build linux-pine64-pinetab2 --src=/home/user/Downloads/linux-pinetab2-kernel

3. 端末のAPKBUILDを変更する
#

  1. ~/.local/var/pmbootstrap/cache_git/pmaports/device/device-pine64-pinetab2ディレクトリへ入ると、次の内容があります。
├── device-pine64-pinetab2
│   ├── APKBUILD
│   ├── deviceinfo
│   └── uboot-script.cmd
  1. deviceinfoは主に機種のハードウェア情報で、APKBUILDファイルは端末の設定です。中身についてはWiki Device specific packageの説明を参照してください。

  2. たとえば、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"
}
  1. 次に、device packageをビルドします。
pmbootstrap build device-pine64-pinetab2

4. 完全なシステムイメージファイルを作成する
#

変更したシステムを端末へインストールする時間です。

postmarketOSのビルド手順はpmbootstrap custom imageを参照してください。通常は次のビルド方法があります。

  1. SDカードへインストールする
  2. fastbootで書き込む
  3. 書き込み用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

関連記事


最後までお読みいただきありがとうございます。本サイトでは公開コメント欄を設けていません。私はソーシャルな反応やアクセス数を追い求めるためではなく、自分の考えを誠実に探求するために文章を書いています。記事を丁寧にお読みいただいたうえで、ご感想やご意見をお寄せいただければ幸いです。誤字・誤り・技術的な問題などを見つけた場合、またはフィードバックを共有したい場合は、Aboutページに記載しているメールアドレスまでお気軽にご連絡ください。