RK3328量产刻录完整镜像

RK3328量产刻录完整镜像

 


 

目录

RK3328量产刻录完整镜像

前言

1. 先把默认的Android系统烧写成Ubuntu18.04系统

2.开机初始配置

3.部署生产环境

4.制作根文件系统镜像

5.制作完整统一镜像

总结


前言

前期各种蹚雷实验,最终完成了ROC-RK3328-PC(极客 Station M1)设备基于Ubuntu18.04完整环境的镜像制作.
本文适用于: 在开发板上运行了适合生产环境的各种服务,需要把当前开发板上的整体环境克隆到其他待烧录的开发板,免于每个开发板都要手动部署环境和代码.


 

1. 先把默认的Android系统烧写成Ubuntu18.04系统

(1) 下载最新的Ubuntu18.04(GPT)
找到官网首页[资料下载]中的ROC-RK3328-PC的固件中的Ubuntu18.04(GPT),点击下载
链接: https://www.t-firefly.com/doc/download/71.html
下载: ROC-RK3328-PC-UBUNTU18.04-GPT-20200630-1405.img.7z
(2) 解压7z文件,得到官方原始镜像ROC-RK3328-PC-UBUNTU18.04-GPT-20200630-1405.img
apt-get install p7zip-full
7z x ROC-RK3328-PC-UBUNTU18.04-GPT-20200630-1405.img.7z
tree
显示:
.
├── pack
│   ├── Linux_Upgrade_Tool
│   │   ├── config.ini
│   │   ├── Linux开发工具使用手册_v1.32.pdf
│   │   ├── Readme.txt
│   │   └── upgrade_tool
│   └── ROC-RK3328-PC-UBUNTU18.04-GPT-20200630-1405.img
└── ROC-RK3328-PC-UBUNTU18.04-GPT-20200630-1405.img.7z
(3) 为了方便使用,修改原始镜像的名字为: r.img
cd pack 
mv ROC-RK3328-PC-UBUNTU18.04-GPT-20200630-1405.img r.img
(4) 烧录原始统一镜像
方式1: 使用上面镜像压缩包中的Linux_Upgrade_Tool,进行烧写
    a. cd pack/Linux_Upgrade_Tool
    b. mv ../r.img ./
    c. rk3328插入AV口(RECOVERY按键在里面),一直长按RECOVERY键, 使用电源线的USB连接到电脑上
    d. sudo ./upgrade_tool
        找到一个设备, 输入1
        Program Data in /home/xxx/.config/upgrade_tool
        List of rockusb connected
        DevNo=1    Vid=xxx,Pid=xxx,LocationID=xxx    Mode=Loader    SerialNo=xxx
        Found 1 rockusb,Select input DevNo,Rescan press <R>,Quit press <Q>:1
        显示:
        ---------------------Tool Usage ---------------------
        Help:             H
        Quit:             Q
        Version:          V
        Clear Screen:     CS
        ------------------Upgrade Command ------------------
        ChooseDevice:        CD
        ListDevice:            LD
        SwitchDevice:        SD
        UpgradeFirmware:    UF <Firmware> [-noreset]
        UpgradeLoader:        UL <Loader> [-noreset]
        DownloadImage:        DI <-p|-b|-k|-s|-r|-m|-u|-t|-re image>
        DownloadBoot:        DB <Loader>
        EraseFlash:        EF <Loader|firmware> [DirectLBA]
        PartitionList:        PL
        ----------------Professional Command -----------------
        TestDevice:        TD
        ResetDevice:        RD [subcode]
        ResetPipe:        RP [pipe]
        ReadCapability:        RCB
        ReadFlashID:        RID
        ReadFlashInfo:        RFI
        ReadChipInfo:        RCI
        ReadSector:        RS  <BeginSec> <SectorLen> [-decode] [File]
        WriteSector:        WS  <BeginSec> <File>
        ReadLBA:        RL  <BeginSec> <SectorLen> [File]
        WriteLBA:        WL  <BeginSec> <File>
        EraseLBA:        EL  <BeginSec> <EraseCount> 
        EraseBlock:        EB <CS> <BeginBlock> <BlokcLen> [--Force]
        -------------------------------------------------------
    e. 烧写镜像, 等待完成
        uf r.img
        显示:
        Rockusb>uf r.img
        Loading firmware...
        Support Type:RK322H    FW Ver:8.1.276    FW Time:2020-06-30 14:05:48
        Loader ver:2.50    Loader Time:2020-06-30 11:48:03
        Upgrade firmware ok.
