【北京迅为】《iTOP-3588开发板源码编译手册》-第三章 编译 Linux源码包

2024-05-07 18:52

本文主要是介绍【北京迅为】《iTOP-3588开发板源码编译手册》-第三章 编译 Linux源码包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP,内置NPU,支持INT4/INT8/INT16/FP16混合运算能力,支持安卓12和、Debian11、Build root、Ubuntu20和22版本登系统。了解更多信息可点击迅为官网   

【粉丝群】824412014

【实验平台】:迅为RK3588开发板

【内容来源】《iTOP-3588开发板源码编译手册》

【全套资料及网盘获取方式】联系淘宝客服加入售后技术支持群内下载

【视频介绍】:【强者之芯】 新一代AIOT高端应用芯片 iTOP -3588人工智能工业AI主板


第三章 编译 Linux源码包

3.1 获取Linux源码包

编译环境说明:

本手册使用的是迅为提供的编译环境Ubuntu20.04,在网盘资料“iTOP-3588开发板\02_【iTOP-RK3588开发板】开发资料\02_iTOP-3588开发板搭建好编译环境的Ubuntu20.04虚拟机镜像”路径下。这里的ubuntu默认开发环境已经搭建好。

因Ubuntu版本众多,无法将所有版本Ubuntu全部测试通过,如使用其他开发环境,在开发过程中遇到问题,需自行研究解决。

在编译源码之前,先看一下第四章安装编译所需依赖包,才可进行编译工作。

Linux源码网盘下载路径:“iTOP-3588开发板\01_【iTOP-RK3588开发板】基础资料\05_iTOP-RK3588开发板Linux源码

源码名称说明:源码会逐渐更新,发布的源码日期会有所不同,具体以网盘中实际名称为准。

1 从网盘中下载Linux源码包,如下图所示:

2 首先下载01_Linux系统源码到windows电脑上,如下所示: 

下载后得到的源码如果是分卷压缩包,大家要完整全部下载下来,然后点击第一个分卷压缩包,鼠标点击右键,选择点击“解压到XXXXXXX”(XX...为名称的简写),然后等待解压完毕。解压完,会生成一个XXXXXXX.tar.gz(XX...为名称的简写)名字的压缩包。然后将XXXXXXX.tar(XX...为名称的简写)拷贝到ubuntu中解压。 

3 在迅为提供的Ubuntu20.04中,新建一个/home/topeet/Linux文件夹,我们将3588_linux_XXXXXXX.tar(XX...为名称的简写)拷贝到Linux文件夹中,使用命令“tar -vxf 3588_linux_XXXXXXX.tar(XX...为名称的简写)”解压压缩包。解压后会生成一个3588_linux文件夹,如下图所示: 

3.2 选择屏幕配置 

在源码编译之前首先要确定自己想要使用的屏幕并修改源码, 在编译镜像, 烧写镜像。 如

下图所示: 

 

iTOP-3588 开发板支持以下种类屏幕: 

 迅为 MIPI 7 寸屏幕

标准 HDMI 屏幕(通过 HDMI 线连接) 

迅为 LVDS 7 寸屏幕

迅为 LVDS 10.1 寸 1024*600 屏幕

迅为 LVDS 10.1寸1280*800屏幕

迅为 LVDS 10.1寸1280*800新屏幕 

打开Linux源码kernel/arch/arm64/boot/dts/rockchip/topeet_screen_lcds.dts中的设备树文件。如下图所示:

在上图中分别定义了不同屏幕的宏定义。我们如果想要连接某个屏幕,使能对应的屏幕宏定义即可。如果想要设置多屏显示,请参考《【北京迅为】itop-rk3588开发板多屏显示手册》。

如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1280x800_GT9271, 需要将kernel/arch/arm64/configs/rockchip_linux_defconfig文件中的CONFIG_TOUCHSCREEN_GT9271=y 宏定义使能,然后再编译源码

如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1280x800_GT911和#define LCD_TYPE_LVDS_10_1_1024x600_GT911,需要将kernel/arch/arm64/configs/rockchip_linux_defconfig文件中的CONFIG_TOUCHSCREEN_GT9XX 宏定义使能,然后再编译源码。

3.3 选择摄像头配置 

打开Linux源码kernel/arch/arm64/boot/dts/rockchip/topeet_camera_config.dtsi中的设备树文件。如下图所示默认支持底板J1接口可用:

底板上的接口如下所示。如果想要单独使用哪个接口开启对应的宏定义即可,注意只能单独使能单个摄像头。如果想要使用多个摄像头,请参考《【北京迅为】itop-3588开发板摄像头使用手册》。 

3.4 编译 Buildroot

