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

postmarketOS移植、Sony Xperia 5 IIを例に

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

この記事は、僕が自分でpostmarketOSを移植した過程を記録したものです。「現在は未完成状態」です。

移植手順については、postmarketOS WikiのPorting to a new deviceMainlining Guideがかなり明確に書いています。この記事は、そのWikiの内容を中国語に翻訳し、そこへ僕の注釈を少し足したものです。

1. ハードウェア要件
#

  • 移植対象のスマホ:Sony Xperia 5 II (XQ-AS72、コードネームsony-pdx206)、Bootloader解除済み。

この機種はpostmarketOS Wikiに登録情報があり、somainlineが開発したmainline kernelで起動することもできます。ただしUFSにbugがあるため(後述)、まだ正式な移植はありません。

  • PC:64ビットLinuxである必要があります。仮想マシンでも構いません。僕のCPUはi5-7400、RAMは16GBです。

postmarketOSのシステムファイルはとても小さいので、何十GBものソースコードをダウンロードする必要はなく、コンパイルにも何時間もかかりません。

2. pmbootstrapをインストールする
#

pmbootstrapというツールは、postmarketOSのインストールファイル作成や移植作業に使えます。

  1. システムにPython3、openSSL、Pip、Gitをインストールします:
sudo apt install python3 openssl python-pip3 git
  1. pipでpmbootstrapをインストールし、再読み込みします:
pip3 install --user pmbootstrap
source ~/.profile
  1. 自動補完をインストールし、~/.bashrcへ追加します:
 pip3 install --user argcomplete
 echo 'eval "$(register-python-argcomplete3 pmbootstrap)"' >> ~/.bashrc
source ~/.bashrc
  1. インストール後にpmbootstrapを入力してもコマンドが見つからないと表示される場合は、再起動します。

3. 機種設定を初期化する
#

pmbootstrapを初期化し、質問に沿って機種の設定値を入力します。以下の質問に対応する設定ファイルは~/.config/pmbootstrap.cfgにあります。

~ $ pmbootstrap init
# 作業ディレクトリ
Work path [/home/ivon/.local/var/pmbootstrap]: Enter
# 更新チャンネルは安定版またはedgeを入力します。edgeはAlpine上流の更新で依存関係が壊れることがあります
Channel [edge]:  v22.06
# メーカーを選択
Vendor [qemu]: sony
# Sony公式の機種コードネームを入力
Device codename: pdx206
# 新機種移植を確認
You are about to do a new device port for 'sony-pdx206'.
Continue? (y/n) [y]: y
# プロセッサのアーキテクチャを入力
Device architecture (armv7/aarch64/x86_64/x86) [armv7]: aarch64
# 製造元を入力
Who produced the device (e.g. LG)? sony
# スマホの正式名称を入力
What is the official name (e.g. Google Nexus 5)? Sony Xperia 5 II
# スマホの発売年
In what year was the device released (e.g. 2012)? 2020
# デバイス種別をハンドヘルドに設定
What type of device is it?  handset
# キーボードなし、nと回答
Does the device have a hardware keyboard? (y/n) [n]: n
# SDカードスロットあり、yと回答
Does the device have a sdcard or other external storage medium? (y/n) [n]: y
# フラッシュ方式はfastbootを選択
Which flash method does the device support?
Flash method (0xffff/fastboot/heimdall/none/rkdeveloptool/uuu) [0xffff]: fastboot
# pmbootstrapにboot.imgの起動パラメータを解析させます。僕はサードパーティROMのboot.imgを使いました
[11:15:10] You can analyze a known working boot.img file to automatically fill out the flasher information for your deviceinfo file. Either specify the path to an image or press return to skip this step (you can do it later with 'pmbootstrap bootimg_analyze').
Path: /home/ivon/下載/Evo/extracted_20220826_113410/boot.img
# デフォルトユーザー名
Username [user]: user
# グラフィカルUIを選択。ハードウェアアクセラレーションが使えるか未確定なうちは、先にXFCE4を選びます
User interface [weston]: xfce4
# デフォルトのbootパーティション設定を維持し、nを入力
Additional options: extra free space: 0 MB, boot partition size: 256 MB, parallel jobs: 9, ccache per arch: 5G, sudo timer: False, mirror: http://mirror.postmarketos.org/postmarketos/
Change them? (y/n) [n]: n
# 追加ソフトウェアパッケージをインストールするか
Additional packages that will be installed to rootfs. Specify them in a comma separated list (e.g.: vim,file) or "none"
Extra packages [none]: none
# システムのタイムゾーンを設定
Your host timezone: Asia/Taipei
Use this timezone instead of GMT? (y/n) [y]: y
# システム言語を設定。先に英語を使うのがおすすめです
Choose default locale for installation: en_US.UTF-8
# デバイス名を設定
Device hostname (short form, e.g. 'foo') [sony-pdx206]: Enter
# ローカルのSSH公開鍵をpostmarketOSシステムへコピーするか
Would you like to copy your SSH public keys to the device? (y/n) [n]: n
# 古くなったソフトウェアパッケージを自動コンパイル
After pmaports are changed, the binary packages may be outdated. If you want to install postmarketOS without changes, reply 'n' for a faster installation.
Build outdated packages during 'pmbootstrap install'? (y/n) [y]: y

