【玩泰山派】4、制作ubuntu镜像-(5)总结制作镜像流程

文章目录

前言

完整梳理制作镜像流程

rk镜像概念

这里描述的镜像就是指最终能烧写到sd卡种的一个文件(使用Rockchip的sdk生成的update.img文件)

rk镜像构成

使用Rockchip的sdk去执行./build.sh all和./mkfirmware.sh脚本后,会在rockdev目录下生成下列文件,这些文件是构成sd卡烧录镜像的组成成分

复制代码
boot.img -> ../kernel/boot.img    # 内核
MiniLoaderAll.bin -> ../u-boot/rk356x_spl_loader_v1.13.112.bin  # Secondary Bootloader(SPL)
misc.img -> ../device/rockchip/rockimg/wipe_all-misc.img*    # misc镜像
oem.img        # 不熟悉可能和重置系统相关
parameter.txt -> ../device/rockchip/rk356x/parameter-buildroot-fit.txt # 分区配置文件
recovery.img -> ../buildroot/output/rockchip_rk356x_recovery/images/recovery.img # 不熟悉可能和重置系统相关
rootfs.ext4 -> ubuntu-xfce-rootfs.img  # 根文件系统,指向ubuntu-xfce-rootfs.img 
rootfs.img -> ubuntu-xfce-rootfs.img   # 根文件系统,指向ubuntu-xfce-rootfs.img 
uboot.img -> ../u-boot/uboot.img         # uboot
ubuntu-xfce-rootfs.img                        # 根文件系统
userdata.img										# 不熟悉,用户数据img

在 Rockchip 的启动流程中:

​BootROM​ → 2. ​MiniLoaderAll.bin (SPL)​​ → 3. ​U-Boot​ → 4. ​Kernel

生成sd卡镜像

执行./build.sh updateimg后生成名为update.img的sd卡镜像,可以使用Rockchip烧录工具烧录到sd卡中,插入泰山派sd卡卡槽中,就可以直接启动。

./build.sh updateimg执行日志如下,

复制代码
root@lckfb:/home/lckfb# ./build.sh updateimg
processing option: updateimg
Make update.img
start to make update.img...
Android Firmware Package Tool v2.0
------ PACKAGE ------
Add file: ./package-file
package-file,Add file: ./package-file done,offset=0x800,size=0x28b,userspace=0x1
Add file: ./Image/MiniLoaderAll.bin
bootloader,Add file: ./Image/MiniLoaderAll.bin done,offset=0x1000,size=0x719c0,userspace=0xe4
Add file: ./Image/parameter.txt
parameter,Add file: ./Image/parameter.txt done,offset=0x73000,size=0x1f4,userspace=0x1
Add file: ./Image/uboot.img
uboot,Add file: ./Image/uboot.img done,offset=0x73800,size=0x400000,userspace=0x800
Add file: ./Image/misc.img
misc,Add file: ./Image/misc.img done,offset=0x473800,size=0xc000,userspace=0x18
Add file: ./Image/boot.img
boot,Add file: ./Image/boot.img done,offset=0x47f800,size=0x16eea00,userspace=0x2dde
Add file: ./Image/recovery.img
recovery,Add file: ./Image/recovery.img done,offset=0x1b6e800,size=0x1e5fa00,userspace=0x3cc0
Add file: ./Image/rootfs.img
rootfs,Add file: ./Image/rootfs.img done,offset=0x39ce800,size=0xec827000,userspace=0x1d904e
Add file: ./Image/oem.img
oem,Add file: ./Image/oem.img done,offset=0xf01f5800,size=0x10a6000,userspace=0x214c
Add file: ./Image/userdata.img
userdata,Add file: ./Image/userdata.img done,offset=0xf129b800,size=0x444000,userspace=0x888
Add CRC...
Make firmware OK!
------ OK ------
********rkImageMaker ver 2.0********
Generating new image, please wait...
Writing head info...
Writing boot file...
Writing firmware...

Generating MD5 data...
MD5 data generated successfully!
New image generated successfully!
Making ./Image/update.img OK.
Running build_updateimg succeeded.

最终生成update.img文件,从日志中可以看出,update.img文件就是由其他文件组成的而已。这次我主要关注根文件系统(rootfs)的制作,可以根据自己的需求,去制作不同的根文件,其他部分可以复用。替换rootfs.ext4和rootfs.img软链到自己制作的根文件系统之后,就可以做出对应的镜像文件。

制作根文件系统流程概述

这里这要分析制作debian和ubuntu根文件系统的流程,不涉及buildroot根文件系统(sdk默认生成的就是buildroot根文件系统)。主要是粗略解读一下Rockchip sdk中的制作debian根文件系统的框架,这里也主要参考了鲁班猫的文档