方式2: 使用Windows系统,借助AndroidTool烧写统一镜像
    a. 下载官网的AndroidTool和RK驱动助手
        注意: 下面是官方的推荐, 这里说明下,使用AndroidTool_v2.58, 如果自己之后重新打统一镜像后,升级时会出现rootfs分区不够存储镜像的问题,这里推荐使用AndroidTool_v2.71
        烧录工具下载
        Windows下:
            Linux 或者 Android8.1 系统 AndroidTool_v2.58
            Android7.1 系统 AndroidTool_v2.38
            Android10 系统 AndroidTool_v2.71
        Linux下:
            Linux 系统或者 Android8.1 系统 Upgrade_Tool_v1.34
            Android7.1 系统 Upgrade_Tool_v1.24
            Android10 系统 Upgrade_Tool_v1.49
        链接: https://www.t-firefly.com/doc/download/page/id/71.html        
    b. 安装RK驱动助手和AndroidTool后, 使用电源线通过USB连接到Windows电脑
       打开[AndroidTool], 等待显示: 发现一个ADB设备, 点击菜单中[下载镜像]的[切换]按钮
       显示变成: 发现一个LOADER设备
    c. 选择升级固件: 点击[升级固件], 选择[固件]按钮,双击,选择上面Linux系统的r.img拷贝到windows电脑目录中的r.img
       等待一会,不报错,会显示:
        固件版本8.1.276 Loader版本: 2.50 芯片信息:RK322H
        固件: D:\r_img\r.img      # 自己电脑的官方原始固件位置
    d. 可以点击: [升级固件]页面的[升级]按钮了
    会显示:升级信息
        测试设备开始
        测试设备成功
        校验芯片开始
        校验芯片成功
        获取FlashInfo开始
        获取FlashInfo成功
        准备IDB开始
        准备IDB成功
        下载IDB开始
        下载IDB成功
        下载固件开始
        正在下载固件(100%)
        下载固件成功
        重启设备开始
        重启设备成功

2.开机初始配置

   通过type-c数据线连接显示屏,插入网线,鼠标,键盘,和电源线, 开机进行初始的网络配置和ssh配置
   通过电脑右上侧的网络配置图形页面,配置ip,子网掩码,网关,DNS
   修改sshd服务器:
   sudo vi /etc/ssh/sshd_config
   修改为: PermitRootLogin yes
   sudo /etc/init.d/ssh restart  # 重启ssh
   之后通过ssh可以连接rk3328设备了, 之后修改ip可以通过ubuntu18.04系统支持的/etc/netplan, 此处不做详细说明

3.部署生产环境

   ssh连接rk3328,部署生产环境
   部署完成后,可以考虑刻录完整镜像了,用于生产

4.制作根文件系统镜像

说明: 本文采取的打包完整统一镜像的方式为: 使用原厂的原始镜像解包, 替换rootfs.img文件系统, 再使用AndroidTool工具进行打包和烧录

