618 的时候换了 Redmi K60 ,有次无聊的时候看了下手机的分区表发现有个 cust 分区有 2G 大。查了下发现 cust 分区是厂商专门用来放推广的 apk 的。
  一开始的时候是把 cust 格掉,格掉之后手机不会自动挂载 cust 分区,但也没有影响到其他功能,开机后可以手动挂载上去。
  不过 2G 说大不大,说小也不小,放不了什么东西,摆在那里又浪费。
  正好刷 DerpFest 要格式化 userdata 分区,所以就想顺便试试看能不能调整下大小。

查看分区表

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
# sgdisk --print /dev/block/sda

Disk /dev/block/sda: 61731840 sectors, 235.5 GiB
Sector size (logical/physical): 4096/4096 bytes
Disk identifier (GUID): E77371AE-5248-4869-98B0-2285DF076732
Partition table holds up to 64 entries
Main partition table begins at sector 2 and ends at sector 3
First usable sector is 6, last usable sector is 61731834
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 6 7 8.0 KiB FFFF switch
2 8 15 32.0 KiB A02C ssd
3 16 23 32.0 KiB FFFF dbg
4 24 31 32.0 KiB FFFF bk01
5 32 63 128.0 KiB FFFF bk02
6 64 127 256.0 KiB FFFF bk03
7 128 255 512.0 KiB FFFF bk04
8 256 383 512.0 KiB A02D keystore
9 384 511 512.0 KiB FFFF frp
10 512 1023 2.0 MiB FFFF countrycode
11 1024 2047 4.0 MiB A01F misc
12 2048 4095 8.0 MiB FFFF bk05
13 4096 6143 8.0 MiB FFFF logfs
14 6144 8191 8.0 MiB FFFF ffu
15 8192 12287 16.0 MiB FFFF oops
16 12288 16383 16.0 MiB A021 devinfo
17 16384 20479 16.0 MiB FFFF metadata
18 20480 24575 16.0 MiB FFFF bk06
19 24576 32767 32.0 MiB FFFF bk07
20 32768 49151 64.0 MiB FFFF bk08
21 49152 65535 64.0 MiB A026 persist
22 65536 81919 64.0 MiB FFFF persistbak
23 81920 90111 32.0 MiB FFFF mtdblk
24 90112 104959 58.0 MiB FFFF crash_history
25 104960 129535 96.0 MiB FFFF minidump
26 129536 206335 300.0 MiB A01C rawdump
27 206336 730623 2.0 GiB FFFF cust
28 730624 2958847 8.5 GiB FFFF super
29 2958848 2958879 128.0 KiB FFFF vbmeta_system_a
30 2958880 2958911 128.0 KiB FFFF vbmeta_system_b
31 2958912 2966015 27.8 MiB FFFF bk010
32 2966016 2967039 4.0 MiB FFFF mem
33 2967040 2972159 20.0 MiB FFFF opconfig
34 2972160 2980351 32.0 MiB FFFF mbnconfig
35 2980352 3013119 128.0 MiB A039 rescue
36 3013120 3115519 400.0 MiB FFFF opcust
37 3115520 61731834 223.6 GiB A03A userdata

  可以看到 cust 分区有 2.0 GiB ,并且在中间,要调整大小的话只能删掉 cust 及之后的分区再重新创建。
  这手机的 recovery 分区在/dev/block/sde,操作 /dev/block/sda 不会对 recovery 造成影响。
  所以接下来重启到 recovery ,我用的是 OrangeFox Recovery 。

备份分区表和分区

  既然要对分区表和分区动手,那肯定就先要做备份啦。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 备份分区表
sgdisk --print /dev/block/sda > /sdcard/backup/sda.txt
dd if=/dev/block/sda of=/sdcard/backup/sdapartitiontable.bak bs=512 count=35
# 接下来是 cust 下面的分区
dd if=/dev/block/by-name/super of=/sdcard/backup/super.img
dd if=/dev/block/by-name/vbmeta_system_a of=/sdcard/backup/vbmeta_system_a.img
dd if=/dev/block/by-name/vbmeta_system_b of=/sdcard/backup/vbmeta_system_b.img
dd if=/dev/block/by-name/bk010 of=/sdcard/backup/bk010.img
dd if=/dev/block/by-name/mem of=/sdcard/backup/mem.img
dd if=/dev/block/by-name/opconfig of=/sdcard/backup/opconfig.img
dd if=/dev/block/by-name/mbnconfig of=/sdcard/backup/mbnconfig.img
dd if=/dev/block/by-name/rescue of=/sdcard/backup/rescue.img
dd if=/dev/block/by-name/opcust of=/sdcard/backup/opcust.img
1
2
# 然后传到电脑
adb pull /sdcard/backup

动手

  备份好之后就可以调整分区了,用 adb 连上手机的 recovery 。

1
2
3
4
5
6
7
8
9
10
11
12
# 删除分区
sgdisk --delete=27 /dev/block/sda
sgdisk --delete=28 /dev/block/sda
sgdisk --delete=29 /dev/block/sda
sgdisk --delete=30 /dev/block/sda
sgdisk --delete=31 /dev/block/sda
sgdisk --delete=32 /dev/block/sda
sgdisk --delete=33 /dev/block/sda
sgdisk --delete=34 /dev/block/sda
sgdisk --delete=35 /dev/block/sda
sgdisk --delete=36 /dev/block/sda
sgdisk --delete=37 /dev/block/sda

  删除之后就可以重建分区了,cust 挂载失败不影响开机,想来直接删掉也是可以的,不过为了保险我还是建了一个 4M 大小的 cust 分区。