Buildroot是一款集成的编译集合包,解决了以前交叉编译麻烦的问题,本小节将介绍buildroot镜像的编译流程,分为单独编译和完整全自动编译。

 

3.4.1 单独编译

3.4.1.1 图形化界面

本小节单独编译镜像的顺序如下所示:

单独编译uboot ->单独编译kernel ->单独编译recovery ->单独编译buildroot

各个镜像编译完成后,最终打包镜像update.img的方式来编译buildroot镜像update.img。

第一步:编译uboot

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

光标默认就在uboot,所以直接回车即可开始uboot的编译,编译过程如下所示: 

 

Uboot编译完成如下图所示: 

 

编译完成后生成uboot.img 到u-boot目录,如下图所示: 

 

第二步:编译kernel

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

然后将光标移动到第二个kernel,点击回车即可开始kernel内核的编译,编译过程如下所示: 

 

 

内核编译完如下图所示: 

 

编译完成后映像文件会打包成 boot.img kernel目录。如下图所示 

 

第三步:编译Recovery

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第四个recovery,点击回车即可开始recovery的编译,编译过程如下所示: 

 

 

编译完成如下图所示: 

 

第四步:编译buildroot

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 然后将光标移动到第三个rootfs,点击回车会进入到文件系统镜像选择界面,如下图所示:

 

 

这里总共有五种镜像供编译选择,由于本小节要编译的是buildroot,所以将光标移动到buildroot按下回车即可开始buildroot镜像的构建,构建过程如下所示: 

 

构建完成如下所示: 

 

第五步:打包镜像

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后,将打包要用到的所有固件移动到 rockdev 目录下,然后打包为完整的update.img镜像。

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第六个firmware,点击回车就会运行相应的脚本将打包要用到的所有固件移动到 rockdev 目录下,具体打印如下所示: 

 

 

打包成update.img所需要的镜像就已经拷贝到了rockdev目录,如下图所示: 

 

然后进行最后的打包步骤,在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第七个updateimg,点击回车rockdev目录下全部固件打包成为一个整体的update.img镜像,具体打印如下所示: 

 

 

命令运行完成之后,在rockdev目录下就生成了打包而来的update.img镜像,如下图所示: 

 

3.4.1.2 命令行

本小节单独编译镜像的顺序如下所示:

单独编译uboot ->单独编译kernel ->单独编译recovery ->单独编译buildroot

各个镜像编译完成后,最终打包镜像update.img的方式来编译buildroot镜像update.img。

第一步:编译uboot

在linux源码目录下输入以下命令编译U-Boot

./build.sh uboot

 

Uboot编译完成如下图所示: 

 

编译完成后生成uboot.img 到u-boot目录,如下图所示: 

 

第二步:编译kernel

在linux源码目录下输入以下命令编译 Kernel

./build.sh kernel 

 

 内核编译完如下图所示:

 

编译完成后映像文件会打包成 boot.img kernel目录。如下图所示 

 

第三步:编译Recovery

在linux源码目录下输入以下命令编译Recovery

./build.sh recovery

 

编译完成如下图所示: 

 

第四步:编译buildroot

进入源码根目录执行以下命令自动完成 Rootfs 的编译及打包:

./build.sh rootfs

 

编译完成如下图所示: 

 

第五步:打包镜像

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后,进入工程目录根目录执行以下命令自动完成所有固件打包到 rockdev 目录下。

输入以下命令打包所有启动系统需要的镜像。进入rockdev目录下可以看到打包的单独镜像。

./build.sh firmware

 

输入以下命令,打包update.img镜像

./build.sh updateimg

 

打包完成会在rockdev目录下生成update.img,如下图所示: 

 

3.4.2 全自动编译

3.4.2.1 图形化界面

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

 然后选择第五个all,就会进入到文件系统类型选择页面,如下所示: 

 

 

由于本小节全自动编译的是buildroot系统,所以这里选择buildroot,然后回车,等待编译完成即可,脚本会自动编译uboot kernel recovery buildroot 并打包为一个完整的update.img镜像,编译完成之后如下所示: 

 

在rockdev目录下就生成了打包完成的update.img镜像如下图所示: 

 

3.4.1.2 命令行

进入源码根目录执行以下命令自动完成所有的编译。如果想自动全编译buildroot文件系统,输入以下命令:

./build.sh buildroot_update

输入上面的命令后,会自动编译uboot kernel recovery buildroot 打包。打包完成会在rockdev目录下生成update.img,如下图所示:

 

3.5 编译 Ubuntu

本小节将介绍ubuntu镜像的编译流程,分为单独编译和完整全自动编译。

3.5.1 单独编译

3.5.1.1 图形化界面

本小节单独编译镜像的顺序如下所示:

