【玩泰山派】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就编译成功了。

相关推荐
虾..8 小时前
Linux 软硬链接和动静态库
linux·运维·服务器
Evan芙9 小时前
Linux常见的日志服务管理的常见日志服务
linux·运维·服务器
꧁坚持很酷꧂10 小时前
解决虚拟机Ubuntu22.04连接了串口设备但终端没有显示
ubuntu
hkhkhkhkh12310 小时前
Linux设备节点基础知识
linux·服务器·驱动开发
HZero.chen12 小时前
Linux字符串处理
linux·string
张童瑶12 小时前
Linux SSH隧道代理转发及多层转发
linux·运维·ssh
汪汪队立大功12312 小时前
什么是SELinux
linux
石小千12 小时前
Linux安装OpenProject
linux·运维
柏木乃一12 小时前
进程(2)进程概念与基本操作
linux·服务器·开发语言·性能优化·shell·进程
Lime-309012 小时前
制作Ubuntu 24.04-GPU服务器测试系统盘
linux·运维·ubuntu