RK3288 Android6 新增分区

背景

特定情况下需要新增分区,比如开辟一个分区专门用于保存系统日志,恢复出厂默认时不会被清理. 以新增slog分区为例,说明RK3288 Android6新增分区的方法。

代码结构

# package-file
FFTools/mkupdate/package-file

# 分区表
FFTools/parameter/rk3288-3.10-uboot-android.parameter.txt

# 开机自动挂载相关
device/rockchip/rk3288/
|-- fstab.rk30board.bootmode.emmc
|-- init.rc
`-- slog
    `-- README.md

# 创建 slog.img
mkimage.sh

新增分区

修改分区表

  • FFTools/parameter/rk3288-3.10-uboot-android.parameter.txt
--- a/FFTools/parameter/rk3288-3.10-uboot-android.parameter.txt
+++ b/FFTools/parameter/rk3288-3.10-uboot-android.parameter.txt
@@ -10,4 +10,4 @@ PWR_HLD: 0,0,A,0,1
 #KERNEL_IMG: 0x62008000
 #FDT_NAME: rk-kernel.dtb
 #RECOVER_KEY: 1,1,0,20,0
-CMDLINE:console=ttyS0 androidboot.selinux=permissive androidboot.hardware=rk30board androidboot.console=ttyS0 root=/dev/block/mtd/by-name/linuxroot rw rootfstype=ext4 init=/sbin/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00008000@0x00006000(resource),0x00008000@0x0000e000(kernel),0x00010000@0x00016000(boot),0x00010000@0x00026000(recovery),0x0001a000@0x00036000(backup),0x00040000@0x00050000(cache),0x00002000@0x00090000(kpanic),0x00300000@0x00092000(system),0x00008000@0x00392000(metadata),0x00002000@0x0039A000(baseparamer),-@0x003BC000(userdata)
+CMDLINE:console=ttyS0 androidboot.selinux=permissive androidboot.hardware=rk30board androidboot.console=ttyS0 root=/dev/block/mtd/by-name/linuxroot rw rootfstype=ext4 init=/sbin/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(misc),0x00008000@0x00006000(resource),0x00008000@0x0000e000(kernel),0x00010000@0x00016000(boot),0x00010000@0x00026000(recovery),0x0001a000@0x00036000(backup),0x00040000@0x00050000(cache),0x00002000@0x00090000(kpanic),0x00300000@0x00092000(system),0x00008000@0x00392000(metadata),0x00002000@0x0039A000(baseparamer),0x00200000@0x003BC000(slog),-@0x005BC000(userdata)

从原来的userdata分区分了1G出来,用于创建新的分区 slog.
-@0x003BC000(userdata) 变为 0x00200000@0x003BC000(slog),-@0x005BC000(userdata)

  • @ 前面0x00200000代表分区大小, 单位为1个block,也就是512Bytes
  • @后面0x003BC000代表分区在emmc中的起始地址
  • 新增slog分区后,userdata起始地址需要更新为 0x003BC000 + 0x00200000 = 0x005BC000

修改 package-file

  • FFTools/mkupdate/package-file

package-file用于打包update.img,新增分区后,也需要添加新的slog.img信息。

--- a/FFTools/mkupdate/package-file
+++ b/FFTools/mkupdate/package-file
@@ -12,6 +12,7 @@ kernel                Image/kernel.img
 boot        Image/boot.img
 recovery       Image/recovery.img
 system         Image/system.img
+slog           Image/slog.img

修改 fstab

  • device/rockchip/rk3288/fstab.rk30board.bootmode.emmc

fstab是系统启动后用于挂载分区的配置表,为了自动挂载slog分区,需要修改这个文件。

--- a/fstab.rk30board.bootmode.emmc
+++ b/fstab.rk30board.bootmode.emmc
@@ -10,6 +10,7 @@
 /dev/block/platform/ff0f0000.rksdmmc/by-name/metadata       /metadata           ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard                wait,check
 /dev/block/platform/ff0f0000.rksdmmc/by-name/userdata       /data               f2fs      noatime,nodiratime,nosuid,nodev   wait,check,encryptable=/metadata/key_file
 /dev/block/platform/ff0f0000.rksdmmc/by-name/userdata       /data               ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard,errors=panic   wait,check,encryptable=/metadata/key_file
