EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 飞凌嵌入式 于 2024-4-29 09:58 编辑 % v- t" c. a, N ?
% o/ K4 h9 v5 O/ d' g, T
在传统印象中,Linux上的镜像替换方式相对单一,无法像Android那样实现OTA升级。然而,我们通过RAUC的工具就可以实现类似安卓OTA的系统升级功能。RAUC为Linux系统提供了灵活而强大的方式,可升级系统内核、文件系统和应用。接下来,将以飞凌嵌入式OKMX8MP-C开发板为例,基于Linux 5.4.70版本内核,展示升级前后的切换效果。 / \, z( |5 g7 J: d* |
切换前,系统启动读取系统的boot.0和rootfs.0分区:
/ v/ Z0 R1 q8 _+ J9 [$ w
切换后,让uboot引导系统从boot.1和rootfs.1进行启动: Linux-OTA的实现方法是很简单的,本篇文章小编将展示在飞凌嵌入式OKMX8MP-C开发板上实现OTA的详细步骤。 一、环境搭建1. 下载虚拟机22.04镜像 RAUC需要使用1.6版本,首先下载虚拟机 22.04的iso镜像,下载网址: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/22.04/
9 ~" {* t. I* P+ ~
2. 修改虚拟机 GCC版本 (1) 修改apt源 forlinx@ubuntu:~$ sudo gedit /etc/apt/source.list (2) 在文件最后添加源 (3) 更新源 forlinx@ubuntu:~$ sudo apt update (4) 安装GCC forlinx@ubuntu:~$ sudo apt install gcc-7 g++-7 (5) 备份原来的GCC和G++ forlinx@ubuntu:~$ sudo mv /usr/bin/gcc /usr/bin/gcc.bak forlinx@ubuntu:~$ sudo mv /usr/bin/g++ /usr/bin/g++.bak (6) 链接到gcc-7 forlinx@ubuntu:~$ sudo ln -s /usr/bin/gcc-7 /usr/bin/gcc forlinx@ubuntu:~$ sudo ln -s /usr/bin/g++-7 /usr/bin/g++ (7) 安装完成后测试 forlinx@ubuntu:~$ gcc --version forlinx@ubuntu:~$ g++ --version GCC测试运行结果 G++测试运行结果 3. 安装RAUC工具 forlinx@ubuntu:~$ sudo apt install rauc
/ N' H3 R& x- s) w. I n+ D# i. C
E) \0 a' s# g! S5 t* k' B [) v* X" g j! P
二、源码配置1. eMMC分区 需要修改源码中的:OK8MP-linux-fs/rootfs/etc/init.d/Init.sh - #! /bin/sh: ` n* N/ P5 j
- ## add forlinx user
( a' X! B* L: a' \! e' Z - useradd-k /etc/skel -m -U forlinx -s /bin/bash
/ f0 p# \# ]4 c8 r - passwd forlinx <<EOM1 O# m6 \- M; {
- forlinx
. g- S* j! O- s4 L0 T- b/ y - forlinx7 e* Z1 ^# D* F/ X, V) k& B2 C: b
- EOM; P3 ~1 V. z3 O @. F; W6 u' J
- DEVICE="/dev/mmcblk2"5 j0 q2 u. h" k K$ D. W9 E
- # 创建分区3 K& |1 [5 W: a
- fdisk $DEVICE <<EOF
' b! m- w4 w8 P% ^, t( G! u! x! E; K# S - n
; I4 O6 y K, b- h - p
, L. ~; h4 p& ?# X+ k; ~7 u4 _ - 39 q- K+ |, k ?0 Z0 D: c" F; u6 ?/ s
- 13818240
8 j) V f8 {5 K w - 13988608. L1 ?. a: e% I* @4 I+ z# k
- t
& L/ a+ ^2 r6 n# ]' `! z% u6 o* j2 R8 k - 3
+ Q9 x3 }% z4 S2 { - c
' v4 {9 B! o% V; r8 a6 E3 { - n4 e! o" @# V2 j. H
- p# a. k2 d* g; c9 g& |; L# J
- 4 r4 p8 P" ]" V8 x, c
- 13988609
F7 [& Z1 V# n+ L4 b; q. s - 30589000
! ~9 y) \- ?0 P0 Z1 J - w
; v* ]/ G ]; x6 `4 [/ V - EOF
) V0 L% Y( q% g+ I+ A - # 刷新分区表" [6 N0 j( g* o/ N" \. \. ^2 I
- partprobe. ~+ A' [) }! L( o- Q! G
- # 输出分区信息
6 ?. t8 j0 u) t$ |( U6 x - lsblk $DEVICE
) ~+ t0 a& z) L I3 t - resize2fs /dev/mmcblk2p2% W6 _ n9 W" F( B: U' ]2 m
- /usr/bin/fltest_runRefreshMatrix.sh6 M+ m# K& w5 A) h- N8 g
- ## delete Init.sh) @5 u" V; F8 W
- sed-i "s/\/etc\/init.d\/Init.sh//g" /etc/rc.local$ l; M& N3 J" `$ r+ \6 c
- rm-f /etc/init.d/Init.sh
9 _( P, b/ ~7 ?) { - sync
9 M( f' u1 T% i; o- ^' x5 o" C
复制代码
1 ?# a: @4 C/ s& N
2. RAUC及依赖工具解压 (1) liblz4.tar.bz2在OK8MP-linux-fs/rootfs/usr/lib目录下解压 forlinx@ubuntu:~/OK8MP-linux-sdk/OK8MP-linux-fs/rootfs/usr/lib$ tar -xvf liblz4.tar.bz2 (2) fw_setenv.tar.b z2在OK8MP-linux-fs/rootfs/目录下解压 forlinx@ubuntu:~/OK8MP-linux-sdk/OK8MP-linux-fs/rootfs$ tar -xvf fw_setenv.tar.bz2 (3) unsquashfs.tar.bz2在OK8MP-linux-fs/rootfs/目录下解压 forlinx@ubuntu:~/OK8MP-linux-sdk/OK8MP-linux-fs/rootfs$ tar -xvf unsquashfs.tar.bz2 (4) yocto-rauc-1.5.1.tar.bz2在OK8MP-linux-fs/rootfs/目录下解压 forlinx@ubuntu:~/OK8MP-linux-sdk/OK8MP-linux-fs/rootfs$ tar -xvf yocto-rauc-1.5.1.tar.bz2
6 [' z6 S8 Z, T4 B& ^1 S5 G
3. 修改工具配置 (1) 修改fw_env.config指定env基地址 forlinx@ubuntu:~/OK8MP-linux-sdk/OK8MP-linux-fs/rootfs/etc$ gedit fw_env.config 删除原有内容只添加: /dev/mmcblk2 0x400000 0x2000 (2) 修改RAUC配置文件 forlinx@ubuntu:~/OK8MP-linux-sdk/OK8MP-linux-fs/rootfs/etc/rauc$ gedit system.conf 注意:需要保证compatible和升级包内一致,分区内容正确。 (3) 修改编译脚本 forlinx@ubuntu:~/OK8MP-linux-sdk$ gedit tools/fakeroot.fs 需要注掉脚本的该部分 (4) 修改挂载配置文件 forlinx@ubuntu:~/OK8MP-linux-sdk/OK8MP-linux-fs/rootfs/etc$ gedit fstab 修改OK8MP-linux-fs/rootfs/etc/fstab文件如下 /dev/mmcblk2p3 /run/media/mmcblk2p3 auto defaults,sync,noauto 0 0 /dev/mmcblk2p4 /run/media/mmcblk2p4 auto defaults,sync,noauto 0 0 注:在这里主要是防止服务自动挂载分区导致升级时报分区已经挂载问题。 1 A) ^1 \0 Y; a" |$ Q0 |1 L
三、生成升级包1. 全编译获取所需镜像 forlinx@ubuntu:~/OK8MP-linux-sdk$ . /opt/fsl-imx-xwayland/5.4-zeus/environment-setup-aarch64-poky-linux forlinx@ubuntu:~/OK8MP-linux-sdk$ . environment-setup-aarch64-poky-linux forlinx@ubuntu:~/OK8MP-linux-sdk$ ./build.sh all
* R" x1 x# V& O5 y9 U
2. 拷贝镜像以及密钥文件 (1) 创建rauc文件夹 forlinx@ubuntu:~$ mkdir rauc (2) 在rauc文件夹下创建build和bundle文件夹 forlinx@ubuntu:~/rauc$ mkdir build forlinx@ubuntu:~/rauc$ mkdir bundle (3) 将images下编译生成的boot.img和rootfs.ext4拷贝到bundle的文件夹 (4) 将提供测试的密钥文件解压到rauc文件夹下 forlinx@ubuntu:~/rauc$ tar -xvf key.tar.bz2 , U. i" k; c$ W3 B0 ]* B
3. 创建升级包配置文件 在bundle文件夹下创建manifest.raucm升级包配置文件 forlinx@ubuntu:~/rauc/bundle$ geidt manifest.raucm 内容如下: - [update]
& s! S" U7 ~! E* g- J. C1 v - compatible=forlinx-imx8mp
' K( `4 O: n" N, N - version=r0
3 C( n: i' \ b. g' ~ r8 U" j* g - description=rauc bundle based on Forlinx-LINUX-5.4.70
: A, r9 f0 g9 j @# W9 t - build=202403068 d( B; U5 ]0 H" `
- [image.rootfs]
2 j0 [+ D# G5 D0 X0 G) J& p3 z2 i - filename=rootfs.ext4/ M2 u/ W/ k6 G' R; s2 [
- [image.boot]
* W' y5 J. A) w - filename=boot.img
复制代码 " y5 D; \8 m$ N" s; j/ f6 M
) X0 i5 y% w6 C5 R9 D
4. 制作升级包 (1) 创建打包脚本 forlinx@ubuntu:~/rauc$ gedit run.do_bundle.sh 脚本内容如下: - #!/bin/sh
$ o7 x5 h1 t3 w" L* W" G8 Q8 ` - if[ -e build/bundle.raucb ]; then
" { ]2 Y7 o( |+ _8 ?5 b3 W( Q - rm build/bundle.raucb; G8 i( p' f: A d3 _4 G! \$ ^
- echo "---------------------rm old bundle.raucb-------------------------"6 t0 Z3 K6 F# e+ c
- fi& \% R' C; X" P; H* i2 [ D
- rauc bundle --debug --cert="development-1.cert.pem"--key="development-1.key.pem" bundle$ B- z5 E# p1 x2 x+ [
- build/bundle.raucb
复制代码 X! p- P6 R' I2 E2 [8 u
(2) 赋予脚本权限 forlinx@ubuntu:~/rauc$ chmod 777 run.do_bundle.sh (3) 生成升级包 forlinx@ubuntu:~/rauc$ ./run.do_bundle.sh 会在build文件夹下生成bundle.raucb升级包 ; W9 [: p- g! \ U3 ~4 R j
$ {4 W! q/ ]- Q5 h& U. x" D8 R
1 ]1 [' x/ w4 W5 I6 Q
四、系统升级1. 把bundle.raucb升级包传到OKMX8MP-C开发板ext4分区内,以防有权限问题。
( g: l1 a; d5 t+ k* w
2. 查看系统状态和升级 root@OK8MP:~# rauc info bundle.raucb (1)查看压缩包信息 (2)查看系统状态 root@OK8MP:~# rauc status (3)系统升级 root@OK8MP:~# rauc install bundle.raucb - A0 q9 L4 v+ T5 L
3. 切换启动分区 查看uboot环境变量 root@OK8MP:~# fw_printenv 配置从systme_1进行启动 root@OK8MP:~# fw_setenv doraucboot 1 root@OK8MP:~# sync root@OK8MP:~# reboot 重新启动后查看系统状态 root@OK8MP:~# rauc status
* r C+ \. J4 l% \& d3 p, ^/ o2 t/ [五、回退版本重新配置为system_0启动 root@OK8MP:~# fw_setenv doraucboot 0 root@OK8MP:~# fw_printenv //打印环境变量 root@OK8MP:~# sync RAUC升级为两个系统交替替换,升级时一定要注意目前uboot引导的分区。 + b4 G. R. t V' `
以上就是OKMX8MP-C开发板上实现OTA的详细步骤,希望能够对各位工程师朋友有所帮助。 . l; M9 T5 }' Z+ [9 E
$ N) V: q* W$ T# m" ^! R9 y |