文件概述

进入debian目录下,有以下文件.

复制代码
-rwxrwxr-x  1 1.1K 3月  10 11:04 mk-base-debian.sh
-rwxrwxr-x  1 8.1K 3月  10 11:25 mk-buster-rootfs.sh
-rwxrwxr-x  1  477 3月  10 10:49 mk-image.sh
-rwxrwxr-x  1  441 12月 26 15:18 mk-rootfs.sh
drwxrwxr-x  7   67 11月 30 11:19 overlay
drwxrwxr-x  5   49 11月 30 11:19 overlay-debug
drwxrwxr-x  4   28 11月 30 11:19 overlay-firmware
drwxrwxr-x  3   19 11月 30 11:19 packages
drwxrwxr-x  5   47 11月 30 11:19 packages-patches
-rwxrwxr-x  1 3.0K 11月 30 11:19 post-build.sh
-rw-rw-r--  1 2.6K 3月  10 11:17 readme.md
drwxrwxr-x  7  164 11月 30 11:19 ubuntu-build-service
  • mk-base-debian.sh:清理构建目录并调用live build开始构建。
  • mk-buster-rootfs.sh:添加Rockchip overlay层。
  • mk-image.sh:将根文件系统打包成img镜像文件
  • overlay:Rockchip overlay层,主要是rootfs中的配置文件
  • overlay-debug:Rockchip overlay层,主要是debug脚本和工具
  • overlay-firmware:Rockchip overlay层,主要是wifi/bt/npu的固件
  • packages:硬件加速包
  • ubuntu-build-service:用于搭建构建环境的依赖文件和live build配置文件

packages目录下有很多重要的deb包,和Rockchip芯片适配的硬件固件和加速包

复制代码
├── chromium
├── glmark2
├── gst-plugins-bad1.0
├── gst-plugins-base1.0
├── gst-plugins-good1.0
├── gst-plugins-ugly1.0
├── gstreamer
├── gst-rkmpp
├── libdrm
├── libdrm-cursor
├── libmali
├── libv4l
├── mpp
├── openbox
├── pcmanfm
├── pulseaudio
├── rga
├── rga2
├── rkaiq
├── rkisp
├── rknpu2
├── rktoolkit
├── rkwifibt       # 这个里面有泰山派使用的博通网卡的固件
└── xserver

执行流程

Rockchip sdk中编译debian根文件系统的函数

复制代码
function build_debian(){
	ARCH=${RK_DEBIAN_ARCH:-${RK_ARCH}}
	case $ARCH in
		arm|armhf) ARCH=armhf ;;
		*) ARCH=arm64 ;;
	esac

	echo "=========Start building debian for $ARCH========="

	cd debian
	if [ ! -e linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz ]; then
		RELEASE=$RK_DEBIAN_VERSION TARGET=desktop ARCH=$ARCH ./mk-base-debian.sh
		ln -rsf linaro-$RK_DEBIAN_VERSION-alip-*.tar.gz linaro-$RK_DEBIAN_VERSION-$ARCH.tar.gz
	fi

	VERSION=debug ARCH=$ARCH ./mk-rootfs-$RK_DEBIAN_VERSION.sh
	./mk-image.sh

	finish_build
}

从上面函数可以看出,执行流程分三步

执行./mk-base-debian.sh

这里主要是使用debian的livebuild工具,去做出一个基础的debian根文件系统

执行mk-buster-rootfs.sh

这里在上面的生成的根文件系统基础上,安装Rockchip相关的东西。主要是把overlay、 overlay-debug、overlay-firmware、packages相关的东西装进去。

鲁班猫在这一步会调用./mk-image.sh,所以就不用单独执行下面的脚本了。

执行./mk-image.sh

将上一步的内容打包成一个img文件,这个就是根文件系统文件。

总结

制作debian、ubuntu根文件系统的基本思路就是:

  1. 先做一个基本的镜像(可以成为base镜像),debian是用live build工具,ubuntu是从官网下载一个基础镜像。这个基础镜像只提供基本的能力,缺乏对应硬件厂商的加速包(比如rk的mpp、libdrm、libmali等)和一些固件(比如:博通的wifi网卡固件)。
  2. 在上面基础镜像的基础上,安装对应硬件厂商的加速包和一些固件,以及一些适配硬件的软件:比如chromium、gstreamer等等(这些应该也是适配了rk底层硬件的,能使用rk硬件解码,不然cpu软件解码性能很差);然后有些自己需要的可能和硬件无关的软件,比如vim、gcc、git等。
  3. 调用工具将上述镜像打包成一个img根文件系统文件,供后续和内核、uboot等其他组件部分合并成一个完整的可以烧录的镜像。