单独编译uboot ->单独编译kernel ->单独编译recovery ->单独编译ubuntu

各个镜像编译完成后,最终打包镜像update.img的方式来编译ubuntu镜像update.img。

第一步:编译uboot

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

光标默认就在uboot,所以直接回车即可开始uboot的编译,编译过程如下所示: 

 

Uboot编译完成如下图所示: 

 

 编译完成后生成uboot.img 到u-boot目录,如下图所示:

第二步:编译kernel

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第二个kernel,点击回车即可开始kernel内核的编译,编译过程如下所示: 

 

 

内核编译完如下图所示: 

 

编译完成后映像文件会打包成 boot.img kernel目录。如下图所示 

 

第三步:编译Recovery

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第四个recovery,点击回车即可开始recovery的编译,编译过程如下所示: 

 

编译完成如下图所示: 

 

第四步:构建Ubuntu

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第三个rootfs,点击回车会进入到文件系统镜像选择界面,如下图所示: 

 

 这里总共有五种镜像供编译选择,由于本小节要编译的是ubuntu,所以将光标移动到第4个ubuntu20或者第5个ubuntu22,大家根据自己的需求选择合适的镜像即可。按下回车即可开始ubuntut镜像的构建,构建过程如下所示:

 

 需要注意,由于ubuntu镜像的构建中的解压步骤需要root权限,所以需要输入一次root用户的密码,构建完成如下所示:

 

会在ubuntu目录下生成名为rootfs.img的文件系统烧写镜像,如下图所示: 

 

第五步:打包镜像

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后,将打包要用到的所有固件移动到 rockdev 目录下,然后打包为完整的update.img镜像。

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第六个firmware,点击回车就会运行相应的脚本将打包要用到的所有固件移动到 rockdev 目录下,具体打印如下所示: 

 

 

 打包成update.img所需要的镜像就已经拷贝到了rockdev目录,如下图所示:

 

然后进行最后的打包步骤,在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第七个updateimg,点击回车rockdev目录下全部固件打包成为一个整体的update.img镜像,具体打印如下所示: 

 

 

命令运行完成之后,在rockdev目录下就生成了打包而来的update.img镜像,如下图所示: 

 

3.5.1.2 命令行

本小节单独编译镜像的顺序如下所示:

单独编译uboot ->单独编译kernel ->单独编译recovery ->单独编译ubuntu

各个镜像编译完成后,最终打包镜像update.img的方式来编译ubuntu镜像update.img。

第一步:编译uboot

在linux源码目录下输入以下命令编译U-Boot

./build.sh uboot

 

Uboot编译完成如下图所示: 

 

编译完成后生成uboot.img 到u-boot目录,如下图所示: 

 

第二步:编译kernel

在linux源码目录下输入以下命令编译 Kernel

./build.sh kernel 

 内内核编译完如下图所示:

 编译完成后映像文件会打包成 boot.img kernel目录。如下图所示

第三步:编译Recovery

在linux源码目录下输入以下命令编译Recovery

./build.sh recovery

 

编译完成如下图所示: 

 

第四步:编译ubuntu

由于ubuntu有ubuntu20和ubuntu22两个版本,所以提供了两个命令,分别对应ubuntu20和ubuntu22:

./build.sh ubuntu20

./build.sh ubuntu22

这里以ubuntu20为例进行编译,编译过程如下所示:

 

需要注意,由于ubuntu镜像的构建中的解压步骤需要root权限,所以需要输入一次root用户的密码,编译完成如下图所示:

 

 会在ubuntu目录下生成名为rootfs.img的文件系统烧写镜像,如下图所示:

 

第五步:打包镜像

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后,进入工程目录根目录执行以下命令自动完成所有固件打包到 rockdev 目录下。

输入以下命令打包所有启动系统需要的镜像。进入rockdev目录下可以看到打包的单独镜像。

./build.sh firmware

输入以下命令,打包update.img镜像

./build.sh updateimg

 

打包完成会在rockdev目录下生成update.img,如下图所示: 

 

3.5.2 全自动编译

3.5.2.1 图形化界面

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

 然后选择第五个all,就会进入到文件系统类型选择页面,如下所示: 

 

 

 

由于本小节全自动编译的是ubuntu系统,所以这里可以根据大家想编译的ubuntu版本选择第四个ubuntu20或者ubuntu22,然后回车,等待编译完成即可,脚本会自动编译uboot kernel recovery ubuntu 并打包为一个完整的update.img镜像,编译完成之后如下所示: 

 

在rockdev目录下就生成了打包完成的update.img镜像如下图所示: 

 

3.5.1.2 命令行

进入源码根目录执行以下命令自动完成所有的编译。如果想自动全编译ubuntu文件系统,输入以下命令:

