安装 pmbootstrap 工具

1
2
3
4
5
6
7
cd ~/y927
git clone https://gitlab.postmarketos.org/postmarketOS/pmbootstrap.git --depth 1
cd pmbootstrap
uv tool install .

# 验证
pmbootstrap --version

克隆 pmaports

1
2
cd ~/y927
git clone https://gitlab.postmarketos.org/postmarketOS/pmaports.git --depth 1

生成 pmbootstrap 配置文件

1
2
3
4
5
mkdir -p ~/y927/pmbootstrap-workdir && cd ~/y927/pmbootstrap-workdir
pmbootstrap -w ~/y927/pmbootstrap-workdir \
-p ~/y927/pmaports \
--details-to-stdout \
init
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
路径:默认回车确认
Release channel:edge
Vendor:vivo
Device Name: y927
Type: mainline
arch: aarch64
manufacturer: vivo
name: vivo Y927
year: 2015
chassis: handset
flash method: fastboot
boot.img:/home/zzq/y927/linux/boot-phase-8.img
user: user
audio: pulseaudio (default)
wifi: wpa_supplicant (default)
usb mode: developer (default)
UI:buffyboard
systemd: default
附加包:vim,curl,htop,ethtool,tcpdump,usbutils
时区:Asia/Shanghai
locale: en_US
hostname: vivo-y927
编译旧包:y
清空旧 chroot:y
1
2
3
4
5
pmbootstrap -c ~/.config/pmbootstrap_v3.cfg config kernel linux-postmarketos-y927
pmbootstrap -c ~/.config/pmbootstrap_v3.cfg config build_default_device_arch true
pmbootstrap -c ~/.config/pmbootstrap_v3.cfg config systemd never
pmbootstrap -c ~/.config/pmbootstrap_v3.cfg config locale en_US
cat ~/.config/pmbootstrap_v3.cfg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[pmbootstrap]
aports = /home/zzq/y927/pmaports
build_default_device_arch = True
device = vivo-y927
extra_packages = vim,curl,htop,ethtool,tcpdump,usbutils
is_default_channel = False
kernel = linux-postmarketos-y927
locale = en_US
systemd = never
timezone = Asia/Shanghai
ui = buffyboard
work = /home/zzq/y927/pmbootstrap-workdir

[providers]

[mirrors]

补充 deviceinfo 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
DEVINFO=~/y927/pmaports/device/testing/device-vivo-y927/deviceinfo

# 替换空 dtb 字段
sed -i 's|^deviceinfo_dtb=""$|deviceinfo_dtb="qcom/msm8916-vivo-y927"|' "$DEVINFO"

# 追加 drm 字段(解锁 13 个隐藏 UI 备用)
cat >> "$DEVINFO" << 'EOF'
deviceinfo_drm="true"
deviceinfo_screen_width="720"
deviceinfo_screen_height="1280"
EOF

cat "$DEVINFO"

修改APKBUILD文件

1
2
3
sed -i 's|linux-CHANGEME|linux-postmarketos-y927|' \
~/y927/pmaports/device/testing/device-vivo-y927/APKBUILD
cat ~/y927/pmaports/device/testing/device-vivo-y927/APKBUILD

填sha512sums

1
2
3
4
5
6
pmbootstrap -c ~/.config/pmbootstrap_v3.cfg \
-p ~/y927/pmaports \
checksum device-vivo-y927

# 验证已经填完
cat ~/y927/pmaports/device/testing/device-vivo-y927/APKBUILD

建立 modules-initfs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MODULES=~/y927/pmaports/device/testing/device-vivo-y927/modules-initfs

if [ ! -f "$MODULES" ]; then
cat > "$MODULES" << 'EOF'
# USB NCM/ethernet gadget (NCM SSH 联网用)
kernel/net/cdc_ncm.ko
kernel/drivers/usb/gadget/function/usb_f_ncm.ko
kernel/drivers/usb/gadget/function/usb_f_ecm.ko
kernel/drivers/usb/gadget/function/usb_f_rndis.ko
kernel/drivers/usb/gadget/libcomposite.ko
kernel/drivers/usb/gadget/g_ether.ko

