八、系统分区及内容
1.主要来源几个疑惑:
a.在打包时,执行pack image.cfg sys_partition.fex. image.cfg指定了所有FILELIST,但是sys_partition.fex只指定了部分分区和该分区需要下载的文件,其余文件下载到哪些分区呢?
b.使用phoenixCard升级估计时,可以选择BOOT0/BOOT1,bootloader,ENV,BOOT,system,recovery,除了bootloader对应bootloader.img,ENV对应env.fex,system对应system.img(system.fex),BOOT对应boot.fex,recovery对应recovery.fex,其余文件呢?对应哪些选项?
c.使用fastboot也可以升级某个分区下的内容。
fastboot update xxx.zip
fastboot partition partiontion.img
fastboot erase partition
fastboot format partition
2.首先,来看看在sys_partition.fex中指定了哪些分区:
NAME CONTENT SIZE(x512=B)
bootlaoder boot-resource.fex 65536
env env.fex 32768
boot boot.fex 32768
system system.fex 4194304
misc 32768
recovery recovery.fex 65536
cache 2097152
metadata 32768
private 32768
frp 1024
empty 31744
alog 163840
media_data 32768
UDISK -
3.再来看看从机器里面读取出来的分区以及大小:
系统执行cat /proc/partitions获得分区大小以及分区对应的路径。
系统执行ls -al /dev/block/by-name 获得分区路径与分区别名映射;
UDISK -> /dev/block/mmcblk0p1 4190191
alog -> /dev/block/mmcblk0p13 81920
boot -> /dev/block/mmcblk0p4 16384
bootloader -> /dev/block/mmcblk0p2 32768
cache -> /dev/block/mmcblk0p8 1048576
empty -> /dev/block/mmcblk0p12 15872
env -> /dev/block/mmcblk0p3 16384
frp -> /dev/block/mmcblk0p11 512
media_data -> /dev/block/mmcblk0p14 16384
metadata -> /dev/block/mmcblk0p9 16384
misc -> /dev/block/mmcblk0p6 16384
private -> /dev/block/mmcblk0p10 16384
recovery -> /dev/block/mmcblk0p7 32768
system -> /dev/block/mmcblk0p5 2097152
-> /dev/block/mmcblk0 7634944 #the main block where all the partitions stored.
-> /dev/block/mmcblk0boot0 4096
-> /dev/block/mmcblk0boot1 4096
-> /dev/block/zram0 262144
4.那么接下来一个问题就是如何查看各个分区的内容呢?
a.首先执行的是“df”命令,或当设备当前已经挂载的分区。
/dev/block/mmcblk0p5 2031440 1019528 1011912 51% /system
/dev/block/mmcblk0p8 1015704 1296 1014408 1% /cache
/dev/block/mmcblk0p13 76528 44 76484 1% /logger
/dev/block/mmcblk0p1 4058864 587020 3471844 15% /data
/dev/block/mmcblk0p2 130798 3564 127234 3% /bootloader
b.可以轻松获得mmcblk0p5(system),mmcblk0p8(cache),mmcblk0p13(alog),mmcblk0p1(UDISK),mmcblk0p2(bootloader)这几个分区主要作用以及主要存储的内容;
c.通过mount命令查看系统当前所有已经挂在的分区的详细信息得到:
/dev/block/mmcblk0p5 on /system type ext4 (ro,seclabel,relatime,data=ordered)
我们可以依样画葫芦,进行其他分区mount操作:
mkdir mnt/test #确保挂载点存在
mount -o ro /dev/block/mmcblk0p13 mnt/test
ls /mnt/test
umount mnt/test #使用完毕后卸载挂载点
d.但是部分分区是EMMC类型,没有文件系统的,存储了raw数据,比如boot,recovery,misc,frp,env都是这种类型的分区。这种分区通常存储一些小的加密文件或者配置文件,重点是小。应用自己负责读取和解析文件格式。对于这类分区只能通过dd命令dump出来后用编辑器查看了。
dd if=/dev/block/mmcblk0p3 of=/mnt/sdcard/env.img #[count=1024]注意of一定要选择一个具有写权限的路径
adb pull /mnt/sdcard/env.img
e.挂在private分区,修改并查看内容。
将序列号写入到private分区:
adb shell
mkdir /mnt/private &&\
busybox mkfs.vfat /dev/block/by-name/private && \
busybox mount -t vfat /dev/block/by-name/private /mnt/private/ &&\
mkdir -p /mnt/private/ULI/factory &&\
cd /mnt/private/ULI/factory &&\
touch snum.txt &&\
echo "FF0000140009">snum.txt &&\
sync &&\
cat snum.txt
//重启然后通过命令行获取产品序列号
reboot
adb shell getprop ro.serialno
验证private分区内容(通过uboot环境):
在uboot环境pribate对应的cardno为9;
fatls sunxi_flash 9:0 /
fatls sunxi_flash 9:0 /ULI
fatls sunxi_flash 9:0 /ULI/factory
e.有时候我们需要知道emmc中各个分区起始地址,结束地址,那么就得借助parted工具。
https://forum.xda-developers.com/android/help/how-to-boot-sd-card-qmobile-z8-bricked-t3712171
adb remount && adb push parted /system/bin
parted /dev/block/mmcblk0 unit s print 得到如下信息(地址,大小都是以扇区为单位,一个扇区为512B):
2 73728s 139263s 65536s fat16 bootloader msftdata
3 139264s 172031s 32768s env msftdata
4 172032s 204799s 32768s boot msftdata
5 204800s 4399103s 4194304s ext4 system msftdata
6 4399104s 4431871s 32768s misc msftdata
7 4431872s 4497407s 65536s recovery msftdata
8 4497408s 6594559s 2097152s ext4 cache msftdata
9 6594560s 6627327s 32768s metadata msftdata
10 6627328s 6660095s 32768s private msftdata
11 6660096s 6661119s 1024s frp msftdata
12 6661120s 6692863s 31744s empty msftdata
13 6692864s 6856703s 163840s ext4 alog msftdata
14 6856704s 6889471s 32768s media_data msftdata
1 6889472s 15269853s 8380382s ext4 UDISK msftdata
那么问题来了,第一个分区(bootloader)起始于73728扇区,那么前面扇区呢?又处在哪个分区呢?如何查看呢?根据阅读EMMC的资料,EMMC的低地址扇区依次存放了boot0,boot1,RPMB分区;uboot,以及boot0.boot1启动例程和参数应该至于boot0/boot1区域;