./build.sh ubuntu20_update

./build.sh ubuntu22_update

上面两个命令分别对应ubuntu20版本和ubuntu22版本,输入上面的命令后,会自动编译uboot kernel recovery ubuntu 并打包。打包完成会在rockdev目录下生成update.img,如下图所示:

 

3.6 编译 Debian

本小节将介绍Debian镜像的编译流程,分为单独编译和完整全自动编译。

3.6.1 单独编译

3.6.1.1 图形化界面

本小节单独编译镜像的顺序如下所示:

单独编译uboot ->单独编译kernel ->单独编译recovery ->单独编译debian

各个镜像编译完成后,最终打包镜像update.img的方式来编译debian镜像update.img。

第一步:编译uboot

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 光标默认就在uboot,所以直接回车即可开始uboot的编译,编译过程如下所示:

Uboot编译完成如下图所示: 

 

编译完成后生成uboot.img 到u-boot目录,如下图所示: 

 

第二步:编译kernel

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第二个kernel,点击回车即可开始kernel内核的编译,编译过程如下所示: 

 

 

内核编译完如下图所示: 

 

编译完成后映像文件会打包成 boot.img kernel目录。如下图所示 

 

第三步:编译Recovery

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第四个recovery,点击回车即可开始recovery的编译,编译过程如下所示: 

 

 

编译完成如下图所示: 

 

第四步:构建Debian

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第三个rootfs,点击回车会进入到文件系统镜像选择界面,如下图所示: 

 

 

这里总共有五种镜像供编译选择,由于本小节要编译的是debian,所以将光标移动到第2个debian11或者第3个debian12,大家根据自己的需求选择合适的镜像即可。按下回车即可开始ubuntut镜像的构建,构建过程如下所示: 

 

 

需要注意,由于debian镜像的构建中的解压步骤需要root权限,所以需要输入一次root用户的密码,构建完成如下所示: 

会在debian目录下生成名为rootfs.img的文件系统烧写镜像,如下图所示: 

 

第五步:打包镜像

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后,将打包要用到的所有固件移动到 rockdev 目录下,然后打包为完整的update.img镜像。

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后将光标移动到第六个firmware,点击回车就会运行相应的脚本将打包要用到的所有固件移动到 rockdev 目录下,具体打印如下所示: 

 

打包成update.img所需要的镜像就已经拷贝到了rockdev目录,如下图所示: 

 

然后进行最后的打包步骤,在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 然后将光标移动到第七个updateimg,点击回车rockdev目录下全部固件打包成为一个整体的update.img镜像,具体打印如下所示:

 

 

命令运行完成之后,在rockdev目录下就生成了打包而来的update.img镜像,如下图所示: 

 

3.6.1.2 命令行

本小节单独编译镜像的顺序如下所示:

单独编译uboot ->单独编译kernel ->单独编译recovery ->单独编译debian

各个镜像编译完成后,最终打包镜像update.img的方式来编译debian镜像update.img。

第一步:编译uboot

在linux源码目录下输入以下命令编译U-Boot

./build.sh uboot

 

Uboot编译完成如下图所示: 

 

编译完成后生成uboot.img 到u-boot目录,如下图所示: 

 

第二步:编译kernel

在linux源码目录下输入以下命令编译 Kernel

./build.sh kernel 

 

内核编译完如下图所示: 

 

编译完成后映像文件会打包成 boot.img kernel目录。如下图所示 

 

第三步:编译Recovery

在linux源码目录下输入以下命令编译Recovery

./build.sh recovery

 

编译完成如下图所示: 

 

第四步:编译debian

由于ubuntu有debian11和debian12两个版本,所以提供了两个命令,分别对应debian11和debian12:

./build.sh debian11

./build.sh debian12

这里以debian11为例进行编译,编译过程如下所示:

 需要注意,由于debian镜像的构建中的解压步骤需要root权限,所以需要输入一次root用户的密码,编译完成如下图所示:

 

会在ubuntu目录下生成名为rootfs.img的文件系统烧写镜像,如下图所示: 

 

第五步:打包镜像

上面 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后,进入工程目录根目录执行以下命令自动完成所有固件打包到 rockdev 目录下。

输入以下命令打包所有启动系统需要的镜像。进入rockdev目录下可以看到打包的单独镜像。

./build.sh firmware

 

 输入以下命令,打包update.img镜像

./build.sh updateimg

 

打包完成会在rockdev目录下生成update.img,如下图所示: 

 

3.6.2 全自动编译

3.6.2.1 图形化界面

首先在linux源码目录下输入以下命令进入编译的UI界面,进入之后如下所示:

./build.sh

 

 

