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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3015471.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C语言 函数概述

好 接下来 我们来讲函数 构建C程序的最佳方式 就是模块化程序设计 C语言中 最基本的程序模块被称为 函数 所以 这个知识点的重要性不言而喻 这里 我们讲个故事 诸葛亮六出祁山时 为了逼司马懿出战 派人送给力司马懿一件女人衣服 司马懿只是为使者 诸葛亮的饮食起居 使者感叹…

AI论文速读 |2024[IJCAI]TrajCL: 稳健轨迹表示:通过因果学习隔离环境混杂因素

题目&#xff1a; Towards Robust Trajectory Representations: Isolating Environmental Confounders with Causal Learning 作者&#xff1a;Kang Luo, Yuanshao Zhu, Wei Chen, Kun Wang(王琨), Zhengyang Zhou(周正阳), Sijie Ruan(阮思捷), Yuxuan Liang(梁宇轩) 机构&a…

leetcode-字符串的排列-100

题目要求 思路 1.因为只涉及到字符&#xff0c;因此可以进行排序 2.创建临时字符串&#xff0c;当临时字符串temp的长度等于str的长度&#xff0c;作为判出条件。 3.创建一个标记的数组&#xff0c;每次在temp中插入一个字符&#xff0c;便在对应的数组下标设置为1&#xff0c…

国家电网某地电力公司网络硬件综合监控运维项目

国家电网某地电力公司是国家电网有限公司的子公司&#xff0c;负责当地电网规划、建设、运营和供电服务&#xff0c;下属多家地市供电企业和检修公司、信息通信公司等业务支撑实施机构。 项目现状 随着公司信息化建设加速&#xff0c;其信息内网中存在大量物理服务器、存储设备…

美团KV存储squirrel和Celler学习

文章目录 美团在KV存储squirrel优化和改进在水平方向1、对Gossip协议进行优化 在垂直扩展方面1、forkless RDB数据复制优化2、使用多线程&#xff0c;充分利用机器的多核能力 在高可用方面 美团持久化kv存储celler优化和改进水平扩展优化1、使用bulkload进行数据导入2、线程模型…

linux启动常见问题

一、忘记root密码 日常生活中&#xff0c;我们会接触到很多账号和密码&#xff0c;而这些账号和密码我们不能都很好的记忆&#xff0c;对于linux也是一样的&#xff0c;如果root密码忘记了怎么办&#xff1f;岂不是都无法登陆使用Linux了&#xff1f;现在我就教各位&#xff0c…

一文了解CRM系统帮助中心:从认识到搭建

客户关系管理&#xff08;CRM&#xff09;系统是企业的一个重要部分。而CRM系统帮助中心为用户提供了便捷的支持服务&#xff0c;提升了用户体验&#xff0c;减少了企业运营成本。本文将从认识到搭建&#xff0c;带你全面了解CRM系统帮助中心。 一、认识CRM系统帮助中心 CRM系统…

智慧交通系统:未来出行,从这里开始

随着城市化进程的加快&#xff0c;交通拥堵、事故频发、停车难等问题日益凸显&#xff0c;传统交通管理模式已难以满足现代社会的需求。智慧交通系统作为解决这些问题的关键&#xff0c;通过集成创新技术&#xff0c;实现交通管理的智能化、信息化&#xff0c;提高交通系统的运…

流量分析利器arkime的学习之路(三)---结合Suricata攻击检测

1、基础 Arkime安装部分参考《流量分析利器arkime的学习之路&#xff08;一&#xff09;—安装部署》 在此基础上安装suricata软件并配置。 2、安装suricata yum install suricate 可能依赖的文件包括libyaml&#xff0c;PyYAML&#xff0c;这些可能在之前安装arkime或者其他…

教程分享:如何为跨境电商、外贸、国际展会制作二维码?

