make_ext4fs -s -T -1 -S out/target/product/sisley2OTP/root/file_contexts -l 1237319680 -a data out/target/product/sisley2OTP/userdata.img out/target/product/sisley2OTP/data
Creating filesystem with parameters:
Size: 1237319680 //0x49c00000
Block size: 4096
Blocks per group: 32768
Inodes per group: 7552
Inode size: 256
Journal blocks: 4720
Label:
Blocks: 302080
Block groups: 10
Reserved block group size: 79
Created filesystem with 33/75520 inodes and 10340/302080 blocks
可以看到这个例子中生成ext4 image时总的size为0x49c00000 (1180MB)。
而download后第一次开机后会执行ext4 resize操作,根据实际userdata分区的大小修改ext4 fs里面的相关参数,以达到文件系统自适应emmc实际大小的目的。 可以从kernel log中找到类似下面的log:
[ 7.677582].(5)[180:resize_ext4]resize: Size for partition(/dev/block/platform/mtk-msdc.0/by-name/userdata) is 12064256K. //0x2E0580000,userdata分区实际的size
[ 7.678956].(5)[180:resize_ext4]resize: Size in superblock is 1208320K. //0x49C000000, userdata在分区表中的size
[ 7.679793].(5)[180:resize_ext4]resize: Size will (maybe) resize to(after adjust) is 12064256K.
[ 7.681178].(5)[180:resize_ext4]resize: Running /system/bin/resize2fs on /dev/block/platform/mtk-msdc.0/by-name/userdata
[ 8.169390].(0)[180:resize_ext4]resize: Resize ext4 return 0
在执行恢复出厂设置时,会擦除userdata分区,并重新利用make_ext4fs创建新的文件系统,这时候就是直接根据userdata分区的实际大小来创建ext4 fs。从factory reset recovery log中会找到类似以下这段:
Formatting /data...
format /data start=1420131485
I:GPT is supported!
Creating filesystem with parameters:
Size: 12353798144 //0x2E0580000
Block size: 4096
Blocks per group: 32768
Inodes per group: 8112
Inode size: 256
Journal blocks: 32768
Label:
Blocks: 3016064
Block groups: 93
Reserved block group size: 743
Created filesystem with 11/754416 inodes and 87558/3016064 blocks
format end=1420131494 duration=9
对比build时创建的userdata.img和factory reset时在userdata分区创建文件系统,由于userdata分区的size在这两种情况下不同,那么创建ext4时一些参数就会被自动调整,这里看到最重要的就是 Journal blocks差异较大,build时是 4720,recovery时是32768,差了110MB左右。inode per group也会有些差异,这些都是导致df出来的分区大小差异的原因。因为ext4 resize操作不会调整这些参数值,只会调整super block里面的参数,以及总的block和group数目。
一般手机只会在工厂产线上遇到这样的问题,手机在产线上一定会最后做factory reset,end user一般只会做OTA升级,不会再遇到这样的问题。