然后选择第五个all,就会进入到文件系统类型选择页面,如下所示: 

 

 由于本小节全自动编译的是debian系统,所以这里可以根据大家想编译的ubuntu版本选择第四个debian11或者debian12,然后回车,等待编译完成即可,脚本会自动编译uboot kernel recovery debian 并打包为一个完整的update.img镜像,编译完成之后如下所示:

在rockdev目录下就生成了打包完成的update.img镜像如下图所示: 

 

3.6.1.2 命令行

进入源码根目录执行以下命令自动完成所有的编译。如果想自动全编译ubuntu文件系统,输入以下命令:

./build.sh debian11_update

./build.sh debian12_update

上面两个命令分别对应debian11版本和debian12版本,输入上面的命令后,会自动编译uboot kernel recovery ubuntu 并打包。打包完成会在rockdev目录下生成update.img,如下图所示:

 

3.7 定制Ubuntu和Debian系统

3.7.1安装docker并配置

如果使用的是迅为提供好的ubuntu20编译环境,可以跳过本小节,直接转到3.6.3小节即可,使用docker的目的是为了解决用户在构建系统时产生的依赖问题。

在安装docker工具之前需要输入以下命令卸载docker,确保系统里面没有老版本的docker,如下图所示:

for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done

 

然后使用以下命令安装docker运行所需要的依赖,如下图所示:

sudo apt-get update

sudo apt-get install ca-certificates curl gnupg

 依赖安装完成之后依次输入下面三条命令,创建、获取并信任Docker的GPG公钥:

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg

 

然后输入以下命令将Docker存储库添加到Apt软件包管理器的源列表中:

echo \

  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \

  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \

  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

最后更新软件源并安装docker,如下图所示::

apt-get update

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成之后输入以下命令测试helloworld,如下图所示:

docker run hello-world

如果得到相同的打印,则证明docker安装成功了。然后将“iTOP-3588开发板\01_【iTOP-RK3588开发板】基础资料\05_iTOP-RK3588开发板Linux源码\02_Debian和Ubuntu系统构建源码\01_docker”目录下制作好的docker镜像拷贝到虚拟机ubuntu上,拷贝完成如下图所示: 

 

然后输入以下命令加载该镜像,加载完成如下图所示:

docker load -i image.tar.gz

 

接下来输入以下命令查看当前所有的docker镜像,其中第一个ubuntu20就是我们刚刚加载完成的镜像,如下图所示:

docker images

 

至此,关于docker的安装和配置就讲解完成了。

3.7.2使用docker构建系统

Ubuntu和Debian文件系统的构建源码在“iTOP-3588开发板\01_【iTOP-RK3588开发板】基础资料\05_iTOP-RK3588开发板Linux源码\02_Debian和Ubuntu系统构建源码”路径下,如下图所示:

 

从每个目录的名称就可以看出对应的文件系统版本,每个系统的构建流程是相同的,这里以ubuntu20文件系统的构建为例进行讲解。

首先拷贝“iTOP-3588开发板\01_【iTOP-RK3588开发板】基础资料\05_iTOP-RK3588开发板Linux源码\02_Debian和Ubuntu系统构建源码\04_ubuntu20构建源码”目录下的ubuntu20_build.tar.gz这一ubuntu20构建压缩包到虚拟机Ubuntu上,拷贝完成如下图所示:

 

然后使用以下命令进行解压,解压完成如下图所示:

tar -vxf ubuntu20_build.tar.gz

 

然后进入ubuntu20_build目录,该目录下有六个文件夹,分别为build、docker、overlay、packages、scripts和source,如下图所示: 

 

接下来对每个目录的作用进行讲解:

  1. build目录用来存放构建完成的文件系统源码和镜像,而由于现在还未进行文件系统的构建,所以目前只有一个用于挂载的脚本,在后面的系统定制小节中会用到该脚本。

 

  1. docker目录用来存放构建第一小节中docker镜像的Dockerfile文件(迅为已经提供好了,不需要大家自己构建),如下图所示:

 

  1. overlay目录用来存放构建过程中要拷贝到文件系统中的一些设置文件,如下图所示:

 

如果后续要添加个人的一些文件,就可以将文件放在该目录,然后修改构建脚本,那样构建出来的系统就会默认添加该文件,在后面的系统定制小节会讲到。

packages目录用来存放瑞芯微提供的系统要安装的一些软件包,如下图所示:

 

scripts目录中存放了文件系统构建和打包的脚本,如下图所示: 

至此对于每个文件夹内容的描述就完成了,下面开始进行文件系统的构建。

首先使用以下命令在特权模式的Docker容器中运行一个基于ubuntu20:1镜像

docker run --privileged -it -v /home/topeet/Linux/ubuntu20_build:/home/topeet/ubuntu20_build ubuntu20:1

