Building your own custom postmarketOS image with custom kernels and settings. Then flash it to the device or build an image.
在安裝postmarketOS的文章中,我提過 pmbootstrap建立映像檔的作法。這個作法實際上是使用pmboostrap,從官方Gitlab儲存庫下載各個機型的設定檔,再使用程式手工建置出來的。
pmbootstrap也提供移植新機型的功能。使用者可以自行新增機型,進行 移植工作。
不過我今天要講的是修改現有機型的設定檔,達到在建置系統時修改配置的目的。比如把額外驅動編譯進Linux核心,新增預設套件的操作,這個是pmbootstrap init
無法幫我們完成的東西,必須修改APKBUILD
檔案。
文末再附上安裝修改後系統的步驟,以及建置postmarketOS映像檔的方法。
1. 尋找機型設定檔位置#
APKBUILD
檔案是告訴pmbootsrrap如何處理Linux核心的一個指令稿。
那要在哪裡找到你要的機型的APKBUILD
呢?
當我們使用pmbootstrap init
指令的時候,pmbootstrap會複製一份Gitlab儲存庫下來。
所有機型設定檔位於此處:
~/.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"
- 每次核心原始碼網址一有變更,通常就得重新產生雜湊值,因此請在終端機執行指令,讓pmbootstrap自動算出雜湊值並回填APKBUILD
pmbootstrap checksum linux-pine64-pinetab2
- 之後就可以對核心原始碼操作了。如果只是要開啟幾個核心選項,那麼進入kconfig就行:
pmbootstrap kconfig edit linux-pine64-pinetab2
kconfig編輯完成後的核心選項會儲存到同一目錄下的
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-kernel
3. 修改裝置的APKBUILD#
- 進入目錄
~/.local/var/pmbootstrap/cache_git/pmaports/device/device-pine64-pinetab2
,有以下內容
├── device-pine64-pinetab2
│ ├── APKBUILD
│ ├── deviceinfo
│ └── uboot-script.cmd
deviceinfo
主要是機型硬體方面的資訊,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 pacakge
pmbootstrap build device-pine64-pinetab2
4. 建立完整系統映像檔#
是時候把改好的系統裝到裝置上了。
建置postmarketOS的步驟,請參考 pmbootstrap建立映像檔。通常有以下建置方法:
- 安裝至SD卡
- 用fastboot刷入
- 用刷機包刷入
後二個方法是給前Android裝置用的。像我的PineTab 2裝置是支援U-boot的開發板,那麼把系統寫入到SD卡或eMMC就行了。
將SD卡插到電腦上,用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