【北京迅为】《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

相关文章

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念