下面对这段代码进行解释:

docker run:这个命令用于创建并运行一个新的Docker容器。
--privileged:这个选项将容器授予特权模式,允许容器内的进程访问主机系统的所有设备。
-it:这两个选项一起使用,将容器的标准输入与终端交互关联起来,并创建一个交互式的终端会话。
-v /home/topeet/Linux/ubuntu20_build:/home/topeet/ubuntu20_build:这个选项用于将主机系统中的/home/topeet/Linux/ubuntu20_build目录挂载到容器内的/home/topeet/ubuntu20_build目录。这样可以实现主机和容器之间的文件共享。
ubuntu20:1为要运行的Docker镜像的名称和标签。

运行之后会进入容器的终端会话,如下图所示:

然后进入ubuntu20_build/scripts目录下,运行build_ubuntu.sh脚本进行ubuntu文件系统的构建,构建过程如下所示: 

等待构建完成,一般ubuntu20文件系统的构建时间在20分钟左右,构建完成如下图所示: 

 

然后运行mk-image.sh脚本将构建完成的ubuntu文件系统打包成rootfs.img的形式,打包过程如下所示: 

 

构建完成之后会在build目录生成对应的文件系统源码、压缩包和用于烧写的rootfs.img镜像,如下图所示: 

 

其中binary就是构建完成的ubuntu20文件系统源码,ubuntu-focal-arm64.tar.xz压缩包为binary目录的压缩包,ubuntu-20-server-arm64.rootfs.tar.xz为构建过程中打包的无桌面的文件系统压缩包,大家可以根据需求进行使用,rootfs.img为打包之后用于烧写的文件系统镜像。

至此关于Ubuntu和Debian文件系统的构建就讲解完成了,这时候docker的作用就完成了,可以输入exit退出docker容器的终端会话,如下图所示:

 

 而由于ubuntu20_build文件是挂载到docker容器下操作的,所以可以虚拟机ubuntu的ubuntu20_build目录下找到构建完成的镜像,如下图所示:

 

3.7.3不使用docker构建系统

Ubuntu和Debian文件系统的源码在“iTOP-3588开发板\01_【iTOP-RK3588开发板】基础资料\05_iTOP-RK3588开发板Linux源码\02_Debian和Ubuntu系统构建源码”路径下,如下图所示:

 

从每个目录的名称就可以看出对应的文件系统版本,每个系统的构建流程是相同的,这里以ubuntu20文件系统的构建为例进行讲解。

首先拷贝“iTOP-3588开发板\01_【iTOP-RK3588开发板】基础资料\05_iTOP-RK3588开发板Linux源码\02_Debian和Ubuntu系统构建源码\04_ubuntu20构建源码”目录下的ubuntu20_build.tar.gz这一ubuntu20构建压缩包到虚拟机Ubuntu上,拷贝完成如下图所示:

 

然后使用以下命令进行解压,解压完成如下图所示:

tar -vxf ubuntu20_build.tar.gz

 

然后进入ubuntu20_build目录,该目录下有四个文件夹,分别为build、overlay、packages和scripts,如下图所示: 

 

然后进入ubuntu20_build目录,该目录下有四个文件夹,分别为build、overlay、packages和scripts,如下图所示: 

tar -vxf ubuntu20_build.tar.gz

 然后进入ubuntu20_build目录,该目录下有四个文件夹,分别为build、overlay、packages和scripts,如下图所示:

 

其中build目录用来存放构建完成的文件系统源码和镜像,overlay目录用来存放构建过程中要拷贝到文件系统中的一些设置文件,packages目录用来存放瑞芯微提供的系统要安装的一些软件包,最后的scripts目录中存放了文件系统构建和打包的脚本,如下图所示: 

 

其中build_ubuntu.sh脚本用来构建文件系统,mk-image.sh脚本用来将构建完成的文件系统源码打包成rootfs.img的形式,从而方便后续的烧写。至此对于每个文件夹内容的描述就完成了,下面开始进行文件系统的构建。

进入scripts目录后使用以下命令运行build_ubuntu.sh脚本进行ubuntu文件系统的构建,构建过程如下所示:

 

等待构建完成,一般ubuntu20文件系统的构建时间在20分钟左右,构建完成如下图所示: 

 

然后运行mk-image.sh脚本将构建完成的ubuntu文件系统打包成rootfs.img的形式,打包过程如下所示: 

 

构建完成之后会在build目录生成对应的文件系统源码、压缩包和用于烧写的rootfs.img镜像,如下图所示: 

 

其中binary就是构建完成的ubuntu20文件系统源码,ubuntu-focal-arm64.tar.xz压缩包为binary目录的压缩包,ubuntu-20-server-arm64.rootfs.tar.xz为构建过程中打包的无桌面的文件系统压缩包,大家可以根据需求进行使用,rootfs.img为打包之后用于烧写的文件系统镜像。