# DWC3 / role switch
kernel/drivers/usb/host/xhci-plat-hcd.ko
EOF
fi

建立 linux-postmarketos-y927/APKBUILD 文件(7.0 移植版)

7.0 内核直接使用 ~/y927/linux 本地仓库(不推 GitHub),通过 git archive 打包出 tarball,APKBUILD 的 prepare() 自动检测并更新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# Reference: https://postmarketos.org/devicepkg
# 7.0 内核 - 直接从 ~/y927/linux 本地仓库 archive(不推 GitHub)

maintainer="zzq <i@zhangzqs.cn>"
_flavor="postmarketos-y927"
pkgname=linux-$_flavor
pkgver=7.0
pkgrel=0
pkgdesc="Mainline 7.0 kernel for vivo Y927 (msm8916-mainline local fork)"
arch="aarch64" # 只 aarch64(7.0 阶段不维护 armv7)
url="https://github.com/msm8916-mainline/linux"
license="GPL-2.0-only"
options="!strip !check !tracedeps
pmb:cross-native
pmb:kconfigcheck-community
pmb:kconfigcheck-uefi
pmb:kconfigcheck-usb
"

makedepends="
bison
findutils
flex
gmp-dev
mpc1-dev
mpfr-dev
openssl-dev
perl
postmarketos-installkernel
python3
zstd
"

# === 本地仓库配置(关键:不需要推 GitHub) ===
_local_repo="$HOME/y927/linux"
_local_branch="y927/7.0"
_local_tarball="linux-7.0-msm8916.tar.gz"

# Source: 只 2 个文件 —— 本地 tarball + config
source="
$_local_tarball
config-$_flavor.aarch64
"

_carch="arm64"
builddir="$srcdir/linux-7.0-msm8916"

prepare() {
# 自动检测本地仓库更新并重新 archive
if [ ! -f "$srcdir/$_local_tarball" ] || \
[ "$_local_repo/.git/HEAD" -nt "$srcdir/$_local_tarball" ]; then
echo "[prepare] Archiving $_local_repo (branch $_local_branch)"
cd "$_local_repo"
git checkout "$_local_branch" >/dev/null 2>&1
git archive --format=tar.gz --prefix=linux-7.0-msm8916/ HEAD \
> "$srcdir/$_local_tarball"
fi

default_prepare
cp "$srcdir/config-$_flavor.aarch64" .config
}

build() {
unset LDFLAGS
make ARCH="$_carch" CC="${CC:-gcc}" \
KBUILD_BUILD_VERSION=$((pkgrel + 1))
}

package() {
mkdir -p "$pkgdir"/boot

_install_targets="modules_install dtbs_install"

if [ -e "$builddir/arch/$_carch/boot/vmlinuz.efi" ]; then
# ZBOOT EFI decompressor for EFI booting
install -Dm644 "$builddir/arch/$_carch/boot/vmlinuz.efi" \
"$pkgdir/boot/linux.efi"

# Old GZIP'd kernel image for boot.img compatibility
install -Dm644 "$builddir/arch/$_carch/boot/vmlinuz" \
"$pkgdir/boot/vmlinuz"
elif [ "$_carch" = "arm64" ]; then
echo "WARNING: CONFIG_ZBOOT not enabled!"
install -Dm644 "$builddir/arch/$_carch/boot/Image.gz" \
"$pkgdir/boot/vmlinuz"
fi

make $_install_targets \
ARCH="$_carch" \
INSTALL_PATH="$pkgdir"/boot \
INSTALL_MOD_PATH="$pkgdir" \
INSTALL_MOD_STRIP=1 \
INSTALL_DTBS_PATH="$pkgdir"/boot/dtbs
rm -f "$pkgdir"/lib/modules/*/build "$pkgdir"/lib/modules/*/source

install -D "$builddir"/include/config/kernel.release \
"$pkgdir"/usr/share/kernel/$_flavor/kernel.release
}

# sha512sums:
# - $_local_tarball 用 SKIP(动态生成,每次 prepare 可能变)
# - config 第一次 build 前手动算 + 替换 <CONFIG_SHA512>
sha512sums="
SKIP $_local_tarball
<CONFIG_SHA512> config-$_flavor.aarch64
"