不论是做跨境电商、在全球做产品推广&#xff0c;还是国外的餐厅运营、参加国际展会&#xff0c;或者是做创意户外广告、制作个性化的个人名片、有趣的产品包装……只要是在国外使用二维码&#xff0c;你都可以在QR Tiger去制作您需要的二维码&#xff01; 一、认识QR Tiger 二…

RVM(相关向量机)、CNN_RVM(卷积神经网络结合相关向量机)、RVM-Adaboost(相关向量机结合Adaboost)

当我们谈到RVM&#xff08;Relevance Vector Machine&#xff0c;相关向量机&#xff09;、CNN_RVM&#xff08;卷积神经网络结合相关向量机&#xff09;以及RVM-Adaboost&#xff08;相关向量机结合AdaBoost算法&#xff09;时&#xff0c;每种模型都有其独特的原理和结构。以…

[开发|鸿蒙] 鸿蒙OS开发环境搭建(笔记,持续更新)

搭建开发环境流程&#xff1a; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/installation_process-0000001071425528-V2 鸿蒙DevEco Studio 3.1.1 Release仅支持windows和mac系统 运行环境要求 为保证DevEco Studio正常运行&#xff0c;建议电脑配置…

idea修改maven项目名称及子模块名称

一、修改目录名称 shift F6修改目录&#xff0c;选择“rename module and dictionary”。![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/43efd9c6af6e43ad9656455db94b37a2.png)二、修改子项目pom的 三、修改父项目pom的 四、刷新maven项目

消费金融平台公司如何做大做强自营产品

本文来自于2019年的某次内部分享沟通会&#xff0c;部分敏感内容已做删减。

Facebook之道:探索社交媒体领域的未来

随着科技的不断发展&#xff0c;社交媒体已经成为我们日常生活中不可或缺的一部分。而在这个领域中&#xff0c;Facebook一直是引领者和领头羊。然而&#xff0c;随着时间的推移&#xff0c;社交媒体领域正在发生着翻天覆地的变化&#xff0c;而Facebook又将何去何从&#xff1…

Meta的Ray-Bans将是最好的AI伴侣眼镜

早在2023年&#xff0c;当我第一次尝试雷朋眼镜时&#xff0c;我就带着智能眼镜自拍。但那个时候&#xff0c;很少有人意识到它是一副智能眼镜。 现在2024年雷明这种眼镜兼作蓝牙耳机&#xff0c;与iOS或安卓系统配对&#xff0c;并与一个专门的元视图应用程序同步。眼镜臂底部…

Scanner中next()、nextInt()、nextLine()、hasNext()、hasNextInt()的使用方法及注意事项

目录 1、next()、nextInt()、nextLine()的使用方法及区分 2、循环时如何使用hasNext方法 3、用hasNextInt()作为判断下一个输入是否为数字需要配合next()方法使用 1、next()、nextInt()、nextLine()的使用方法及区分 三者简单定义 next()&#xff1a;此方法遇见第一个有效字符…

厂家自定义 Android Ant编译流程源码分析

0、Ant安装 Windows下安装Ant&#xff1a; ant 官网可下载 http://ant.apache.org ant 环境配置&#xff1a; 解压ant的包到本地目录。 在环境变量中设置ANT_HOME&#xff0c;值为你的安装目录。 把ANT_HOME/bin加到你系统环境的path。 Ubuntu下安装Ant&#xff1a; sudo apt…

期权买方要保证金吗?期权交易保证金怎么计算?

今天期权懂带你了解期权买方要保证金吗&#xff1f;期权交易保证金怎么计算&#xff1f;期权保证金其实就是你在购买期权合约时&#xff0c;作为卖方要付出的那一小笔钱。简单说&#xff0c;就是为了防止你违约&#xff0c;给交易双方一个保障的“小押金”。 期权买方要保证金吗…

Python:实现b站登录并保存登录信息(baidu Comate插件帮助我逐行分析代码)

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️感谢大家点赞&#x1f44d;&…