硬件平台:CQR40,处理器 全志T3四核Cortex-A7;1G DDR3;8GB EMMC Flash;
软件平台:ubuntu16
一、分区表配置原则
1、分区的单位
分区单位:扇区(一个扇区占据 512 字节);
分区表示个数最多 2^31 * 512 = 2T,即容量大小最多为 2T。
2、分区的大小
为了安全和效率考虑,分区大小最好保证为 16M 字节的整数倍;
即:32768(扇区) = 16M。
3、分区表属性说明
分区属性 | 作用 | 配置选择 | 性质 |
name | 分区名 | 自定义 | 必选 |
size | 分区大小(单位:扇区) | 自定义 | 必选 |
downloadfile | 烧写的镜像 | 自定义 | 可选 |
user_type | 掉电保护的配置项 | nandflash | 必选 |
keydata | 量产保护数据选项 | 0x8000:量产保护数据 | 可选 |
verify | 量产校验的选项 | 1:量产校验(默认) 0:量产不校验 | 可选 |
4、各个分区表的作用与配置
以下说明以 V40 公版(magton-p1)为参照标准
4.1.bootloader分区
Boot 数据存放分区,用于保存 boot 启动后需要的数据,如图片、logo、字体库等素材内容。
分区建议:因保存的为素材内容,且数据量不会很大,使用默认 16M 即可。
4.2.env分区
环境变量分区,用于保存环境变量、启动参数等数据。
分区建议:因保存的为系统参数,数据量很小,使用默认 16M 即可
4.3.boot分区
这个分区上有 Android 的引导程序,包括 kernel 和 ramdisk。该分区设备用于引导系统启动。
现有 boot 镜像为 15M 左右,一般不会有大幅度的变化。
分区建议:无重大修改,默认使用 16M 即可。如果 boot 镜像超过 16M,需要将它修改为 32M
4.4.system分区
该分区为系统分区,存放android/ubuntu操作系统的,里面包含了Android/ubuntu用户库文件和预先安装的系统应用等,擦除了这个分区就会删除掉整个 Andorid/ubuntu 系统。
各方案需要关注OTA升级对其产生的影响,在ota升级时,会对该分区进行读写操作,如果升级过程
中分区被写满会导致升级失败,因此,在需要预留一定空间以便日后可进行 ota 升级。
分区建议:system 分区用于存放 system.img(路径为 android\out\target\product\方案\system.img),其大小必定要大于system.img文件的大小。另外,system分区的大小严重依赖于需要预装的apk/app,预装的apk/app越多,对 system分区容量的需求就越大。分区大小需要根据方案的具体情况来确定,建议最小 512M。
4.5.misc分区
存放系统启动参数等,一般用户 boot 启动后读取并作出相应的动作。
分区建议:因保存的为系统参数,数据量很小,使用默认 16M 即可。
4.6.recovery分区
recovery 分区可理解为另一个启动分区(与 boot 分区类似),用户可以启动设备进入 recovery 控制
台去执行高级的系统恢复或升级管理等操作。可理解为 window 的 winpe 系统。
分区建议:现有镜像文件recovery.img的大小为10M左右,日后升级可能会加入更多功能,但不会有
大幅度修改,因此建议分区大小为 32M。
4.7.private分区
私有分区,非标准分区。用户存放系统序列码等信息,并且使用恢复出厂设置或者量产等操作无法
清除该内容,产品出厂后会在该分区写入内容。出厂后一般不允许用户修改该分区内容。
分区建议:因保存的是方案特定的私有数据,其大小取决于带保存的私有数据的大小,一般数据量
很小,使用默认 16M 即可。
4.8.reserve0分区
保留分区,16M
4.9.cache分区
缓存分区。最主要的用处为当进行 ota 升级时,会将相应的命令和升级包存放在该分区使用。但也有
部分系统可不使用该分区,直接在如/mnt/sdcard 分区里经常 ota 升级(需要 recovery 支持,非标准)。
分区建议:如可直接使用/mnt/sdcard/分区进行 ota 升级,可仅仅划分 16M 即可,否则,需要根据规
划中 ota 的升级包大小划分分区。如一般的 ota 包在 250M 左右,可划分到 350M,或根据具体的 ota 升
级包预留 50%空间。
4.10.UDISK分区
用户内置存储分区。系统总分区大小减去已分配的大小(即所有未分配的剩余的空间,不需要显式分
配大小)都为该分区所用。UDISK 分区可理解为 android 系统的/sdcard 分区即用户 internal storage,用于存放用户数据,也可将应用程序安装在该位置,可以节省data分区的空间。必须保证sys_partition.fex的最
后一个分区为 UDISK 分区。
分区建议:根据 flash 容量大小分配剩余的即可。
二、分区操作
1.修改sys_partiton_dragonboard.fex
;---------------------------------------------------------------------------------------------------
; 说明: 脚本中的字符串区分大小写,用户可以修改"="后面的数值,但是不要修改前面的字符串
;---------------------------------------------------------------------------------------------------
;---------------------------------------------------------------------------------------------------
; 固件下载参数配置
;---------------------------------------------------------------------------------------------------
;***************************************************************************************************
; mbr的大小, 以Kbyte为单位
;***************************************************************************************************
[mbr]
size = 16384
;***************************************************************************************************
; 分区配置
;
;
; partition 定义范例:
; [partition] ; //表示是一个分区
; name = USERFS2 ; //分区名称
; size = 16384 ; //分区大小 单位: 扇区.分区表示个数最多2^31 * 512 = 2T
; downloadfile = "123.fex" ; //下载文件的路径和名称,可以使用相对路径,相对是指相对于image.cfg文件所在分区。也可以使用绝对路径
; keydata = 1 ; //私有数据分区,重新量产数据将不丢失
; encrypt = 1 ; //采用加密方式烧录,将提供数据加密,但损失烧录速度
; = ? ; //私有用法
; verify = 1 ; //要求量产完成后校验是否正确
;
; 注:1、name唯一, 不允许同名
; 2、name最大12个字符
; 3、size = 0, 将创建一个无大小的空分区
; 4、为了安全和效率考虑,分区大小最好保证为16M字节的整数倍
; size = 25165824
; 8G eMMC 7.3 GiB, 7818182656 bytes, 15269888 sectors
; Units: sectors of 1 * 512 = 512 bytes
; DataPart = 15269888 - (32768*5 + 4194304) = 10911744
;
;***************************************************************************************************
[partition_start]
[partition]
name = boot-res
size = 32768
downloadfile = "bootloader.fex"
user_type = 0x8000
[partition]
name = env
size = 32768
downloadfile = "env.fex"
user_type = 0x8000
[partition]
name = boot
size = 65536
downloadfile = "boot.fex"
user_type = 0x8000
[partition]
name = rootfs
size = 4718592
;2560m -256m 5242880
downloadfile = "rootfs.fex"
user_type = 0x8000
[partition]
name = klog
size = 32768
user_type = 0x8000
[partition]
name = data
size = 2097152
downloadfile = "datafs.fex"
user_type = 0x8000
[partition]
name = secret
size = 32768
; downloadfile = "secret.fex"
keydata = 0x8000
user_type = 0x8000
[partition]
name = reserve
size = 32768
downloadfile = "reserve.fex"
user_type = 0x8000
[partition]
name = reserve2
size = 32768
user_type = 0x8000
[partition]
name = UDISK
user_type = 0x8100
2.修改zb_cqr40_ubuntu16\buildroot\scripts\mkcmd.sh
function mkrootfs()
{
mk_info "build rootfs ..."
if [ ${LICHEE_PLATFORM} = "linux" -o ${LICHEE_PLATFORM} = "eyeseelinux" ] ; then
make O=${LICHEE_BR_OUT} -C ${LICHEE_BR_DIR} target-generic-getty-busybox
[ $? -ne 0 ] && mk_error "build rootfs Failed" && return 1
make O=${LICHEE_BR_OUT} -C ${LICHEE_BR_DIR} target-finalize
[ $? -ne 0 ] && mk_error "build rootfs Failed" && return 1
make O=${LICHEE_BR_OUT} -C ${LICHEE_BR_DIR} LICHEE_GEN_ROOTFS=y rootfs-ext4
[ $? -ne 0 ] && mk_error "build rootfs Failed" && return 1
cp ${LICHEE_BR_OUT}/images/rootfs.ext4 ${LICHEE_PLAT_OUT}
if [ -f "${LICHEE_BR_OUT}/images/rootfs.squashfs" ]; then
cp ${LICHEE_BR_OUT}/images/rootfs.squashfs ${LICHEE_PLAT_OUT}
fi
if [ "x$PACK_TINY_ANDROID" = "xtrue" ];then
packtinyandroid
fi
elif [ ${LICHEE_PLATFORM} = "dragonboard" ] ; then
tooldir=${LICHEE_UBOOT_DIR}/toolchain/gcc-linaro-4.9-2016.02-x86_64_arm-linux-gnueabihf
export PATH=${tooldir}/bin:$PATH
export LICHEE_TOOLCHAIN_PATH=${tooldir}
rm -rf ${LICHEE_BR_DIR}/target/dragonboard/rootfs/lib/modules/*
if [ ${UBUNTU_VERSION} = "ubuntu15" ]; then
cp -rf ${LICHEE_KERN_DIR}/output/lib/modules/* ${LICHEE_TOP_DIR}/ubuntu15/lib/modules/
(cd ${LICHEE_BR_DIR}/target/ubuntu15; ./build.sh)
if [ $? -ne 0 ]; then
mk_info "build rootfs ERROR."
exit 1
fi
mv ${LICHEE_BR_DIR}/target/ubuntu15/rootfs.ext4 ${LICHEE_PLAT_OUT}
elif [ ${UBUNTU_VERSION} = "ubuntu16" ]; then
prepare_ubuntu16
cp -rf ${LICHEE_KERN_DIR}/output/lib/modules/* ${LICHEE_TOP_DIR}/ubuntu16/lib/modules/
(cd ${LICHEE_BR_DIR}/target/ubuntu16; ./build.sh)
(cd ${LICHEE_BR_DIR}/target/datafs; ./build.sh)
(cd ${LICHEE_BR_DIR}/target/secret; ./build.sh)
(cd ${LICHEE_BR_DIR}/target/reserve; ./build.sh)
if [ $? -ne 0 ]; then
mk_info "build rootfs ERROR."
exit 1
fi
mv ${LICHEE_BR_DIR}/target/ubuntu16/rootfs.ext4 ${LICHEE_PLAT_OUT}
mv ${LICHEE_BR_DIR}/target/datafs/datafs.ext4 ${LICHEE_PLAT_OUT}
mv ${LICHEE_BR_DIR}/target/secret/secret.ext4 ${LICHEE_PLAT_OUT}
mv ${LICHEE_BR_DIR}/target/reserve/reserve.ext4 ${LICHEE_PLAT_OUT}
fi
else
mk_info "skip make rootfs for ${LICHEE_PLATFORM}"
fi
mk_info "build rootfs OK."
}
3.在${LICHEE_BR_DIR}/target/ 下添加脚本
3.1.在${LICHEE_BR_DIR}/target/新建datafs、secret、reserve文件夹
3.2.在${LICHEE_BR_DIR}/target/datafs/添加脚本,内容如下:
3.2.1.新建build.sh
#!/bin/bash
OUT_PATH=""
BR_ROOT=`(cd ../..; pwd)`
export PATH=$BR_ROOT/target/tools/host/usr/bin
#export cpu env
export CPU=${LICHEE_CHIP%p*}
echo $CPU
cd ${LICHEE_TOP_DIR}/lib/
if [ -e "build.sh" ]; then
./build.sh
fi
cd -
echo "generating ubuntu16 datafs..."
NR_SIZE=`du -sm ${LICHEE_TOP_DIR}/datafs | awk '{print $1}'`
NEW_NR_SIZE=$((((1024)/16)*16))
#NEW_NR_SIZE=$((((6862)/16)*16))
#NEW_NR_SIZE=360
TARGET_IMAGE=datafs.ext4
echo "blocks: $NR_SIZE"M" -> $NEW_NR_SIZE"M""
make_ext4fs -s -l $NEW_NR_SIZE"M" $TARGET_IMAGE ${LICHEE_TOP_DIR}/datafs/
fsck.ext4 -y $TARGET_IMAGE > /dev/null
echo "success in generating datafs"
if [ -n "$OUT_PATH" ]; then
cp -v datafs.ext4 $OUT_PATH/
if [ $? -ne 0 ] ; then
exit 1
fi
fi
echo "Build at: `date`"
3.2.2.新建clean.sh
#!/bin/sh
rm -rf rootfs.ext4
3.3.在${LICHEE_BR_DIR}/target/reserve/添加脚本,内容如下:
3.3.1.新建build.sh
#!/bin/bash
OUT_PATH=""
BR_ROOT=`(cd ../..; pwd)`
export PATH=$BR_ROOT/target/tools/host/usr/bin
#export cpu env
export CPU=${LICHEE_CHIP%p*}
echo $CPU
cd ${LICHEE_TOP_DIR}/lib/
if [ -e "build.sh" ]; then
./build.sh
fi
cd -
echo "generating reserve..."
NR_SIZE=`du -sm ${LICHEE_TOP_DIR}/reserve | awk '{print $1}'`
NEW_NR_SIZE=$((((16)/16)*16))
#NEW_NR_SIZE=$((((6862)/16)*16))
#NEW_NR_SIZE=360
TARGET_IMAGE=reserve.ext4
echo "blocks: $NR_SIZE"M" -> $NEW_NR_SIZE"M""
make_ext4fs -s -l $NEW_NR_SIZE"M" $TARGET_IMAGE ${LICHEE_TOP_DIR}/reserve/
fsck.ext4 -y $TARGET_IMAGE > /dev/null
echo "success in generating reserve"
if [ -n "$OUT_PATH" ]; then
cp -v reserve.ext4 $OUT_PATH/
if [ $? -ne 0 ] ; then
exit 1
fi
fi
echo "Build at: `date`"
3.3.2.新建clean.sh
#!/bin/sh
rm -rf reserve.ext4
3.4.在${LICHEE_BR_DIR}/target/secret/添加脚本,内容如下:
3.4.1.新建build.sh
#!/bin/bash
OUT_PATH=""
BR_ROOT=`(cd ../..; pwd)`
export PATH=$BR_ROOT/target/tools/host/usr/bin
#export cpu env
export CPU=${LICHEE_CHIP%p*}
echo $CPU
cd ${LICHEE_TOP_DIR}/lib/
if [ -e "build.sh" ]; then
./build.sh
fi
cd -
echo "generating secret..."
NR_SIZE=`du -sm ${LICHEE_TOP_DIR}/secret | awk '{print $1}'`
NEW_NR_SIZE=$((((16)/16)*16))
#NEW_NR_SIZE=$((((6862)/16)*16))
#NEW_NR_SIZE=360
TARGET_IMAGE=secret.ext4
echo "blocks: $NR_SIZE"M" -> $NEW_NR_SIZE"M""
make_ext4fs -s -l $NEW_NR_SIZE"M" $TARGET_IMAGE ${LICHEE_TOP_DIR}/secret/
fsck.ext4 -y $TARGET_IMAGE > /dev/null
echo "success in generating secret"
if [ -n "$OUT_PATH" ]; then
cp -v secret.ext4 $OUT_PATH/
if [ $? -ne 0 ] ; then
exit 1
fi
fi
echo "Build at: `date`"
3.4.2.新建clean.sh
#!/bin/sh
rm -rf secret.ext4
4.修改${LICHEE_BR_DIR}/target/ ubuntu16/build.sh脚本为:
#!/bin/bash
OUT_PATH=""
BR_ROOT=`(cd ../..; pwd)`
export PATH=$BR_ROOT/target/tools/host/usr/bin
#export cpu env
export CPU=${LICHEE_CHIP%p*}
echo $CPU
cd ${LICHEE_TOP_DIR}/lib/
if [ -e "build.sh" ]; then
./build.sh
fi
cd -
echo "generating ubuntu16 rootfs..."
NR_SIZE=`du -sm ${LICHEE_TOP_DIR}/ubuntu16 | awk '{print $1}'`
NEW_NR_SIZE=$((((2560-256)/16)*16))
#NEW_NR_SIZE=$((((6862)/16)*16))
#NEW_NR_SIZE=360
TARGET_IMAGE=rootfs.ext4
echo "blocks: $NR_SIZE"M" -> $NEW_NR_SIZE"M""
make_ext4fs -s -l $NEW_NR_SIZE"M" $TARGET_IMAGE ${LICHEE_TOP_DIR}/ubuntu16/
fsck.ext4 -y $TARGET_IMAGE > /dev/null
echo "success in generating rootfs"
if [ -n "$OUT_PATH" ]; then
cp -v rootfs.ext4 $OUT_PATH/
if [ $? -ne 0 ] ; then
exit 1
fi
fi
echo "Build at: `date`"
5.修改${LICHEE_TOP_DIR}/tools/pack/pack 打包脚本:
function do_pack_dragonboard()
{
printf "packing for dragonboard\n"
ln -s ${LICHEE_OUT}/boot.img boot.fex
ln -s ${LICHEE_OUT}/rootfs.ext4 rootfs.fex
ln -s ${LICHEE_OUT}/datafs.ext4 datafs.fex
ln -s ${LICHEE_OUT}/secret.ext4 secret.fex
ln -s ${LICHEE_OUT}/reserve.ext4 reserve.fex
if [ "x${PACK_SIG}" = "xsig" ] ; then
echo "signature sunxi mbr"
signature sunxi_mbr.fex dlinfo.fex
echo "signature over"
elif [ "x${PACK_SIG}" = "xsecure" ] ; then
echo "secure"
do_signature
elif [ "x${PACK_SIG}" = "xprev_refurbish" ] ; then
echo "prev_refurbish"
do_signature
else
echo "normal"
fi
}
三、结果展示