1
2
3
4
5
6
7
8
9
10
11
12
# 创建分区(分区大小可以用该分区的 end 减去上一分区的 end 得出。)
sgdisk --new=27:0:+1024 --typecode=27:FFFF --change-name=27:cust /dev/block/sda
sgdisk --new=28:0:+2228224 --typecode=28:FFFF --change-name=28:super /dev/block/sda
sgdisk --new=29:0:+32 --typecode=29:FFFF --change-name=29:vbmeta_system_a /dev/block/sda
sgdisk --new=30:0:+32 --typecode=30:FFFF --change-name=30:vbmeta_system_b /dev/block/sda
sgdisk --new=31:0:+7104 --typecode=31:FFFF --change-name=31:bk010 /dev/block/sda
sgdisk --new=32:0:+1024 --typecode=32:FFFF --change-name=32:mem /dev/block/sda
sgdisk --new=33:0:+5120 --typecode=33:FFFF --change-name=33:opconfig /dev/block/sda
sgdisk --new=34:0:+8192 --typecode=34:FFFF --change-name=34:mbnconfig /dev/block/sda
sgdisk --new=35:0:+32768 --typecode=35:A039 --change-name=35:rescue /dev/block/sda
sgdisk --new=36:0:+102400 --typecode=36:FFFF --change-name=36:opcust /dev/block/sda
sgdisk --new=37:0:0 --typecode=37:A03A --change-name=37:userdata /dev/block/sda

  中间会出警告说 typecode FFFF 无效,会被改成 8300 ,不管他。
  然后重启进 recovery。

1
reboot recovery

恢复

  这时候 recovery 会提示各种错误,但是不影响 adbfastboot 的使用。可以把之前备份的分区用 dd 或者 fastboot 刷回去。
  我用的是 fastboot ,在 OrangeFox Recovery 里面点启用 fastboot 电脑会提示没有驱动,不过重启选项里面会有 reboot to Bootloader
  进到 Bootloader 之后开始恢复。

1
2
3
4
5
6
7
8
9
fastboot flash super backup/super.img
fastboot flash vbmeta_system_a backup/vbmeta_system_a.img
fastboot flash vbmeta_system_b backup/vbmeta_system_b.img
fastboot flash bk010 backup/bk010.img
fastboot flash mem backup/mem.img
fastboot flash opconfig backup/opconfig.img
fastboot flash mbnconfig backup/mbnconfig.img
fastboot flash rescue backup/rescue.img
fastboot flash opcust backup/opcust.img

  这次因为要刷 DerpFest,所以重启进 recovery 刷入 DerpFest 再格式化 userdata 分区然后重启。
  不刷的话在进 Bootloader 之前,用 recovery 格式化 userdata 分区,fastboot 恢复完直接重启应该就可以开机了。

完成

  开机后再查看分区表,可以看到 cust 变成 4.0 MiBuserdata 也变成 225.6 GiB 了。

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
# sgdisk --print /dev/block/sda

Disk /dev/block/sda: 61731840 sectors, 235.5 GiB
Sector size (logical/physical): 4096/4096 bytes
Disk identifier (GUID): E77371AE-5248-4869-98B0-2285DF076732
Partition table holds up to 64 entries
Main partition table begins at sector 2 and ends at sector 3
First usable sector is 6, last usable sector is 61731834
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 6 7 8.0 KiB FFFF switch
2 8 15 32.0 KiB A02C ssd
3 16 23 32.0 KiB FFFF dbg
4 24 31 32.0 KiB FFFF bk01
5 32 63 128.0 KiB FFFF bk02
6 64 127 256.0 KiB FFFF bk03
7 128 255 512.0 KiB FFFF bk04
8 256 383 512.0 KiB A02D keystore
9 384 511 512.0 KiB FFFF frp
10 512 1023 2.0 MiB FFFF countrycode
11 1024 2047 4.0 MiB A01F misc
12 2048 4095 8.0 MiB FFFF bk05
13 4096 6143 8.0 MiB FFFF logfs
14 6144 8191 8.0 MiB FFFF ffu
15 8192 12287 16.0 MiB FFFF oops
16 12288 16383 16.0 MiB A021 devinfo
17 16384 20479 16.0 MiB FFFF metadata
18 20480 24575 16.0 MiB FFFF bk06
19 24576 32767 32.0 MiB FFFF bk07
20 32768 49151 64.0 MiB FFFF bk08
21 49152 65535 64.0 MiB A026 persist
22 65536 81919 64.0 MiB FFFF persistbak
23 81920 90111 32.0 MiB FFFF mtdblk
24 90112 104959 58.0 MiB FFFF crash_history
25 104960 129535 96.0 MiB FFFF minidump
26 129536 206335 300.0 MiB A01C rawdump
27 206336 207359 4.0 MiB 8300 cust
28 207360 2435583 8.5 GiB 8300 super
29 2435584 2435615 128.0 KiB 8300 vbmeta_system_a
30 2435616 2435647 128.0 KiB 8300 vbmeta_system_b
31 2435648 2442751 27.8 MiB 8300 bk010
32 2442752 2443775 4.0 MiB 8300 mem
33 2443776 2448895 20.0 MiB 8300 opconfig
34 2448896 2457087 32.0 MiB 8300 mbnconfig
35 2457088 2489855 128.0 MiB A039 rescue
36 2489856 2592255 400.0 MiB 8300 opcust
37 2592256 61731834 225.6 GiB A03A userdata