关于RK312X机顶盒databk克隆失败的解决办法

最近编译RK312X机顶盒的4.4系统,编译打包都比较顺利,但是在备份data分区的时候出现了问题。

错误1:
clone_data_if_exist->can’t find databk cmdline
最后发现是启动命令参数里面没有databk这个分区,解决方法:
修改rockdev/rk312x.parameter.txt,在分区参数里面加上databk分区,修改后如下:

FIRMWARE_VER:5.1.1
MACHINE_MODEL:rk312x
MACHINE_ID:007
MANUFACTURER:RK30SDK
MAGIC: 0x5041524B
ATAG: 0x60000800
MACHINE: 312x
CHECK_MASK: 0x80
KERNEL_IMG: 0x60408000
#RECOVER_KEY: 1,1,0,20,0
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(misc),0x00008000@0x00006000(resource),0x00006000@0x0000E000(kernel),0x00006000@0x00014000(boot),0x00010000@0x0001A000(recovery),0x00020000@0x0002A000(backup),0x00040000@0x0004A000(cache),0x001FE000@0x0008A000(userdata),0x00040000@0x00288000(databk),0x00008000@0x002C8000(metadata),0x00002000@0x002D0000(kpanic),0x00200000@0x002D2000(system),0x00020000@0x004D2000(radical_update),-@0x004F2000(user)

注:@前面的十六进制数表示分区大小,单位为sector(1 sector=512 byte);后面的十六进制数表示分区起始位置。

错误2:
null of databk ->failed to clone
追踪错误日志发现发生错误的地方在recovery.cpp里面,最后锁定到以下函数:

int start_to_clone(const char *data_devname, const char *databk_devname) {

    if(simg2img(databk_devname, data_devname)){
        LOGE("null of databk ->failed to clone\n");
        return -1;
    }
    LOGI("Cloning %s to %s\n", databk_devname, data_devname);
    return 0;
}

通过在isimg2img()函数中打印日志发现错误的根源是databk.img这个备份镜像文件打开失败。开始怀疑是备份databk.img的过程中出了问题,通过修改分区大小、备份文件大小等各种尝试后依然打开失败,于是问题锁定在databk.img的路径上,问题就出在clone_data_if_exist()这个函数中:

static int clone_data_if_exist() {
    int loop_counts;
    int databk_size, data_partition_size;
    char data_devname[64];
    char databk_devname[64];

    // Get partitions info
    char buf[2048];
    int fd = open("/proc/cmdline", O_RDONLY);

    int nbytes = read(fd, buf, sizeof(buf) - 1);
    close(fd);
    buf[nbytes] = '\0';

    char cmd[2048];
    char mtd[2048];
    int cmdline = mtd_scan_cmdline(cmd, mtd, 2048);
    LOGE("cmdline=%d\n", cmdline);
    LOGE("cmd = %s\n", cmd);
    LOGE("mtd = %s\n", mtd);


    if (cmdline <= 0) {
        LOGE("clone_data_if_exist->error scanning cmdline\n");
        return -1;
    }

    const MtdPartitionbyCmdline *databk_partition = mtd_find_partition_by_cmdline(DATABK_PARTITION_NAME);
    if (databk_partition == NULL) {
        LOGE("clone_data_if_exist->can't find %s cmdline\n", DATABK_PARTITION_NAME);
        return -1;
    }

    const MtdPartitionbyCmdline *data_partition = mtd_find_partition_by_cmdline(DATA_PARTITION_NAME);
    if (data_partition == NULL) {
        LOGE("clone_data_if_exist->can't find %s cmdline\n", DATA_PARTITION_NAME);
        return -1;
    }

    sprintf(data_devname, "/dev/block/mmcblk0p%d", data_partition->device_index);
    sprintf(databk_devname, "/dev/block/mmcblk0p%d", databk_partition->device_index);

    // Start to clone
    if (start_to_clone(data_devname, databk_devname)) {
        LOGE("clone_data_if_exist->error clone data\n");
        return -1;
    }

    return 0;
}