+/dev/block/platform/ff0f0000.rksdmmc/by-name/slog           /slog               ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard                wait,check
 # /dev/block/platform/ff0f0000.rksdmmc/by-name/radical_update /radical_update     ext4      noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard          wait
 
 /devices/ff0c0000.rksdmmc/mmc_host*        auto  auto    defaults        voldmanaged=sdcard1:auto,encryptable=userdata

新增一行 slog 配置。

/dev/block/platform/ff0f0000.rksdmmc/by-name/slog /slog  ext4  noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard    wait,check
  • /dev/block/platform/ff0f0000.rksdmmc/by-name/slog: 指定要挂载的分区设备路径。
  • /slog: 指定挂载点,即分区将被挂载到文件系统中的 /slog 目录。
  • ext4: 文件系统类型,表明该分区使用 ext4 文件系统。
  • noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard: 这是挂载选项,具体含义如下:
    • noatime: 不更新文件和目录的访问时间。
    • nodiratime: 不更新目录的访问时间。
    • nosuid: 防止设置 setuid 位的执行文件的 suid 权限。
    • nodev: 不允许在文件系统上执行设备文件。
    • noauto_da_alloc: 禁用自动的数据区块分配。
    • discard: 启用 TRIM/DISCARD支持,允许文件系统通知底层设备已删除的块,适用于 SSD,有助于提高性能。
  • wait: 表明系统在挂载时会等待直到这个分区可用。
  • check: 表示在挂载前会检查文件系统。

修改 init.rc

  • device/rockchip/rk3288/init.rc
--- a/init.rc
+++ b/init.rc
@@ -62,6 +62,7 @@ on init
     mkdir /cache 0770 system cache
     mkdir /config 0500 root root
     mkdir /backup
+    mkdir /slog

init.rc中需要创建挂载点 /slog

新增 slog 目录

  • device/rockchip/rk3288/slog

为了生成 slog.img 镜像,需要有原始文件目录,当然也可以是个空目录。这里仅放了一个 README.md

# README

this is slog partition.

修改 mkimage.sh

  • mkimage.sh
--- a/mkimage.sh
+++ b/mkimage.sh
@@ -28,6 +28,7 @@ echo IMG_TARGET=$IMG_TARGET , ota = $TARGET
 IMAGE_PATH=rockdev/Image-$TARGET_PRODUCT
 UBOOT_PATH=u-boot
 KERNEL_PATH=kernel
+SLOG_PATH=device/rockchip/rk3288/slog
 PARAMETER=FFTools/parameter/rk3288-3.10-uboot-android.parameter.txt
 
 rm -rf $IMAGE_PATH
@@ -155,6 +156,19 @@ then
        echo "done."
 fi
 
+if [ -d $SLOG_PATH ]
+then
+    echo -n "create slog.img..."
+    slog_size=10485760
+    MAKE_EXT4FS_ARGS=" -L slog -a slog $IMAGE_PATH/slog.img $SLOG_PATH"
+    make_ext4fs -l $slog_size $MAKE_EXT4FS_ARGS >/dev/null 2>&1 &&
+    tune2fs -c -1 -i 0 $IMAGE_PATH/slog.img >/dev/null 2>&1 &&
+    e2fsck -fyD $IMAGE_PATH/slog.img >/dev/null 2>&1 || true
+    echo "done."
+fi
+
 if [ -f $KERNEL_PATH/resource.img ]
 then
         echo -n "create resource.img..."

这里主要是为了创建 slog.img.
到此,整个分区相关的配置都改好了,编译后完整固件后,在系统中就可以看到/slog 目录了,也可以看到分区默认挂载好了。

注意事项

  1. 重新烧录固件后,slog分区也会被清除
  2. 恢复出厂默认设置时,slog分区不会被清除