4. kernelのコンパイルオプションを設定する
#

pmbootstrapはARMのchroot環境を自動で作成するため、必要なタイミングでパスワードを入力するのを忘れないでください。コンパイル中は別の端末でpmbootstrap logを実行し、エラーメッセージを確認します。

  1. まずスマホのkernel(核心)ソースコードを取得します。postmarketOSはLineageOSのGithubからkernelを探すことを推奨していますが、現在LineageOSにはXperia 5 II用がありません。仕方ないのでXDA上のサードパーティkernelを採用します。たとえば僕が使ったのはXperiaBrickerの版です。なお、Sony公式もkernelを公開しています

  2. 作業ディレクトリへ切り替えます:

cd /home/$USER/.local/var/pmbootstrap/cache_git/pmaports/device/testing/linux-sony-pdx206
  1. 中にはAPKBUILDファイルがあります。これはkernelをコンパイルするための設定ファイルです。#Sourceブロックはkernelのソースリポジトリです。

  2. ここではLineageOS公式のrepoを使わないため、#Sourceブロックを以下のように変更します。最後の行で$_configの下にあるものは、コンパイル時にこれらのpatchを適用するという意味です。

# Source
_repository="android_kernel_sony_sm8250"
_commit="8bdbbde86f74be117281c82f4181d1f938659ce0"
_config="config-$_flavor.$arch"
source="
	$pkgname-$_commit.tar.gz::https://github.com/XperiaBrickers/$_repository/archive/$_commit.tar.gz
	$_config
	gcc10-extern_YYLOC_global_declaration.patch
    gcc7-give-up-on-ilog2-const-optimizations.patch
    gcc8-fix-put-user.patch
    kernel-use-the-gnu89-standard-explicitly.patch
"
  1. kernelソースコードのリポジトリでMakefileファイルを探し、その中に書かれているVERSIONPATCHLEVELSUBLEVELに従って、APKBUILDのpkgverへバージョン番号を入力します。たとえばここでは4.19.195です。その後ファイルを保存します。
pkgver=4.19.195
  1. kerenelソースコードのリポジトリからdefconfigを探します。これはkernel設定ファイルを生成するためのファイルです。たとえばこのkernelが使うconfig設定ファイルはarch/arm64/configsにあるので、それを作業ディレクトリへダウンロードし、config-機種名-コードネーム-ビット数へリネームします:
wget https://raw.githubusercontent.com/XperiaBrickers/android_kernel_sony_sm8250/base/arch/arm64/configs/pdx206_defconfig
mv pdx206_defconfig  config-sony-pdx206.aarch64
  1. kernelソースコードをダウンロードし、チェックサムを生成します。APKBUILDファイルを変更した場合は必ずこのコマンドを実行します。
