为什么要考虑扩容 boot 分区

VIVO Y927 的 boot 分区只有 16 MiB:

1
partition-size:boot: 0x1000000

在 postmarketOS 移植时,完整 initramfsboot.img 很容易超过这个大小。

  • 实测踩坑过 postmarketOS 默认生成的 boot.img 约 21 MiB,无法写入 16 MiB 的 boot 分区;
  • 改成 deviceinfo_initfs_compression="lzma" 后仍约 20 MiB;
  • deviceinfo_create_initfs_extra="true" 后可以压到约 10.9 MiB,并能写入 boot 分区;
  • initramfs-extra 会把一部分启动内容放进 rootfs 的 /boot/initramfs-extra,刷完 kernel 后也必须同步重刷 rootfs。

所以扩容 boot 分区的意义是:允许直接使用完整 initramfs 的 boot.img,减少 initramfs-extra 带来的变量。

创建目标GPT分区表

原分区布局

原厂分区表布局

分区 mmcblk0 大小 用途
modem p1 64 MB 基带固件 ⚠️
sbl1/bak p2/p3 512 KB Secondary Bootloader
aboot/bak p4/p5 5 MB Bootloader
rpm/bak p6/p7 512 KB Resource Power Manager
tz/bak p8/p9 512 KB TrustZone
hyp/bak p10/p11 512 KB Hypervisor
pad p12 1 MB 填充
modemst1/2 p13/p14 1.5 MB Modem 存储 ⚠️
misc p15 1 MB 杂项
fsc/ssd p16/p17 <1 MB Secure
splash p18 10 MB 开机画面
DDR p19 32 KB DDR
fsg p20 1.5 MB Golden backup (IMEI) ⚠️
sec p21 16 KB 安全
boot p22 16 MB 内核启动
system p23 ~1.8 GB 系统
persist p24 32 MB WiFi/BT 校准
cache p25 300 MB 缓存
recovery p26 16 MB 恢复模式
userdata p27 ~3 GB 用户数据
apanic p28 10 MB Panic 日志
backup/reserved p29/p30 10 MB 备份/保留
udisk p31 ~9.2 GB 内部存储
SD卡 mmcblk1 - 外部 SD
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
p01 modem    sectors 131072-262143   size 0x4000000    64 MiB
p02 sbl1 sectors 262144-263167 size 0x80000 512 KiB
p03 sbl1bak sectors 263168-264191 size 0x80000 512 KiB
p04 aboot sectors 264192-274431 size 0x500000 5 MiB
p05 abootbak sectors 274432-284671 size 0x500000 5 MiB
p06 rpm sectors 284672-285695 size 0x80000 512 KiB
p07 rpmbak sectors 285696-286719 size 0x80000 512 KiB
p08 tz sectors 286720-287743 size 0x80000 512 KiB
p09 tzbak sectors 287744-288767 size 0x80000 512 KiB
p10 hyp sectors 288768-289791 size 0x80000 512 KiB
p11 hypbak sectors 289792-290815 size 0x80000 512 KiB
p12 pad sectors 290816-292863 size 0x100000 1 MiB
p13 modemst1 sectors 292864-295935 size 0x180000 ~1.5 MiB
p14 modemst2 sectors 295936-299007 size 0x180000 ~1.5 MiB
p15 misc sectors 299008-301055 size 0x100000 1 MiB
p16 fsc sectors 301056-301057 size 0x400 1024 bytes
p17 ssd sectors 301058-301073 size 0x2000 8 KiB
p18 splash sectors 301074-321553 size 0xa00000 10 MiB
p19 DDR sectors 393216-393279 size 0x8000 32 KiB
p20 fsg sectors 393280-396351 size 0x180000 ~1.5 MiB
p21 sec sectors 396352-396383 size 0x4000 16 KiB
p22 boot sectors 396384-429151 size 0x1000000 16 MiB
p23 system sectors 429152-4204023 size 0x73333000 ~1.8 GiB
p24 persist sectors 4204024-4269559 size 0x2000000 32 MiB
p25 cache sectors 4269560-4883959 size 0x12c00000 300 MiB
p26 recovery sectors 4883960-4916727 size 0x1000000 16 MiB
p27 userdata sectors 4916728-11208183 size 0xc0000000 3 GiB
p28 apanic sectors 11272192-11292671 size 0xa00000 10 MiB
p29 backup sectors 11292672-11313151 size 0xa00000 10 MiB
p30 reserved sectors 11313152-11333631 size 0xa00000 10 MiB
p31 udisk sectors 11333632-11333631 size 0x0 0 bytes

