本文主要是介绍【北京迅为】《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,如下图所示:
接下来对每个目录的作用进行讲解:
- build目录用来存放构建完成的文件系统源码和镜像,而由于现在还未进行文件系统的构建,所以目前只有一个用于挂载的脚本,在后面的系统定制小节中会用到该脚本。
- docker目录用来存放构建第一小节中docker镜像的Dockerfile文件(迅为已经提供好了,不需要大家自己构建),如下图所示:
- 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源码包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!