至此关于Ubuntu和Debian文件系统的构建就讲解完成了。

 

3.7.4 系统定制(正常情况)

在上面两个小节中讲解了ubuntu和debian文件系统的构建,但有时候客户需要向文件系统中添加一些个人的文件以及安装一些软件包,从而定制自己的ubuntu和debian系统,那要如何做呢?

注:本小节适用于经过上面两个小节,可以正常构建ubuntu和debian系统的情况,如果您的网络异常、或者公司环境无法联网需要看下一个小节。

3.7.4.1方法1

文件系统构建完成之后在build目录下会生成一个binary文件夹,该文件夹中存放的就是文件系统源码,可以直接对binary文件夹中的内容进行修改和添加,例如binary文件夹内容如下所示:

 

这里以添加一个test.mp4文件到根目录作为举例,添加完成如下图所示: 

 

然后回到scripts目录重新运行mk-image.sh脚本将binary文件夹打包为用于烧写的rootfs.img即可。

上面讲解的是添加和修改文件的方法,那要如何安装一些软件呢,重新来到build目录下,首先运行以下命令挂载binary目录,如下图所示:

./mount.sh -m binary/

 

然后通过下面的chroot命令切换根文件系统为构建的ubuntu20,切换成功如下所示:

chroot binary/

 

然后就可以像正常的Ubuntu系统安装软件那样来进行软件安装了,例如这里通过以下命令对nfs-kernel-server进行安装,安装过程如下所示:

apt-get install nfs-kernel-server

 

如果想要安装其他软件包,只需使用apt进行安装即可。修改完成之后输入“exit”进行退出,退出之后会重新回到build目录,如下图所示: 

然后使用以下命令解除binary目录中相关文件夹的挂载,解除挂载成功之后如下图所示:

./mount.sh -u binary/

 

最后回到scripts目录重新运行mk-image.sh脚本将binary文件夹打包为用于烧写的rootfs.img即可。

3.7.4.2方法2

在方法1中是直接修改的binary文件系统源码,除此之外还可以直接修改构建脚本,即scripts目录下的build_ubuntu.sh文件,对ubuntu和debian系统的完整构建过程感兴趣的同学可以认真学习一下该脚本。

首先来演示文件的添加,这里仍旧以test.mp4文件的添加为例进行演示,首先将要添加的test.mp4文件拷贝到overlay目录下,拷贝完成如下图所示:

 

然后进入build_ubuntu.sh文件,在570行的# Umount the temporary API filesystems上面添加以下两行内容(可能行数会有偏差),添加完成如下图所示:

# cp test.mp4

cp ${overlay_dir}/test.mp4 ${chroot_dir}/test.mp4

 

其中overlay_dir和chroot_dir两个变量分别在30和31行所定义,分别表示overlay目录和构建完成的文件系统目录binary,如下图所示:

 

保存退出之后,重新运行build_ubuntu.sh脚本构建系统即可,需要注意的是,如果在之前已经构建过系统了,需要删除build目录下的ubuntu-focal-arm64.tar.xz压缩文件再运行构建脚本。

上面讲解的修改构建脚本添加和拷贝文件的方法,那如何通过修改构建脚本安装一些软件包呢,这里仍旧以nfs-kernel-server为例进行演示,首先进入到build_ubuntu.sh文件,在570行的# Umount the temporary API filesystems上方添加以下内容,添加完成如下图所示:

cat << EOF | chroot ${chroot_dir} /bin/bash

# install nfs-kernel-server

apt-get install -y nfs-kernel-server                                                                                             EOF

 

实际上和上一小节的方法相同,只是将相关命令写了了脚本里,保存退出之后重新运行build_ubuntu.sh脚本构建系统即可,需要注意的是,如果在之前已经构建过系统了,需要删除build目录下的ubuntu-focal-arm64.tar.xz压缩文件再运行构建脚本。

至此关于ubuntu和debian系统定制章节就讲解完成了。

3.7.5 系统定制(无法联网)

在上一个小节中讲解了ubuntu和debian文件系统的定制,但那是在可以运行脚本正常构建系统的前提下,而本小节则是针对部分特殊用户无法联网的情况。

在source目录下存放了已经构建完成的压缩包,如下图所示:

 

然后使用以下命令将该压缩包解压到build目录下,解压完成如下图所示:

tar -vxf ubuntu-focal-arm64.tar.xz -C ../build/

 

解压完成之后build目录下的binary文件夹就是文件系统源码,可以直接对binary文件夹中的内容进行修改和添加,例如binary源文件夹内容如下所示: 

 