此函数将databk_devname赋值为“/dev/block/mmcblk0p%d”,但是adb shell进入/dev/block/执行ls发现分区名称并不是mmcblk0p%d,

root@rk312x:/dev/block # ll
brw------- root     root       7,   0 1970-01-01 00:00 loop0
brw------- root     root       7,   1 1970-01-01 00:00 loop1
brw------- root     root       7,   2 1970-01-01 00:00 loop2
brw------- root     root       7,   3 1970-01-01 00:00 loop3
brw------- root     root       7,   4 1970-01-01 00:00 loop4
brw------- root     root       7,   5 1970-01-01 00:00 loop5
brw------- root     root       7,   6 1970-01-01 00:00 loop6
brw------- root     root       7,   7 1970-01-01 00:00 loop7
brw------- root     root      31,   6 1970-01-01 00:00 rknand_backup
brw------- root     root      31,   4 1970-01-01 00:00 rknand_boot
brw------- root     root      31,   7 1970-01-01 00:00 rknand_cache
brw------- root     root      31,   9 1970-01-01 00:00 rknand_databk
brw------- root     root      31,   3 1970-01-01 00:00 rknand_kernel
brw------- root     root      31,  11 1970-01-01 00:00 rknand_kpanic
brw------- root     root      31,  10 1970-01-01 00:00 rknand_metadata
brw------- root     root      31,   1 1970-01-01 00:00 rknand_misc
brw------- root     root      31,  13 1970-01-01 00:00 rknand_radical_update
brw------- root     root      31,   5 1970-01-01 00:00 rknand_recovery
brw------- root     root      31,   2 1970-01-01 00:00 rknand_resource
brw------- root     root      31,  12 1970-01-01 00:00 rknand_system
brw------- root     root      31,   0 1970-01-01 00:00 rknand_uboot
brw------- root     root      31,  14 1970-01-01 00:00 rknand_user
brw------- root     root      31,   8 1970-01-01 00:00 rknand_userdata
drwx------ root     root              1970-01-01 00:00 vold
brw------- root     root     253,   0 1970-01-01 00:00 zram0

将此函数做如下修改后一切正常:

static int clone_data_if_exist() {
    int loop_counts;
    int databk_size, data_partition_size;
    char data_devname[64];
    char databk_devname[64];

    // Get partitions info
    char buf[2048];
    int fd = open("/proc/cmdline", O_RDONLY);

    int nbytes = read(fd, buf, sizeof(buf) - 1);
    close(fd);
    buf[nbytes] = '\0';

    char cmd[2048];
    char mtd[2048];
    int cmdline = mtd_scan_cmdline(cmd, mtd, 2048);
    LOGE("cmdline=%d\n", cmdline);
    LOGE("cmd = %s\n", cmd);
    LOGE("mtd = %s\n", mtd);


    if (cmdline <= 0) {
        LOGE("clone_data_if_exist->error scanning cmdline\n");
        return -1;
    }

    const MtdPartitionbyCmdline *databk_partition = mtd_find_partition_by_cmdline(DATABK_PARTITION_NAME);
    if (databk_partition == NULL) {
        LOGE("clone_data_if_exist->can't find %s cmdline\n", DATABK_PARTITION_NAME);
        return -1;
    }

    const MtdPartitionbyCmdline *data_partition = mtd_find_partition_by_cmdline(DATA_PARTITION_NAME);
    if (data_partition == NULL) {
        LOGE("clone_data_if_exist->can't find %s cmdline\n", DATA_PARTITION_NAME);
        return -1;
    }

    data_devname = "/dev/block/rknand_userdata";
    databk_devname = "/dev/block/rknand_databk";

    // Start to clone
    if (start_to_clone(data_devname, databk_devname)) {
        LOGE("clone_data_if_exist->error clone data\n");
        return -1;
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值