使用docker容器基于鲁班猫的仓库制作泰山派的ubuntu22.04根文件系统

前言

这里我参考了鲁班猫的ubuntu仓库。我从中fork了一份,主要是添加了泰山派博通网卡的固件和内核模块,制作了一个可以在泰山派中跑的ubuntu22.04的镜像。

我fork的仓库地址,仓库中我只适配了ubuntu22.04分支,其他分支我没适配。在readme中我也添加了完整的流程说明,这里也在稍微记录下。

流程

制作docker镜像

首先使用仓库中给定的dockerfile去构建docker镜像

复制代码
docker build -t lubancat_build_rootfs:v2 . -f Docker/Dockerfile

启动docker容器

复制代码
docker run --privileged -d \
--name lubancat_build_ubuntu \
--hostname build_ubuntu \
-v /root/new_workspace/tspi_ubuntu:/ubuntu \ # 这里/root/new_workspace/tspi_ubuntu换成你们本地的仓库根路径
-it lubancat_build_rootfs:v2 /bin/bash

这里有两个注意点:

  • 1、这里做了目录映射,主要是把宿主机的仓库目录映射到容器中,这样在宿主机中就可以拿到生成的根文件系统
  • 2、这里必须使用--privileged,使得容器拥有比较大的权限,可以执行mount、chroot等一些命令,不然可能有问题

进入容器

复制代码
docker ps|grep lubancat_build_ubuntu # 查看容器id,输出的第一列就是
docker exec -it ${容器id} /bin/bash       # 执行这个命令进入容器

进入容器后执行

下面的步骤都是在容器中执行的

step1.准备
复制代码
cd /ubuntu
# 注册binfmts,在x86的容器中,执行跨架构命令依赖这个,如果是arm的容器,应该就不需要
update-binfmts --enable qemu-aarch64
# 安装依赖
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f

这里有个关键点

  • 如果是x86的机器,可能需要手动执行update-binfmts --enable qemu-aarch64去注册binfmts,在x86的容器中,执行跨架构命令依赖这个,如果是arm的容器,应该就不需要。我之前的文章中描述我在容器中无法制作成功,应该就是没有执行它,导致chroot后,arm64的可执行文件无法被自动翻译执行,导致有问题。这个有可能是自动生效的,但是如果没生效,就需要执行下这个了
step2.构建基础 Ubuntu 系统。
复制代码
# 运行以下脚本,根据提示选择要构建的版本
./mk-base-ubuntu.sh
step3.添加 rk overlay 层,并打包ubuntu-rootfs镜像
复制代码
# 运行以下脚本,根据提示选择要构建处理器版本和ubuntu的版本
./mk-ubuntu-rootfs.sh

总结

我现在自测这个流程是非常ok的,而且我基于鲁班猫的这个仓库做的ubuntu22.04的xfce桌面的镜像,使用chromium浏览器播放视频还算流畅。实测播放b站上面的720p及以下分辨率的视频还是比较流畅;播放1080p的视频就完全不行了,非常卡顿了。估计这也是到达了rk3566这款soc的极限性能了吧。这已经比我之前做的镜像好多了,我之前应该是没有配置好rk硬件加速包之类的,直接播放任意流畅度的b站视频都无比卡顿。感谢鲁班猫,提供的资料很详细,yyds;之后高低整一块鲁班猫的板子。

这样就能在docker容器中完整制作根文件系统了,不用在像之前的文章介绍的使用qemu虚拟机去做了,就方便太多了0.0

使用泰山派sdk编译5.10内核问题记录

背景

我使用的是从鲁班猫仓库获取的内核,fork了一份:仓库地址,里面有5.10版本的内核

我使用的是ubuntu18.04.6的容器去进行泰山派sdk的编译操作

问题1:内核配置没选好编译工具链,报失败

报错日志

失败日志如下:

复制代码
arch/arm64/Makefile:25: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum
arch/arm64/Makefile:33: LSE atomics not supported by binutils
arch/arm64/Makefile:44: Detected assembler with broken .inst; disassembly will be unreliable
arch/arm64/Makefile:25: ld does not support --fix-cortex-a53-843419; kernel may be susceptible to erratum
arch/arm64/Makefile:33: LSE atomics not supported by binutils
arch/arm64/Makefile:44: Detected assembler with broken .inst; disassembly will be unreliable
  CC      scripts/mod/empty.o
  CC      scripts/mod/devicetable-offsets.s