调整目标分区布局

这次不再保留 Android 的 system/cache/userdata/recovery/... 等分区的可用性,而是把设备按 Linux 专用机处理:

1
2
3
4
5
6
7
8
9
10
11
...
p22 boot sectors 396384-527455 size 0x04000000 64 MiB
p23 system sectors 527456-11333617 size 0x149c72400 ~5.2 GiB
p24 persist sectors 11333618-11333619 size 0x400 1024 bytes
p25 cache sectors 11333620-11333621 size 0x400 1024 bytes
p26 recovery sectors 11333622-11333623 size 0x400 1024 bytes
p27 userdata sectors 11333624-11333625 size 0x400 1024 bytes
p28 apanic sectors 11333626-11333627 size 0x400 1024 bytes
p29 backup sectors 11333628-11333629 size 0x400 1024 bytes
p30 reserved sectors 11333630-11333631 size 0x400 1024 bytes
p31 udisk sectors 11333632-30535646 size 0x249ffbe00 ~9.2 GiB

后续规划:

  • boot:继续放 Android boot image,即 Linux kernel + DTB + initramfs;
  • system:放 postmarketOS / 根文件系统;
  • udisk:格式化为 ext4,挂载到 /home
  • persist/cache/recovery/userdata/apanic/backup/reserved:只保留分区名占位,不再作为 Android 分区使用。

创建GPT分区表

原厂线刷包里已经有 GPT 文件:

1
2
cd ~/y927/Y927\(PD1410V)升级软件_an
ls -lh gpt_main0.bin gpt_backup0.bin gpt_both0.bin

先把原厂主 GPT 放进一个完整大小的 sparse 镜像,让 sgdisk 读取原厂分区表字段。这里的镜像只用于提取信息,sgdisk 提示 backup GPT 不完整可以先忽略。

提取内容包括每个分区的起始扇区、大小、type GUID、partition UUID、分区名和 attribute bits:

1
2
3
4
5
6
7
8
9
10
11
12
mkdir -p ~/y927/gpt-linuxroot-system-home-udisk
cd ~/y927/gpt-linuxroot-system-home-udisk

SRC="$HOME/y927/Y927(PD1410V)升级软件_an"
DISK_SECTORS=30535680

truncate -s $((DISK_SECTORS * 512)) y927-original-gpt.img
dd if="$SRC/gpt_main0.bin" \
of=y927-original-gpt.img \
bs=512 seek=0 conv=notrunc

sgdisk -p y927-original-gpt.img
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
zzq@zzq-virtual-machine:~/y927/gpt-linuxroot-system-home-udisk$ sgdisk -p y927-original-gpt.img
Caution: invalid backup GPT header, but valid main header; regenerating
backup header from main header.

Warning! Main and backup partition tables differ! Use the 'c' and 'e' options
on the recovery & transformation menu to examine the two tables.

Warning! One or more CRCs don't match. You should repair the disk!
Main header: OK
Backup header: ERROR
Main partition table: OK
Backup partition table: ERROR

****************************************************************************
Caution: Found protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************