pmbootstrap checksum linux-sony-pdx206
  1. コンパイル開始前に、kernelの設定ファイル(config)を編集します。kernel編集画面で左右キーを使ってExitへ移動し、Enterを押してkernel設定ファイルを保存します。
pmbootstrap kconfig edit
  1. 新しく移植する機種ではデフォルトで4つのpatchが追加されます。kconfigがcannot apply patchと表示した場合は、APKBUILDの$configからpatchファイル名を削除します。“Please don’t include linux directly"が出た場合は、APKBUILDの先頭にREPLACE_GCCH=0を追加します。

  2. もう一度チェックサムを生成し、kernel設定ファイルを編集します

pmbootstrap checksum linux-sony-pdx206
pmbootstrap kconfig edit
  1. kernel編集画面で左右キーを使ってExitへ移動し、Enterを押してkernel設定ファイルを保存します。

  2. 次にpmbootstrapがkernelに不足している設定を確認し、その後黄色のWARNINGを表示します:

[12:15:36] (native) generate checksums for linux-sony-pdx206
[12:15:37] WARNING: linux-sony-pdx206/config-sony-pdx206.aarch64: CONFIG_ANDROID_PARANOID_NETWORK should *not* be set. See <https://wiki.postmarketos.org/wiki/kconfig#CONFIG_ANDROID_PARANOID_NETWORK> for details.
[12:15:37] WARNING: linux-sony-pdx206/config-sony-pdx206.aarch64: CONFIG_DEVTMPFS should be set. See <https://wiki.postmarketos.org/wiki/kconfig#CONFIG_DEVTMPFS> for details.
[12:15:37] WARNING: linux-sony-pdx206/config-sony-pdx206.aarch64: CONFIG_SYSVIPC should be set. See <https://wiki.postmarketos.org/wiki/kconfig#CONFIG_SYSVIPC> for details.
[12:15:37] WARNING: linux-sony-pdx206/config-sony-pdx206.aarch64: CONFIG_VT should be set. See <https://wiki.postmarketos.org/wiki/kconfig#CONFIG_VT> for details.
[12:15:37] WARNING: linux-sony-pdx206/config-sony-pdx206.aarch64: CONFIG_USER_NS should be set. See <https://wiki.postmarketos.org/wiki/kconfig#CONFIG_USER_NS> for details.
  1. これらのWARNINGをコピーします。次にWARNING後ろのURLを開いてWikiでどの設定をオン・オフすべきか確認します。その後kernel編集画面を開き、それらを有効または無効にします(スペースキーで選択または選択解除):
pmbootstrap kconfig edit
  1. 調整後、Exitで保存します。kernel設定ファイルがpostmarketOSの要件を満たしているか確認します。成功するとkconfig check succeeded!が返ります。
pmbootstrap kconfig check

5. kernelをコンパイルする
#

次にkernelのコンパイルを開始します。これはおそらく一番長いステップです。コンパイル中は別の端末でpmbootstrap logを実行してエラーメッセージを確認してください。

pmbootstrapはAPKBUILDに書かれた手順に従ってkernelをコンパイルします。まず#SourcesのURLに従ってkernelソースコードをダウンロードし、次にconfig-sony-pdx206.aarch64をkernelのconfigとして適用します。その後build()ブロックのコマンドに従ってmakeを開始するため、ここにmake -j8を追加してコンパイル速度を上げることもできます。

5.1. kernelのコンパイルを開始する
#

  1. 以下のコマンドを実行してコンパイルを開始します
pmbootstrap build linux-sony-pdx206
# kernelのソースコードを自分で変更したい場合は、build時にsrcパラメータを追加し、自分で展開したファイルからコンパイルします:
pmbootstrap build linux-sony-pdx206 --src=/home/ivon/下載/android_kernel_sony_sm8250/
  1. 順調なら30分ほどでコンパイルが完了するはずです:
>>> linux-sony-pdx206*: Tracing dependencies...
>>> linux-sony-pdx206*: Package size: 55.0 MB
>>> linux-sony-pdx206*: Compressing data...
>>> linux-sony-pdx206*: Create checksum...
>>> linux-sony-pdx206*: Create linux-sony-pdx206-4.19.195_p20220910214444-r0.apk
>>> linux-sony-pdx206: Build complete at Sat, 10 Sep 2022 14:03:42 +0000 elapsed time 0h 18m 58s
>>> linux-sony-pdx206: Updating the pmos/aarch64 repository index...
>>> linux-sony-pdx206: Signing the index...

しかし、たいてい物事はそんなに簡単ではありません。コンパイル中にerrorに遭遇すると停止します。この時はpmbootstrap logまたは~/.local/var/pmbootstrap/log.txtファイルのエラーメッセージを見て、デバッグを始めます。

5.2. デバッグ
#

コンパイル時に出るwarningは先に無視して構いません。まず解決すべきなのはerrorです。

試せる選択肢:

  1. grepコマンドで他のpostmarketOS機種から似たエラーメッセージを探し、そのpatchファイルをこのスマホのAPKBUILDへ追加します。pmbootstrap checksum linux-sony-pdx206を実行した後、再度buildします。
grep -r 'perf_trace_counters\.c'  ~/.local/var/pmbootstrap/cache_git/pmaports/device/testing/
  1. コンパイラを変更します。pmbootstrapはデフォルトで最新版GCCを使います。一部のAndroid kernelは旧版GCCでないとコンパイルできないことがあり、あるいはCLANGの使用を検討します。

  2. 問題が少ない別のkernelソースコードへ変更します

  3. postmarketOSのMatrixチャンネルで支援を求めます。

6. 機種パラメータを設定し、機種専用パッケージをコンパイルする
#

このステップでは、その機種専用パッケージ(device specific package)を設定・コンパイルします。

  1. kernelのコンパイルに成功したら、機種パッケージのディレクトリへ切り替えます:
cd /home/$USER/.local/var/pmbootstrap/cache_git/pmaports/device/testing/device-sony-pdx206
  1. この時点で、pmbootstrapにもう一度boot.imgの起動パラメータを解析させ、結果をdeviceinfoへ追加できます。
pmbootstrap bootimg_analyze /home/ivon/下載/Evo/extracted_20220826_113410/boot.img
  1. deviceinfoを編集し、画面解像度を設定します:
deviceinfo_screen_width=1080
deviceinfo_screen_height=2520
  1. postmarketOS Wiki上のsony-pdx206の説明によると、Sonyのソフトウェア実装には問題があり、UFSを有効にするとbootloaderが消去されます。そのためrootfsはスマホへ焼き込みません。

  2. もう一度ファイルに問題がないか確認し、機種専用パッケージをコンパイルします:

pmbootstrap checksum device-sony-pdx206
pmbootstrap build device-sony-pdx206

これでSony Xperia 5 II専用のpostmarketOS kernelと機種パッケージが作成できました。次にインストールファイルを作成します。

7. スマホへ焼き込む
#

  1. postmarketOSインストールファイルを作成します。約10分です。途中でユーザーパスワードの作成を求められます。
pmbootstrap install
  1. UFSが使えないため、インストールファイルはスマホのSDカードへ焼き込むしかありません:
pmbootstrap install --sdcard=/dev/sdX
  1. スマホをfastbootモードに入れ、kernelから起動します。
pmbootstrap flasher boot
# 上述のSonyソフトウェア側の理由により、本当にスマホのbootパーティションへ焼き込みたい場合を除き、このコマンドは使わないでください
pmbootstrap flasher flash_kernel
  1. PC上のpmbootstrapを終了します:
pmbootstrap shutdown

8. 結果
#

画面に何も表示されない場合でも、USBでPCへ接続し、sshでスマホへ接続してシステムに入れるか確認できます。

結果、このSonyはやはり画面が出ませんでした。

デスクトップに入れるなら、Gitlabでmergeを提出し、成果画像をWikiに載せましょう。

次のステップはdownstream kernelをmainline kernelへ変更することです。純正のAndroid kernelは通常downstream kernelで、追加patchとクローズドなfirmwareが大量にあります。kernelをmainline kernelへ置き換えてこそ、postmarketOSの究極目標に合います。

関連記事


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