gcc: error: unrecognized command line option '-mlittle-endian'; did you mean '-fconvert=little-endian'?
gcc: error: unrecognized command line option '-mlittle-endian'; did you mean '-fconvert=little-endian'?
scripts/Makefile.build:273: recipe for target 'scripts/mod/empty.o' failed
make[2]: *** [scripts/mod/empty.o] Error 1
make[2]: *** Waiting for unfinished jobs....
scripts/Makefile.build:117: recipe for target 'scripts/mod/devicetable-offsets.s' failed
make[2]: *** [scripts/mod/devicetable-offsets.s] Error 1
Makefile:1354: recipe for target 'prepare0' failed
make[1]: *** [prepare0] Error 2
arch/arm64/Makefile:214: recipe for target 'tspi-rk3566-user-v10-linux.img' failed
make: *** [tspi-rk3566-user-v10-linux.img] Error 2
ERROR: Running build_kernel failed!
ERROR: exit code 2 from line 656:
    make ARCH=$RK_ARCH $RK_KERNEL_DTS.img -j$RK_JOBS

解决方案

后面发现是没搞好内核的编译器的配置,需要修改kernel中的Makefile为自己的编译器(kernel/Makefile里)。【这里有点奇怪的是,编译泰山派sdk原来的4.19版本的内核也没这样显式的去写,但是是ok的,这里后面有时间再看看,现在就先这样搞吧

这里是参考文档:RK3566-移植5.10内核&Ubuntu22.04,去解决的。

问题2:环境中lz4工具版本过低,导致编译失败

报错日志

复制代码
arch/arm64/configs/rockchip_linux_defconfig:683:warning: override: reassigning to symbol NETFILTER
#
# No change to .config
#

  CALL    scripts/atomic/check-atomics.sh
  CALL    scripts/checksyscalls.sh
  CHK     include/generated/compile.h
  LZ4C    arch/arm64/boot/Image.lz4
Incorrect parameters
Usage :
      lz4 [arg] [input] [output]

input   : a filename
          with no FILE, or when FILE is - or stdin, read standard input
Arguments :
 -1     : Fast compression (default) 
 -9     : High compression 
 -d     : decompression (default for .lz4 extension)
 -z     : force compression
 -f     : overwrite output without prompting 
 -h/-H  : display help/long help and exit
arch/arm64/boot/Makefile:31: recipe for target 'arch/arm64/boot/Image.lz4' failed
make[2]: *** [arch/arm64/boot/Image.lz4] Error 1
make[2]: *** Deleting file 'arch/arm64/boot/Image.lz4'
arch/arm64/Makefile:170: recipe for target 'Image.lz4' failed
make[1]: *** [Image.lz4] Error 2
make[1]: *** Waiting for unfinished jobs....
arch/arm64/Makefile:214: recipe for target 'tspi-rk3566-user-v10-linux.img' failed
make: *** [tspi-rk3566-user-v10-linux.img] Error 2
ERROR: Running build_kernel failed!
ERROR: exit code 2 from line 656:
    make ARCH=$RK_ARCH $RK_KERNEL_DTS.img -j$RK_JOBS

解决方案

升级工具版本,由于我的ubuntu版本太低,使用apt无法升级更新的,只能从源码安装

复制代码
# 1. 从 GitHub 下载最新源码
git clone https://github.com/lz4/lz4.git
cd lz4

# 2. 编译并安装到系统路径
make
sudo make install

# 3. 验证新版本
lz4 --version

然后再执行./build.sh kernel就编译成功了。

相关推荐
tt5555555555552 小时前
Linux虚拟机固定IP超详细教程
linux·运维·tcp/ip
阑梦清川3 小时前
动静态库和编译链接简述
linux
拾光Ծ3 小时前
【Linux】入门指南:基础指令详解Part One
linux·运维·服务器·centos
egoist20233 小时前
[linux仓库]肝爆进程通信:匿名管道、命名管道、进程池核心原理与实战【万字长文】
linux·服务器·进程通信·匿名管道·命名管道·进程池
轻颂呀3 小时前
线程的概念和控制
linux
我命由我123453 小时前
Git 暂存文件警告信息:warning: LF will be replaced by CRLF in XXX.java.
java·linux·笔记·git·后端·学习·java-ee
一只小透明啊啊啊啊4 小时前
进程、进程、内存、调度总结
linux
努力学习的小廉4 小时前
深入了解linux网络—— TCP网络通信(上)
linux·网络·tcp/ip
青草地溪水旁5 小时前
socketpair深度解析:Linux中的“对讲机“创建器
linux·服务器·socket编程