这里以添加一个test.mp4文件到根目录作为举例,添加完成如下图所示: 

 

然后回到scripts目录重新运行mk-image.sh脚本将binary文件夹打包为用于烧写的rootfs.img即可。 

这篇关于【北京迅为】《iTOP-3588开发板源码编译手册》-第三章 编译 Linux源码包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968109

相关文章

Eclipse Building Workspace 编译慢 解决办法

在svn下载的项目都会一般都会有一个 .project 的文件,在导入项目前将改文件中的一些验证属性删除掉 去掉Validator 相关的,  如: <buildCommand> <name>org.eclipse.wst.jsdt.core.javascriptValidator</name>                <arguments>

Linux服务器Tomcat中Catalina.log中定位错误信息方法

不知道做什么,就写点东西吧,分享上次在服务器tomcat日志中查找错误信息的过程!感谢导师提供的脚本,我只是搬运工,拿出来,一个是自己总结积累记录下来,一个是希望能够帮助到网络空间中的你! --阿飞 阅读本

Sping 源码深度解析——容器的功能扩展 【学习笔记】

我为什么 看的不够远,因为高度不够! 学习和整理总结Spring容器的功能扩展,本文为学习笔记,其中有一些内容是自己的思考总结! 一、两种Spring中bean加载的方式 第一种 # 第一种使用 BeanFactory 以及它默认的实现类 XmlBeanFactoryBeanFactory bf = new XmlBeanFactory(new ClassPathResource(

Openwrt:编译固件提示[mktplinkfw] error: images are too big 错误

在编译mr3420的固件时,添加了luci、jamvm,但是最终编译的固件“openwrt-ar71xx-generic-tl-mr3420-v1-squashfs-factory.bin”的大小仅仅只有3.1MB,为何会如此小巧,心生疑惑下把该固件烧录到路由中,发现luci和java虚拟机都没有添加上去,然后才发现是固件生成失败了。提示如下: /bin/ar71xx/openwrt-ar71

Linux 内核工作队列之work_struct 学习总结

前言 编写Linux驱动的时候对于work_struct的使用还是很普遍的,很早之前就在阅读驱动源码的时候就看到了它的踪影,根据其命名大概知道了它的具体作用,但是仍然不知所以,同时,伴随出现的还有delayed_work以及workqueue_struct,抱着知其然并知其所以然的态度,在这里归纳总结一下work_struct,以及如何在驱动中使用,因为工作队列相对来说比较复杂,篇幅和能力有限,

Linux内核驱动学习(五)KThread学习总结

文章目录 简介例程运行结果参考 简介 使用内核线程需要包含头文件#include <linux/kthread.h>,下面整理了一下常用的api接口,如下表格所示; 函数功能struct task_struct * kthread_create(threadfn, data, namefmt, arg...)创建一个线程struct task_struct * kthread

探索Linux内核:Kconfig / kbuild的秘密

探索Linux内核:Kconfig / kbuild的秘密 文章目录 探索Linux内核:Kconfig / kbuild的秘密深入了解Linux配置/构建系统的工作原理Kconfigkbuild的了解vmlinux与bzImage依赖性跟踪 展望未来 深入了解Linux配置/构建系统的工作原理 自从Linux内核代码迁移到Git以来,Linux内核配置/构建系统(也称为Kc

Linux内核驱动学习(四)Platform设备驱动模型

Linux platform设备驱动模型 文章目录 Linux platform设备驱动模型前言框架设备与驱动的分离设备(device)驱动(driver)匹配(match) 参考 前言 为什么要往平台设备驱动迁移?这里需要引入设备,总线,驱动这三个概念。上一篇字符型设备驱动的实现实际将设备和驱动集成到同一个文件中实现,如果这里有硬件A的驱动,硬件B的驱动,硬件C的驱动,然后

Linux内核驱动学习(三)字符型设备驱动之初体验

Linux字符型设备驱动之初体验 文章目录 Linux字符型设备驱动之初体验前言框架字符型设备程序实现cdevkobjownerfile_operationsdev_t 设备注册过程申请设备号注册设备register_device 如何构建模块编译内核编译MakefileKconfig 总结参考 前言 驱动总共分为字符型设备驱动,块设备驱动,网络设备驱动。对于字符型设备驱

u-boot 源码分析(1) 启动过程分析

u-boot 源码分析(1) 启动过程分析 文章目录 u-boot 源码分析(1) 启动过程分析前言配置源码结构apiarchboardcommoncmddriversfs Kbuild启动过程第一阶段start.Scrt0_64.S 第二阶段board_f.cboard_r.c 总结参考 前言 对于uboot,我一直是云里雾里的一个状态,这部分让我感到自己很菜,不用纵向深