准备 config 和 tarball(第一次 build 前必做)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 1. 在 ~/y927/linux 上准备 7.0 config
cd ~/y927/linux
git checkout y927/7.0

# 用 7.0 defconfig 起点
make defconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

# 博客第 4-9 章用到的 Kconfig
./scripts/config --enable CONFIG_DRM_PANEL_HX8394A
./scripts/config --enable CONFIG_BACKLIGHT_GPIO
./scripts/config --enable CONFIG_TOUCHSCREEN_GOODIX
./scripts/config --enable CONFIG_BATTERY_PM8916_BMS_VM
./scripts/config --enable CONFIG_CHARGER_PM8916_LBC
./scripts/config --enable CONFIG_WCNSS_CORE
./scripts/config --enable CONFIG_WCN36XX
./scripts/config --enable CONFIG_DRM_MSM
./scripts/config --enable CONFIG_DRM_MSM_GPU_STATE
./scripts/config --enable CONFIG_USB_CDC_NCM
./scripts/config --enable CONFIG_USB_NET_RNDIS_HOST
./scripts/config --enable CONFIG_USB_ETH
./scripts/config --enable CONFIG_SND_SOC_APQ8016_SBC
./scripts/config --enable CONFIG_SND_SOC_LPASS_CPU
./scripts/config --enable CONFIG_SND_SOC_LPASS_PLATFORM
./scripts/config --enable CONFIG_SND_SOC_LPASS_APQ8016
./scripts/config --enable CONFIG_SND_SOC_MSM8916_WCD_DIGITAL
./scripts/config --enable CONFIG_SND_SOC_MSM8916_WCD_ANALOG
./scripts/config --enable CONFIG_SND_SOC_TFA989X
./scripts/config --enable CONFIG_SND_SOC_AK4375
./scripts/config --enable CONFIG_REGULATOR_FIXED_VOLTAGE
./scripts/config --enable CONFIG_INPUT_EVDEV
./scripts/config --enable CONFIG_USB_G_NCM
./scripts/config --enable CONFIG_USB_GADGET

# 生成最小差异 config
make savedefconfig ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-

# 拷贝到 pmaports
cp defconfig ~/y927/pmaports/device/testing/linux-postmarketos-y927/config-postmarketos-y927.aarch64

# 2. 手动 archive 一次(让 pmbootstrap checksum 找到 tarball)
cd ~/y927/linux
git archive --format=tar.gz --prefix=linux-7.0-msm8916/ HEAD \
> ~/y927/pmaports/device/testing/linux-postmarketos-y927/linux-7.0-msm8916.tar.gz

# 3. 算 config 的 sha512(替换 APKBUILD 里的 <CONFIG_SHA512>)
cd ~/y927/pmaports/device/testing/linux-postmarketos-y927
sha512sum config-postmarketos-y927.aarch64
# 把 sha512 值 + 空格 替换 APKBUILD 里的 <CONFIG_SHA512> 占位符

第一次 build

1
2
3
4
cd ~/y927
pmbootstrap -c ~/.config/pmbootstrap_v3.cfg \
-p ~/y927/pmaports \
build linux-postmarketos-y927 --force

后续 build(更简单)

1
2
3
4
5
6
7
8
9
10
# 1. 在 ~/y927/linux 改内核,git commit
cd ~/y927/linux
# 改 DTS/驱动...
git add -A && git commit -m "y927: ..."

# 2. 重新 build —— prepare() 自动检测并 archive,无需手动操作
cd ~/y927
pmbootstrap -c ~/.config/pmbootstrap_v3.cfg \
-p ~/y927/pmaports \
build linux-postmarketos-y927 --force

刷入测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 导出 boot.img
pmbootstrap -c ~/.config/pmbootstrap_v3.cfg \
-p ~/y927/pmaports \
export

# 2. 进 lk1st fastboot
# 3. fastboot flash boot
fastboot flash boot ~/y927/pmbootstrap-workdir/chroot_native/tmp/postmarketOS-boot-vivo-y927.img
fastboot reboot

# 4. 等 NCM 枚举
# 5. SSH 登录
ssh user@172.16.42.1
# 密码 147147