背景
客户需求:创建可读写分区bkdate,用于数据备份,ota升级、恢复出厂设备bkdata分区数据保留
1.分区表参数文件修改 device/rockchip/rk3288/parameter.txt
新增128M bkdata分区:
0x00040000@0x006BC000(bkdata),-@0x006FC000(userdata)
FIRMWARE_VER:7.1
MACHINE_MODEL:rk3288
MACHINE_ID:007
MANUFACTURER:RK3288
MAGIC: 0x5041524B
ATAG: 0x60000800
MACHINE: 3288
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
CMDLINE: console=ttyFIQ0 androidboot.baseband=N/A androidboot.selinux=permissive androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00002000@0x00006000(misc),0x00008000@0x00008000(resource),0x0000C000@0x00010000(kernel),0x00010000@0x0001C000(boot),0x00010000@0x0002C000(recovery),0x00038000@0x0003C000(backup),0x00040000@0x00074000(cache),0x00500000@0x000B4000(system),0x00008000@0x005B4000(metadata),0x00080000@0x005BC000(vendor0),0x00080000@0x0063C000(vendor1),0x00040000@0x006BC000(bkdata),-@0x006FC000(userdata)
在内核log信息中可以看到
[ 1.025640] bkdata: 0x0d7800000 -- 0x0df800000 (128 MB)
[ 1.025259] mmcblk1rpmb: mmc1:0001 8GTF4R partition 3 512 KiB
[ 1.025534] uboot: 0x000400000 -- 0x000800000 (4 MB)
[ 1.025544] trust: 0x000800000 -- 0x000c00000 (4 MB)
[ 1.025551] misc: 0x000c00000 -- 0x001000000 (4 MB)
[ 1.025574] resource: 0x001000000 -- 0x002000000 (16 MB)
[ 1.025581] kernel: 0x002000000 -- 0x003800000 (24 MB)
[ 1.025588] boot: 0x003800000 -- 0x005800000 (32 MB)
[ 1.025594] recovery: 0x005800000 -- 0x007800000 (32 MB)
[ 1.025601] backup: 0x007800000 -- 0x00e800000 (112 MB)
[ 1.025607] cache: 0x00e800000 -- 0x016800000 (128 MB)
[ 1.025614] system: 0x016800000 -- 0x0b6800000 (2560 MB)
[ 1.025620] metadata: 0x0b6800000 -- 0x0b7800000 (16 MB)
[ 1.025627] vendor0: 0x0b7800000 -- 0x0c7800000 (256 MB)
[ 1.025633] vendor1: 0x0c7800000 -- 0x0d7800000 (256 MB)
[ 1.025640] bkdata: 0x0d7800000 -- 0x0df800000 (128 MB)
[ 1.025646] userdata: 0x0df800000 -- 0x1d1c00000 (3876 MB)
[ 1.025674] mmcblk1: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15
分区定义说明:
1、为了兼容性,目前RK所有AP都是用rk29xxnand做标识。
2、单个分区说明:
例如:0x00002000@0x00008000(boot),@符号之前的数值是分区大小,@符号之后的数值是分区的起始位置,括号里面的字符是分区的名字。所有数值的单位是sector,1个sector为512Bytes.上例中,boot分区起始位置为0x8000 sectors位置,大小为0x2000 sectors(4MB).
3、为了性能,每个分区起始地址需要32KB(64 sectors)对齐,大小也需要32KB的整数倍。
4、如果使用sparse格式的镜像,升级时会擦除数据,为了兼容性更好,对应的分区最好按4MB对齐,大小也按4MB整数倍配置。
2.fstab文件中添加相关配置
2.1 在device/rockchip/rk3288/fstab.rk30board.bootmode.emmc.rk3288w中添加分区文件系统格式的静态信息
/dev/block/platform/ff0f0000.dwmmc/by-name/bkdata /bkdata ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check
2.2 在device/rockchip/rk3288/recovery.emmc.fstab中添加分区,recovery中需要格式化分区的时候使用
/dev/block/platform/ff0f0000.dwmmc/by-name/bkdata /bkdata ext4 defaults defaults
3.init.*.rc文件中添加相关配置
3.1 在device/rockchip/common/recovery/etc/init.rc中创建目录,recovery中使用
mkdir /bkdata
3.2 在device/rockchip/common/init.rockchip.rc中添加挂载方式,修改挂载目录权限
mkdir /bkdata 0777 system system
mount ext4 mtd@bkdata /bkdata wait noatime nodiratime nosuid nodev noauto_da_alloc
3.3 在device/rockchip/common/init.rk30board.rc中初始化安全属性
restorecon_recursive /bkdata
4.若开启了Selinux,需要添加selinux权限
在device/rockchip/common/sepolicy/file_contexts中添加
/bkdata(/.*)? u:object_r:metadata_file:s0
5.recovery对新增分bkdata分区的处理
在bootable/recovery/recovery.cpp中添加SureBkdataMount(),recovery时会去挂载/bkdata目录,若是挂载不上,则格式化这个分区。
参考SureMetadataMount()添加方法SureBkdataMount()
void SureBkdataMount() {
if (ensure_path_mounted("/bkdata")) {
printf("mount bkdata fail,so formate...\n");
tmplog_offset = 0;
format_volume("/bkdata");
ensure_path_mounted("/bkdata");
}
}
将SureBkdataMount();添加到 SureMetadataMount(); 后边
void SureCacheMount() {
if(ensure_path_mounted("/cache")) {
printf("mount cache fail,so formate...\n");
@@ -1805,6 +1816,9 @@ int main(int argc, char **argv) {
SureCacheMount();
SureMetadataMount();
+ // start add /bkdata by lpz 20210731
+ SureBkdataMount();
+ // end add /bkdata by lpz 20210731
//dump ro.bootmode type
char bootmode[256];
6.完整补丁
diff --git a/bootable/recovery/recovery.cpp b/bootable/recovery/recovery.cpp
index 1981544..52fd3f0 100755
--- a/bootable/recovery/recovery.cpp
+++ b/bootable/recovery/recovery.cpp
@@ -1468,6 +1468,17 @@ void SureMetadataMount() {
}
}
+// start add /bkdata by lpz 20210731
+void SureBkdataMount() {
+ if (ensure_path_mounted("/bkdata")) {
+ printf("mount bkdata fail,so formate...\n");
+ tmplog_offset = 0;
+ format_volume("/bkdata");
+ ensure_path_mounted("/bkdata");
+ }
+}
+// end add /bkdata by lpz 20210731
+
void SureCacheMount() {
if(ensure_path_mounted("/cache")) {
printf("mount cache fail,so formate...\n");
@@ -1805,6 +1816,9 @@ int main(int argc, char **argv) {
SureCacheMount();
SureMetadataMount();
+ // start add /bkdata by lpz 20210731
+ SureBkdataMount();
+ // end add /bkdata by lpz 20210731
//dump ro.bootmode type
char bootmode[256];
diff --git a/device/rockchip/common/init.rk30board.rc b/device/rockchip/common/init.rk30board.rc
index 179f7b7..44cbfca 100755
--- a/device/rockchip/common/init.rk30board.rc
+++ b/device/rockchip/common/init.rk30board.rc
@@ -64,6 +64,9 @@ on init
on boot
+ # start add /bkdata by lpz 20210731
+ restorecon_recursive /bkdata
+ # end add /bkdata by lpz 20210731
restorecon_recursive /sys/devices/system/cpu/cpufreq/interactive
chown system system /sys/devices/system/cpu/cpufreq/interactive/timer_rate
chmod 0660 /sys/devices/system/cpu/cpufreq/interactive/timer_rate
diff --git a/device/rockchip/common/init.rockchip.rc b/device/rockchip/common/init.rockchip.rc
index 4b3e0fe..ab93473 100755
--- a/device/rockchip/common/init.rockchip.rc
+++ b/device/rockchip/common/init.rockchip.rc
@@ -44,6 +44,11 @@ on post-fs-data
# For a remount only the flags and the target mount point are relevant.
mount dummy dummy /data remount nosuid nodev noatime rw seclabel,background_gc=on,user_xattr,acl,errors=panic
+ # start add /bkdata by lpz 20210731
+ mkdir /bkdata 0777 system system
+ mount ext4 mtd@bkdata /bkdata wait noatime nodiratime nosuid nodev noauto_da_alloc
+ # end add /bkdata by lpz 20210731
+
# we will remap this as /mnt/sdcard with the sdcard fuse tool
mkdir /data/media 0770 media_rw media_rw
chown media_rw media_rw /data/media
diff --git a/device/rockchip/common/recovery/etc/init.rc b/device/rockchip/common/recovery/etc/init.rc
old mode 100644
new mode 100755
index 2ed0ea6..93f52e5
--- a/device/rockchip/common/recovery/etc/init.rc
+++ b/device/rockchip/common/recovery/etc/init.rc
@@ -28,6 +28,9 @@ on init
mkdir /mnt/usb_storage
mkdir /system
mkdir /metadata
+ # start add /bkdata by lpz 20210731
+ mkdir /bkdata
+ # end add /bkdata by lpz 20210731
mkdir /radical_update
mkdir /data
mkdir /cache
diff --git a/device/rockchip/common/sepolicy/file_contexts b/device/rockchip/common/sepolicy/file_contexts
index fc98a5a..13882ec 100755
--- a/device/rockchip/common/sepolicy/file_contexts
+++ b/device/rockchip/common/sepolicy/file_contexts
@@ -25,6 +25,9 @@
/data/misc/akmd(/.*)? u:object_r:akmd_file:s0
/metadata(/.*)? u:object_r:metadata_file:s0
+# start add /bkdata by lpz 20210731
+/bkdata(/.*)? u:object_r:metadata_file:s0
+# end add /bkdata by lpz 20210731
/dev/mma8452_daemon u:object_r:sensor_device:s0
/data/camera(/.*)? u:object_r:camdata_file:s0
@@ -93,6 +96,7 @@
/dev/block/platform/ff0f0000.dwmmc/by-name/userdata u:object_r:userdata_block_device:s0
/dev/block/platform/ff0f0000.dwmmc/by-name/boot u:object_r:boot_block_device:s0
/dev/block/platform/ff0f0000.dwmmc/by-name/recovery u:object_r:recovery_block_device:s0
+/dev/block/platform/ff0f0000.dwmmc/by-name/bkdate u:object_r:e2fsck_bkdata_block_device:s0
#for 312x emmc device
/dev/block/platform/1021c000.rksdmmc/by-name/frp u:object_r:frp_block_device:s0
diff --git a/device/rockchip/rk3288/fstab.rk30board.bootmode.emmc.rk3288w b/device/rockchip/rk3288/fstab.rk30board.bootmode.emmc.rk3288w
index 26280fb..0419ec7 100755
--- a/device/rockchip/rk3288/fstab.rk30board.bootmode.emmc.rk3288w
+++ b/device/rockchip/rk3288/fstab.rk30board.bootmode.emmc.rk3288w
@@ -9,6 +9,9 @@
/dev/block/platform/ff0f0000.dwmmc/by-name/vendor1 /vendor ext4 ro,noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait
/dev/block/platform/ff0f0000.dwmmc/by-name/cache /cache ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check
/dev/block/platform/ff0f0000.dwmmc/by-name/metadata /metadata ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check
+# start add /bkdata by lpz 20210731
+/dev/block/platform/ff0f0000.dwmmc/by-name/bkdata /bkdata ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard wait,check
+# end add /bkdata by lpz 20210731
/dev/block/platform/ff0f0000.dwmmc/by-name/userdata /data f2fs noatime,nodiratime,nosuid,nodev,discard,inline_xattr wait,check,notrim,encryptable=/metadata/key_file
#/dev/block/platform/ff0f0000.dwmmc/by-name/userdata /data ext4 noatime,nodiratime,nosuid,nodev,barrier=1,noauto_da_alloc,data=ordered wait,check,formattable,encryptable=/metadata/key_file,quota
/dev/block/platform/ff0f0000.dwmmc/by-name/userdata /data ext4 noatime,nodiratime,nosuid,nodev,noauto_da_alloc,discard,errors=panic wait,check,encryptable=/metadata/key_file
diff --git a/device/rockchip/rk3288/parameter_system_2.5G.txt b/device/rockchip/rk3288/parameter_system_2.5G.txt
index 6bdaa5d..a24c6a2 100755
--- a/device/rockchip/rk3288/parameter_system_2.5G.txt
+++ b/device/rockchip/rk3288/parameter_system_2.5G.txt
@@ -7,4 +7,4 @@ ATAG: 0x60000800
MACHINE: 3288
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
-CMDLINE: console=ttyFIQ0 androidboot.baseband=N/A androidboot.selinux=permissive androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00002000@0x00006000(misc),0x00008000@0x00008000(resource),0x0000C000@0x00010000(kernel),0x00010000@0x0001C000(boot),0x00010000@0x0002C000(recovery),0x00038000@0x0003C000(backup),0x00040000@0x00074000(cache),0x00500000@0x000B4000(system),0x00008000@0x005B4000(metadata),0x00080000@0x005BC000(vendor0),0x00080000@0x0063C000(vendor1),-@0x006BC000(userdata)
+CMDLINE: console=ttyFIQ0 androidboot.baseband=N/A androidboot.selinux=permissive androidboot.hardware=rk30board androidboot.console=ttyFIQ0 init=/init initrd=0x62000000,0x00800000 mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00002000@0x00006000(misc),0x00008000@0x00008000(resource),0x0000C000@0x00010000(kernel),0x00010000@0x0001C000(boot),0x00010000@0x0002C000(recovery),0x00038000@0x0003C000(backup),0x00040000@0x00074000(cache),0x00500000@0x000B4000(system),0x00008000@0x005B4000(metadata),0x00080000@0x005BC000(vendor0),0x00080000@0x0063C000(vendor1),0x00040000@0x006BC000(bkdata),-@0x006FC000(userdata)
diff --git a/device/rockchip/rk3288/recovery.emmc.fstab b/device/rockchip/rk3288/recovery.emmc.fstab
index a8df7f7..b85e392 100755
--- a/device/rockchip/rk3288/recovery.emmc.fstab
+++ b/device/rockchip/rk3288/recovery.emmc.fstab
@@ -5,6 +5,9 @@
/dev/block/platform/ff0f0000.dwmmc/by-name/system /system ext4 defaults defaults
/dev/block/platform/ff0f0000.dwmmc/by-name/cache /cache ext4 defaults defaults
/dev/block/platform/ff0f0000.dwmmc/by-name/metadata /metadata ext4 defaults defaults
+# start add /bkdata by lpz 20210731
+/dev/block/platform/ff0f0000.dwmmc/by-name/bkdata /bkdata ext4 defaults defaults
+# end add /bkdata by lpz 20210731
/dev/block/platform/ff0f0000.dwmmc/by-name/userdata /data ext4 defaults defaults
/dev/block/platform/ff0f0000.dwmmc/by-name/cust /cust ext4 defaults defaults
/dev/block/platform/ff0f0000.dwmmc/by-name/custom /custom ext4 defaults defaults