(1). 导出开发板文件系统(参考AIO-3288C的官网资料)
    a. sudo apt-get install -y ssh rsync
    b. 在PC机中同步开发板的文件系统,请先将开发板和 PC 机置于同一局域网内。(假设开发板地址为 192.168.9.179)
        mkdir rootfs
        sudo rsync -avx root@192.168.9.179:/ ./rootfs
    c. 此时,rootfs 目录中保存的就是开发板文件系统中的所有文件,可以开始制作根文件系统镜像:
        dd if=/dev/zero of=rootfs.img bs=1M count=4000
        # count大小为了节省空间同时保证可以放下整个系统, 可以在开发板上使用df -h, 我这里为: /root-ro 和 /userdata的大小之和, 即: rootfs+userdata的大小,这个会被制成新的文件系统, 2.6G+1.4G, 同时: du -sh ./rootfs  显示: 3.7G    rootfs, 可以使用4000
        mkfs.ext4 rootfs.img
        mkdir temp && sudo mount rootfs.img ./temp
        sudo cp -rfp rootfs/*  temp/
        sudo umount temp/
        e2fsck -p -f rootfs.img
        resize2fs  -M rootfs.img
    d. 查看大小:
       du -sh rootfs.img    # 3.8G    ./rootfs.img
       ls -al rootfs.img    # 4194304000 4月  30 16:31 rootfs.img

5.制作完整统一镜像

(1). AndroidTool解包原始固件r.img
    a. 选择[高级功能]中的[解包]按钮前面的[...]按钮, 选中原始固件D:\r_img\r.img, 再点击[解包]
    b. 等待片刻, 在AndroidTool_Release_v2.71\Output目录下会生成统一镜像r.img的解包镜像:
        包括: boot.bin, firmware.img, Android目录
        实际是引导程序bootloader和使用AFPTool打包各个分区镜像生成的firmware.img
        Android目录实际是firmware.img通过AFPTool解包生成的各个分区镜像,我们主要使用这个目录
(2). 用导出的开发板文件系统rootfs.img 替换 Output\Android\Image下的原始rootfs.img
(3). 同时要修改分区信息表文件parameter.txt中的rootfs分区的大小和userdata分区的起始位置
parameter.txt内容:
FIRMWARE_VER: 8.1
MACHINE_MODEL: RK3328
MACHINE_ID: 007
MANUFACTURER: RK3328
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3328
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00010000@0x0000a000(boot),0x00010000@0x0001a000(recovery),0x00010000@0x0002a000(backup),0x588400@0x0005a000(rootfs),-@0x5e2400(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9

例如: 0x588400@0x0005a000(rootfs) 扇区大小@起始位置(分区名)
      每个扇区512字节,  像我上面rootfs.img大小: 4194304000, 扇区大小: 4194304000/512=8192000 转16进制: 0x7d0000
      如果以0x7d0000修改上面的parameter.txt, 则: 0x7d0000@0x0005a000(rootfs),-@0x82a000(userdata:grow)
      但是这种很容易在打包镜像完成后,烧写镜像升级时,出现rootfs分区不够存放镜像,
      官方在处理这个大小时加上了大约50M大小,在重新计算这个这个扇区数量
      可以使用官方的linux打包和解包工具,自动根据rootfs.img的大小,自动修改parameter.txt
      下载链接: https://www.t-firefly.com/doc/download/53.html 
      # ROC-RK3399-PC中的解合包工具(Linux), firefly-rk3399-linux-repack.tgz
      cd firefly-rk3399-linux-repack
      tree:
        .
        ├── bin/
        │   ├── afptool*
        │   └── rkImageMaker*
        ├── output/
        │   ├── Image/
        │   │   ├── boot.img
        │   │   ├── MiniLoaderAll.bin
        │   │   ├── misc.img
        │   │   ├── parameter.txt
        │   │   ├── recovery.img
        │   │   ├── rootfs.img
        │   │   ├── trust.img
        │   │   └── uboot.img
        │   └── package-file
        ├── pack.sh*
        ├── Readme.md
        └── unpack.sh*
        查看Readme.md, 通过unpack.sh和pack.sh打包和解包,需要在ubuntu18下运行有效,同时安装32位系统支持, afptool和rkImageMaker是32位系统的可执行程序
        我这里ubuntu16下只通过pack.sh自动修改parameter.txt,afptool报错不用管.
(4) 拷贝pack.sh自动修改后的parameter.txt到windows电脑,替换掉 AndroidTool_Release_v2.71\Output\Android\Image\parameter.txt
parameter.txt修改后的内容:
FIRMWARE_VER: 8.1
MACHINE_MODEL: RK3328
MACHINE_ID: 007
MANUFACTURER: RK3328
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 3328
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00010000@0x0000a000(boot),0x00010000@0x0001a000(recovery),0x00010000@0x0002a000(backup),0x7e9200@0x0005a000(rootfs),-@0x843200(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
(5) 打包镜像
Windows下:
cd D:\AndroidTool_Release_v2.71\bin
D:
AFPTool.exe -pack D:\AndroidTool_Release_v2.71\Output\Android  update.img
RKImageMaker.exe -RK322H D:\AndroidTool_Release_v2.71\Output\boot.bin update.img update_new.img -os_type:androidos
在D:\AndroidTool_Release_v2.71\bin下生成update_new.img, 此为最新的统一完整固件,可以直接使用AndroidTool工具重新烧写镜像,完成开发板到其他开发板的环境备份.


总结

特别说明: 之前我使用官网推荐的AndroidTool_Release_v2.58进行固件的打包和烧写,会出现使用上面这个好的parameter.txt也会出现rootfs分区不够存储镜像的问题,有些坑人!

特别提示: 在完成上面的根文件系统制作,统一镜像的打包后,烧写统一镜像update_new.img, 设备启动后redis和postgresql无法启动,其余正常!

经过测试验证, 经过挖坑填坑, 发现问题出现在redis和postgresql的用户权限管理出现问题, 查看redis和postgresql的相关文件,发现其文件所有者和文件所在组的名称,都变成了用户标识号的UID和GID, 如下:
    root@firefly:/# ls /etc/postgresql/10/main/ -al
    total 60
    drwxr-xr-x 3 124 132  4096 4月  23 17:32 .
    drwxr-xr-x 3 124 132  4096 4月  23 17:29 ..
    drwxr-xr-x 2 124 132  4096 4月  23 17:29 conf.d
    -rw-r--r-- 1 124 132   315 4月  23 17:29 environment
    -rw-r--r-- 1 124 132   143 4月  23 17:29 pg_ctl.conf
    -rw-r----- 1 124 132  4681 4月  23 17:32 pg_hba.conf
    -rw-r----- 1 124 132  1636 4月  23 17:29 pg_ident.conf
    -rw-r--r-- 1 124 132 23137 4月  30 16:12 postgresql.conf
    -rw-r--r-- 1 124 132   317 4月  23 17:29 start.conf
正常的显示为: 
    drwxr-xr-x 3 postgres postgres  4096 4月  23 17:32 .
    drwxr-xr-x 3 postgres postgres  4096 4月  23 17:29 ..
    drwxr-xr-x 2 postgres postgres  4096 4月  23 17:29 conf.d
    -rw-r--r-- 1 postgres postgres   315 4月  23 17:29 environment
    -rw-r--r-- 1 postgres postgres   143 4月  23 17:29 pg_ctl.conf
    -rw-r----- 1 postgres postgres  4681 4月  23 17:32 pg_hba.conf
    -rw-r----- 1 postgres postgres  1636 4月  23 17:29 pg_ident.conf
    -rw-r--r-- 1 postgres postgres 23137 4月  30 16:12 postgresql.conf
    -rw-r--r-- 1 postgres postgres   317 4月  23 17:29 start.conf 
并且: /etc/passwd的用户管理中postgres的UID和GID, 和上面错误的显示124 132, 并不相符
firefly:x:1000:1000:firefly,,,:/home/firefly:/bin/bash
postgres:x:116:123:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash
redis:x:117:124::/var/lib/redis:/usr/sbin/nologin
后来发现自己做文件系统镜像的PC主机的postgres的UID和GID,正好是: 124:132
redis:x:123:131::/var/lib/redis:/bin/false
postgres:x:124:132:PostgreSQL administrator,,,:/var/lib/postgresql:/bin/bash

所有最后: 制作了2台环境基本相同的rk3328开发板, 一台用于刻录备份完整镜像, 一台充当制作rootfs.img的pc主机,并且保证这两台开发板的/etc/passwd等用户管理文件的redis和postgres的UID和GID一致, 避免文件所有者和文件所在组的名称,因为找不到相同的UID和GID,变成相应的ID值,同时文件无法使用.

热门文章

暂无图片
编程学习 ·

C语言二分查找详解

二分查找是一种知名度很高的查找算法&#xff0c;在对有序数列进行查找时效率远高于传统的顺序查找。 下面这张动图对比了二者的效率差距。 二分查找的基本思想就是通过把目标数和当前数列的中间数进行比较&#xff0c;从而确定目标数是在中间数的左边还是右边&#xff0c;将查…
暂无图片
编程学习 ·

GMX 命令分类列表

建模和计算操作命令&#xff1a; 1.1 . 创建拓扑与坐标文件 gmx editconf - 编辑模拟盒子以及写入子组(subgroups) gmx protonate - 结构质子化 gmx x2top - 根据坐标生成原始拓扑文件 gmx solvate - 体系溶剂化 gmx insert-molecules - 将分子插入已有空位 gmx genconf - 增加…
暂无图片
编程学习 ·

一文高效回顾研究生课程《数值分析》重点

数值分析这门课的本质就是用离散的已知点去估计整体&#xff0c;就是由黑盒子产生的结果去估计这个黑盒子。在数学里这个黑盒子就是一个函数嘛&#xff0c;这门课会介绍许多方法去利用离散点最大化地逼近这个函数&#xff0c;甚至它的导数、积分&#xff0c;甚至微分方程的解。…
暂无图片
编程学习 ·

在职阿里5年,一个28岁女软测工程师的心声

简单的先说一下&#xff0c;坐标杭州&#xff0c;14届本科毕业&#xff0c;算上年前在阿里巴巴的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; ​ 编辑切换为居中…
暂无图片
编程学习 ·

字符串左旋c语言

目录 题目&#xff1a; 解题思路&#xff1a; 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 总代码&#xff1a; 题目&#xff1a; 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符…
暂无图片
编程学习 ·

设计模式--观察者模式笔记

模式的定义与特点 观察者&#xff08;Observer&#xff09;模式的定义&#xff1a;指多个对象间存在一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式&#xf…
暂无图片
编程学习 ·

睡觉突然身体动不了,什么是睡眠痽痪症

很多朋友可能有这样的体验&#xff0c;睡觉过程中突然意识清醒&#xff0c;身体却动弹不了。这时候感觉非常恐怖&#xff0c;希望旁边有一个人推自己一下。阳光以前也经常会碰到这样的情况&#xff0c;一年有一百多次&#xff0c;那时候很害怕晚上到来&#xff0c;睡觉了就会出…
暂无图片
编程学习 ·

深入理解C++智能指针——浅析MSVC源码

文章目录unique_ptrshared_ptr 与 weak_ptrstd::bad_weak_ptr 异常std::enable_shared_from_thisunique_ptr unique_ptr 是一个只移型别&#xff08;move-only type&#xff0c;只移型别还有std::mutex等&#xff09;。 结合一下工厂模式&#xff0c;看看其基本用法&#xff…
暂无图片
编程学习 ·

@TableField(exist = false)

TableField(exist false) //申明此字段不在数据库存在&#xff0c;但代码中需要用到它&#xff0c;通知Mybatis-plus在做写库操作是忽略它。,.
暂无图片
编程学习 ·

Java Web day15

第十二章文件上传和下载 一、如何实现文件上传 要实现Web开发中的文件上传功能&#xff0c;通常需要完成两步操作&#xff1a;一.是在Web页面中添加上传输入项&#xff1b;二是在Servlet中读取上传文件的数据&#xff0c;并保存到本地硬盘中。 需要使用一个Apache组织提供一个…
暂无图片
编程学习 ·

【51nod 2478】【单调栈】【前缀和】小b接水

小b接水题目解题思路Code51nod 2478 小b接水 题目 输入样例 12 0 1 0 2 1 0 1 3 2 1 2 1输出样例 6解题思路 可以发现最后能拦住水的都是向两边递减高度&#xff08;&#xff1f;&#xff09; 不管两个高积木之间的的积木是怎样乱七八糟的高度&#xff0c;最后能用来装水的…
暂无图片
编程学习 ·

花了大半天写了一个UVC扩展单元调试工具

基于DIRECTSHOW 实现的&#xff0c;用的是MFC VS2019. 详见&#xff1a;http://www.usbzh.com/article/detail-761.html 获取方法 加QQ群:952873936&#xff0c;然后在群文件\USB调试工具&测试软件\UVCXU-V1.0(UVC扩展单元调试工具-USB中文网官方版).exe USB中文网 USB中文…
暂无图片
编程学习 ·

贪心(一):区间问题、Huffman树

区间问题 例题一&#xff1a;区间选点 给定 N 个闭区间 [ai,bi]请你在数轴上选择尽量少的点&#xff0c;使得每个区间内至少包含一个选出的点。 输出选择的点的最小数量。 位于区间端点上的点也算作区间内。 输入格式 第一行包含整数 N&#xff0c;表示区间数。 接下来 …
暂无图片
编程学习 ·

C语言练习实例——费氏数列

目录 题目 解法 输出结果 题目 Fibonacci为1200年代的欧洲数学家&#xff0c;在他的着作中曾经提到&#xff1a;「若有一只免子每个月生一只小免子&#xff0c;一个月后小免子也开始生产。起初只有一只免子&#xff0c;一个月后就有两只免子&#xff0c;二个月后有三只免子…
暂无图片
编程学习 ·

Android开发(2): Android 资源

个人笔记整理 Android 资源 Android中的资源&#xff0c;一般分为两类&#xff1a; 系统内置资源&#xff1a;Android SDK中所提供的已经定义好的资源&#xff0c;用户可以直接拿来使用。 用户自定义资源&#xff1a;用户自己定义或引入的&#xff0c;只适用于当前应用的资源…
暂无图片
编程学习 ·

零基础如何在短时间内拿到算法offer

​算法工程师是利用算法处理事物的职业 算法&#xff08;Algorithm&#xff09;是一系列解决问题的清晰指令&#xff0c;也就是说&#xff0c;能够对一定规范的输入&#xff0c;在有限时间内获得所要求的输出。 如果一个算法有缺陷&#xff0c;或不适合于某个问题&#xff0c;执…
暂无图片
编程学习 ·

人工智能:知识图谱实战总结

人工智能python&#xff0c;NLP&#xff0c;知识图谱&#xff0c;机器学习&#xff0c;深度学习人工智能&#xff1a;知识图谱实战前言一、实体建模工具Protegepython&#xff0c;NLP&#xff0c;知识图谱&#xff0c;机器学习&#xff0c;深度学习 人工智能&#xff1a;知识图…
暂无图片
编程学习 ·

【无标题】

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…