Warning! Secondary partition table overlaps the last partition by
11333631 blocks!
Try reducing the partition table size by 45334524 entries.
(Use the 's' item on the experts' menu.)
Disk y927-original-gpt.img: 30535680 sectors, 14.6 GiB
Sector size (logical): 512 bytes
Disk identifier (GUID): 98101B32-BBE2-4BF2-A06E-2BB33D000C20
Partition table holds up to 32 entries
Main partition table begins at sector 2 and ends at sector 9
First usable sector is 34, last usable sector is 0
Partitions will be aligned on 2-sector boundaries
Total free space is 0 sectors (0 bytes)

Number Start (sector) End (sector) Size Code Name
1 131072 262143 64.0 MiB 0700 modem
2 262144 263167 512.0 KiB A012 sbl1
3 263168 264191 512.0 KiB 0700 sbl1bak
4 264192 274431 5.0 MiB A015 aboot
5 274432 284671 5.0 MiB 0700 abootbak
6 284672 285695 512.0 KiB A018 rpm
7 285696 286719 512.0 KiB 0700 rpmbak
8 286720 287743 512.0 KiB A016 tz
9 287744 288767 512.0 KiB 0700 tzbak
10 288768 289791 512.0 KiB A017 hyp
11 289792 290815 512.0 KiB 0700 hypbak
12 290816 292863 1024.0 KiB 0700 pad
13 292864 295935 1.5 MiB A027 modemst1
14 295936 299007 1.5 MiB A028 modemst2
15 299008 301055 1024.0 KiB A036 misc
16 301056 301057 1024 bytes A029 fsc
17 301058 301073 8.0 KiB A02C ssd
18 301074 321553 10.0 MiB A036 splash
19 393216 393279 32.0 KiB A01A DDR
20 393280 396351 1.5 MiB A02A fsg
21 396352 396383 16.0 KiB A01D sec
22 396384 429151 16.0 MiB A036 boot
23 429152 4204023 1.8 GiB 0700 system
24 4204024 4269559 32.0 MiB 0700 persist
25 4269560 4883959 300.0 MiB 0700 cache
26 4883960 4916727 16.0 MiB A036 recovery
27 4916728 11208183 3.0 GiB 0700 userdata
28 11272192 11292671 10.0 MiB A01C apanic
29 11292672 11313151 10.0 MiB FFFF backup
30 11313152 11333631 10.0 MiB FFFF reserved
31 11333632 11333631 0 bytes FFFF udisk

然后用 Python 调用 sgdisk -i 提取每个分区的字段,并生成 sfdisk 描述文件。Python 不直接修改二进制 GPT,只负责把字段转成文本;真正修改分区布局的是 TARGET_LAYOUT:p1-p21 沿用原厂字段,p22-p31 改成目标布局。

将以下代码保存为 ~/y927/gpt-linuxroot-system-home-udisk/build-y927-sfdisk.py

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
from pathlib import Path
import re
import subprocess

def calc_last_usable_lba():
DISK_SECTORS = 30535680 # 磁盘总扇区数量
BACKUP_GPT_HEADER_LBA = DISK_SECTORS - 1 # GPT 分区结构的最后 1 个扇区给 backup GPT header;
BACKUP_PARTITION_ENTRIES_START_LBA = BACKUP_GPT_HEADER_LBA - 32 # backup GPT header 的前面 32 个扇区给 backup partition entries;
BACKUP_PARTITION_ENTRIES_END_LBA = BACKUP_GPT_HEADER_LBA - 1 # BACKUP_PARTITION_ENTRIES 的尾部
LAST_USABLE_LBA = BACKUP_PARTITION_ENTRIES_START_LBA - 1 # 最后一个普通分区可用的扇区位置
assert LAST_USABLE_LBA == 30535646
return LAST_USABLE_LBA

LAST_USABLE_LBA = calc_last_usable_lba()

def calc_layout():
# 计算boot
boot_start_lba, boot_sectors = 396384, (64*1024*1024) // 512

# 计算udisk
udisk_start_lba, udisk_end_lba = 11333632, LAST_USABLE_LBA
udisk_sectors = udisk_end_lba - udisk_start_lba + 1
assert udisk_sectors == 19202015

# 计算persist
persist_start = udisk_start_lba - 2 * 7

# 计算system
system_start_lba = boot_start_lba + boot_sectors
system_sectors = persist_start - system_start_lba
assert system_sectors == 10806162

return {
22: (boot_start_lba, boot_sectors),
23: (system_start_lba, system_sectors),
24: (persist_start + 2 * 0, 2),
25: (persist_start + 2 * 1, 2),
26: (persist_start + 2 * 2, 2),
27: (persist_start + 2 * 3, 2),
28: (persist_start + 2 * 4, 2),
29: (persist_start + 2 * 5, 2),
30: (persist_start + 2 * 6, 2),
31: (udisk_start_lba, udisk_sectors),
}

TARGET_LAYOUT = calc_layout()

# 读取指定分区编号的信息
def read_partition(index):
def pick(pattern, text):
match = re.search(pattern, text, re.MULTILINE)
if not match:
raise SystemExit(f"missing field: {pattern}")
return match.group(1)

IMAGE = Path("y927-original-gpt.img")
text = subprocess.check_output(
["sgdisk", "-i", str(index), str(IMAGE)],
stderr=subprocess.DEVNULL,
text=True,
)
first = int(pick(r"^First sector: (\d+)", text))
last = int(pick(r"^Last sector: (\d+)", text))
return {
"start": first,
"size": last - first + 1,
"type": pick(r"^Partition GUID code: ([0-9A-F-]+)", text),
"uuid": pick(r"^Partition unique GUID: ([0-9A-F-]+)", text),
"attrs": pick(r"^Attribute flags: ([0-9A-Fa-f]+)", text),
"name": pick(r"^Partition name: '([^']*)'", text),
}

lines = [
"label: gpt",
"label-id: 98101B32-BBE2-4BF2-A06E-2BB33D000C20",
"unit: sectors",
"first-lba: 34",
f"last-lba: {LAST_USABLE_LBA}",
"table-length: 32",
"sector-size: 512",
"",
]

for index in range(1, 32):
part = read_partition(index)
if index in TARGET_LAYOUT:
part["start"], part["size"] = TARGET_LAYOUT[index]

attrs = ', attrs="GUID:60"' if part["attrs"] == "1000000000000000" else ""
lines.append(
f"start={part['start']}, size={part['size']}, "
f"type={part['type']}, uuid={part['uuid']}, "
f"name=\"{part['name']}\"{attrs}"
)

Path("y927-linuxroot-system-home-udisk.sfdisk").write_text("\n".join(lines) + "\n")

最后用 sfdisk 应用这个描述文件,生成可验证的完整 GPT 镜像,再从镜像里导出主 GPT 和备份 GPT:

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
cd ~/y927/gpt-linuxroot-system-home-udisk

# 创建一个目标磁盘那么大的镜像
truncate -s $((30535680 * 512)) y927-linuxroot-full-sparse.img

# 将修改后的GPT分区表写入进去
sfdisk --wipe never --wipe-partitions never \
y927-linuxroot-full-sparse.img \
< y927-linuxroot-system-home-udisk.sfdisk

# 校验GPT分区表
sgdisk -v y927-linuxroot-full-sparse.img

# 打印GPT分区表
sgdisk -p y927-linuxroot-full-sparse.img

dd if=y927-linuxroot-full-sparse.img \
of=gpt_main0-linuxroot-system-home-udisk.bin \
bs=512 skip=0 count=34

dd if=y927-linuxroot-full-sparse.img \
of=gpt_backup0-linuxroot-system-home-udisk.bin \
bs=512 skip=$((30535680 - 33)) count=33

cat gpt_main0-linuxroot-system-home-udisk.bin \
gpt_backup0-linuxroot-system-home-udisk.bin \
> gpt_both0-linuxroot-system-home-udisk.bin

构建基础操作环境

内核配置及编译

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
cd ~/y927/linux
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- msm8916_defconfig

# USB串口
./scripts/config --enable CONFIG_USB_G_SERIAL
./scripts/config --enable CONFIG_U_SERIAL_CONSOLE

# 屏幕面板
./scripts/config --enable CONFIG_DRM_MSM
./scripts/config --enable CONFIG_DRM_PANEL_VIVO_Y927_HX8394A
./scripts/config --enable CONFIG_BACKLIGHT_GPIO
./scripts/config --enable CONFIG_REGULATOR_FIXED_VOLTAGE
./scripts/config --enable BACKLIGHT_CLASS_DEVICE
./scripts/config --enable CONFIG_DRM_PANEL_MSM8916_GENERATED

# 触摸屏
./scripts/config --enable CONFIG_TOUCHSCREEN_GOODIX

# GPU
./scripts/config --enable CONFIG_DRM_MSM_GPU_STATE

# WiFi和蓝牙
./scripts/config --enable CONFIG_QCOM_WCNSS_PIL
./scripts/config --enable CONFIG_QCOM_WCNSS_CTRL
./scripts/config --enable CONFIG_WCN36XX
./scripts/config --enable BT
./scripts/config --enable BT_QCOMSMD

# 电池和充电
./scripts/config --enable CONFIG_BATTERY_PM8916_BMS_VM
./scripts/config --enable CONFIG_CHARGER_PM8916_LBC

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image.gz dtbs

initramfs 构建

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
BUSYBOX_BINARY=~/y927/busybox-1.38.0/busybox
EVTEST_BINARY=~/y927/evtest/src/evtest
PHASE_ID=9
cd ~/y927/initramfs
rm -rf phase-$PHASE_ID
mkdir -p phase-$PHASE_ID && cd phase-$PHASE_ID
INITRAMFS=~/y927/initramfs/phase-$PHASE_ID
FIRMWARE_GPU=~/y927/firmware-gpu
WCNSS_EXTRACTED=~/y927/wcnss-extracted

# 创建 initramfs 目录结构
mkdir -p bin dev proc sys \
lib/modules \
lib/firmware/qcom \
lib/firmware/wlan/prima

# 复制 BusyBox 到 initramfs
cp $BUSYBOX_BINARY bin/
cp $EVTEST_BINARY bin/

# GPU 微码固件
cp $FIRMWARE_GPU/a300_pm4.fw $INITRAMFS/lib/firmware/qcom/
cp $FIRMWARE_GPU/a300_pfp.fw $INITRAMFS/lib/firmware/qcom/

# WiFi/蓝牙 固件
cp $WCNSS_EXTRACTED/wcnss.* $INITRAMFS/lib/firmware/
cp $WCNSS_EXTRACTED/WCNSS_qcom_cfg.ini $INITRAMFS/lib/firmware/wlan/prima/
cp $WCNSS_EXTRACTED/WCNSS_qcom_wlan_nv.bin $INITRAMFS/lib/firmware/wlan/prima/

# 复制已经在 VM 生成并验证过的 GPT 镜像
mkdir -p gpt
cp ~/y927/gpt-linuxroot-system-home-udisk/gpt_main0-linuxroot-system-home-udisk.bin gpt/
cp ~/y927/gpt-linuxroot-system-home-udisk/gpt_backup0-linuxroot-system-home-udisk.bin gpt/

# 创建 GPT 写入脚本。注意:这里只写 GPT,不格式化任何分区。
cat > bin/apply-y927-gpt-linuxroot << 'EOF'
#!/bin/sh
set -eu

DISK=/dev/mmcblk0
DISK_SECTORS=30535680
BACKUP_LBA=$((DISK_SECTORS - 33))
BACKUP_DIR=/tmp/y927-gpt-backup

MAIN_GPT=/gpt/gpt_main0-linuxroot-system-home-udisk.bin
BACKUP_GPT=/gpt/gpt_backup0-linuxroot-system-home-udisk.bin

if [ ! -b "$DISK" ]; then
echo "missing disk: $DISK"
exit 1
fi

mkdir -p "$BACKUP_DIR"

echo "[1/4] backup current GPT"
dd if="$DISK" of="$BACKUP_DIR/gpt-current-primary.bin" bs=512 count=34
dd if="$DISK" of="$BACKUP_DIR/gpt-current-backup.bin" bs=512 skip="$BACKUP_LBA" count=33

echo "[2/4] write primary GPT"
dd if="$MAIN_GPT" of="$DISK" bs=512 seek=0 conv=fsync

echo "[3/4] write backup GPT"
dd if="$BACKUP_GPT" of="$DISK" bs=512 seek="$BACKUP_LBA" conv=fsync

echo "[4/4] sync"
sync

echo "GPT written. Reboot to bootloader and verify with: fastboot getvar all"
EOF
chmod +x bin/apply-y927-gpt-linuxroot

# 创建基础命令的软链接
cd bin
for cmd in sh mount exec mkdir echo; do
ln -sf busybox $cmd
done
cd ..

# 创建 /init 脚本
cat > init << 'EOF'
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sys /sys
mount -t devtmpfs dev /dev

mkdir -p /bin /sbin /usr/bin /usr/sbin
busybox --install -s

echo "Y927 GPT rescue initramfs"
echo "Run apply-y927-gpt-linuxroot to write the Linux-only GPT layout."

exec sh </dev/ttyGS0 >/dev/ttyGS0 2>&1
EOF
chmod +x init

# 打包
find . | cpio -o -H newc | gzip > ../initramfs-phase-$PHASE_ID.cpio.gz

boot.img 构建

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

cd ~/y927/linux
PHASE_ID=9
INITRAMFS_PHASE_ID=9

# 拼接内核 + DTB
cat arch/arm64/boot/Image.gz \
arch/arm64/boot/dts/qcom/msm8916-vivo-y927.dtb \
> vmlinuz-dtb

~/y927/lk2nd/lk2nd/scripts/mkbootimg \
--kernel vmlinuz-dtb \
--ramdisk $HOME/y927/initramfs/initramfs-phase-$INITRAMFS_PHASE_ID.cpio.gz \
--cmdline "console=tty0 console=ttyMSM0,115200 panic=1 initcall_blacklist=simpledrm_platform_driver_init" \
--base 0x80000000 \
--kernel_offset 0x00008000 \
--ramdisk_offset 0x01000000 \
--second_offset 0x00f00000 \
--tags_offset 0x00000100 \
--pagesize 2048 \
--header_version 0 \
--output boot-phase-$PHASE_ID.img

刷入 boot.img 文件

1
2
3
PHASE_ID=9
fastboot flash boot boot-phase-$PHASE_ID.img
fastboot reboot

进入操作环境

1
sudo picocom -b 115200 /dev/ttyACM0

开始写入新的GPT分区表

在 BusyBox shell 里先确认 eMMC 设备存在:

1
2
cat /proc/partitions
ls -l /dev/mmcblk0

确认无误后写入新的 GPT:

1
2
3
apply-y927-gpt-linuxroot
sync
reboot -f

扩容后验证 fastboot 分区大小

重启回 lk1st/lk2nd fastboot 后,确认分区大小:

1
fastboot getvar all 2>&1 | grep -E 'partition-size:(boot|system|persist|cache|recovery|userdata|apanic|backup|reserved|udisk)'

实测输出结果:

1
2
3
4
5
6
7
8
9
10
(bootloader) partition-size:udisk:       0x249ffbe00
(bootloader) partition-size:reserved: 0x400
(bootloader) partition-size:backup: 0x400
(bootloader) partition-size:apanic: 0x400
(bootloader) partition-size:userdata: 0x400
(bootloader) partition-size:recovery: 0x400
(bootloader) partition-size:cache: 0x400
(bootloader) partition-size:persist: 0x400
(bootloader) partition-size:system: 0x149c72400
(bootloader) partition-size:boot: 0x4000000