12. Debian根文件系统构建

借助LubanCat-SDK我们可以方便的一键构建Debian镜像,但是Debian根文件系统的构建过程是相对独立的,不依赖SDK的其他部分。

Debian根文件系统借助live build来进行构建,live build是⼀组⽤于构建实时系统映像的脚本。 live build是⼀个⼯具套件,它使⽤⼀个配置⽬录来完全⾃动化和定制构建live镜像的所有⽅⾯。

除了live build外,我们的Debian构建仓库还有很多构建脚本,可以最大化的减少人工操作,使构建的根文件系统具有一致性。

注解

LubanCat-SDK使用的Debian构建项目与我们提供的Debian镜像功能相同,建议用户直接使用我们构建好的根文件系统镜像。具体使用方法和下载地址,请查看LubanCat-SDK构建章节

12.1. Debian系统支持情况

12.1.1. LubanCat_Linux_Generic_SDK

仅支持Debian 11 “Bullseye”。

  • lite无桌面版本

  • gnome桌面版本(默认桌面)

  • xfce桌面版本(默认桌面)

12.1.2. LubanCat-RK356x

仅支持Debian 10 “Buster”。

  • lite无桌面版本

  • xfce4桌面版本

  • xfce4-full桌面版本

12.1.3. LubanCat-RK3588

仅支持Debian 11 “Bullseye”。

  • lite无桌面版本

  • gnome桌面版本(默认桌面)

  • xfce桌面版本(无技术支持)

  • lxde桌面版本(无技术支持)

12.2. 什么是Debian

以下文档以Debian10为例进行演示,Debain11内容类似。如使用Debain11, 将相关内容或脚本中的”debain10“和”buster“替换为“debain11”和“bullseye”即可

../../_images/debian-logo.png

Debian GNU/Linux(简称Debian),是目前世界最大的非商业性Linux发行版之一, 是⼀种完全⾃由开放并⼴泛⽤于各种设备的 Linux 操作系统。

Debian的特点:

  • 面向用户的 Debian

    • Debian 是自由软件,每個人都能自由使用、修改,以及分发。

    • 稳定且安全。

    • 广泛的硬件支持。

    • 提供平滑的更新。

    • 是许多其他发行版的基础。

    • Debian项目是一個社区。

  • 面向开发者的Debian

    • 支持多种硬件架构,包括 AMD64、i386,ARM和MIPS等

    • 支持物联网和嵌入式设备

    • 拥有大量的套件,使用deb格式

    • 不同的发布版本

    • 公开的错误跟踪系统

Debian官网:https://www.debian.org/

12.3. Debian根文件系统构建仓库

在我们发布的LubanCat-SDK中就已经包含了完整的Debian根文件系统构建项目,保存在SDK的debain目录下。

进入debian目录下,有以下文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
ls -hgG

-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配置文件

目前构建脚本支持三种版本的镜像构建

  • lite:无桌面,终端版

  • xfce:使用xfce套件的桌面版

  • xfce-full:使用xfce套件+更多推荐软件包的桌面版

12.4. Debian根文件系统构建流程

Debian根文件系统的构建主要分为三个步骤

第一步:使用live build工具构建lite-debian或xfce-debian根文件系统。使用mk-base-debian.sh脚本实现。

第二步:添加基于RK处理器进行功能增强的软件包如GPU驱动和硬件firmware等。使用mk-buster-rootfs.sh脚本实现。

第三步:将构建完成的根文件系统打包成img格式,方便烧录和下一步处理。通过mk-image.sh脚本实现,在第二步完成后自动调用。

12.5. 搭建构建环境

在debian目录下执行以下命令

1
2
3
sudo apt-get install binfmt-support qemu-user-static
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f

上面的命令执行过程中可能有警告或报错,这是正常现象,我们直接忽略报错即可。

../../_images/debian01.png ../../_images/debian02.png

12.6. 构建Debian根文件系统镜像

在ubuntu-build-service目录下,根据lite或xfce版本,armhf或arm64架构的不同, 已经保存了live build的一些预设文件,如软件包列表、用户名、密码、用户组、时区等配置。

我们使用mk-base-debian.sh脚本来调用live build构建相应的Debian根文件系统。

理论上生成的根文件系统已经能在我们的板卡上运行了,不过还没有添加针对板卡的配置, 如网络,显示等,只能运行核心的服务。

下面我们来看一下具体的构建过程:

12.6.1. 构建debian-base基础根文件系统

我们在debian目录下运行下面的命令

1
./mk-base-debian.sh

选择要构建的Debian版本,这里我们选择xfce版本,输入2并按下Enter按键,根据提示输入用户密码

1
2
3
4
5
6
7
8
9
---------------------------------------------------------
please enter TARGET version number:
请输入要构建的根文件系统版本:
[0] Exit Menu
[1] lite
[2] xfce
[3] xfce-full
---------------------------------------------------------
2

整个构建时间较长,等待命令结束以后我们看一下debian目录下的文件变化:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ls -hgG

-rw-rw-rw-  1 370M 3月  10 14:04 linaro-buster-xfce-alip-20230418.tar.gz
-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

新增的文件linaro-buster-xfce-alip-20230418.tar.gz就是刚刚通过live build构建的基础debian根文件系统的压缩包

12.6.2. 构建完整的debian根文件系统

通过上一步骤构建的根文件系统已经可以在板卡上运行了,为了进一步优化在LubanCat上运行的效果, 我们还要添加Rockchip overlay层,里面主要是一些配置文件和固件,用于添加或覆盖根文件系统中原有的配置文件。

1
./mk-buster-rootfs.sh

选择要构建的Debian版本,这里我们选择xfce版本,输入2并按下Enter按键,根据提示输入用户密码

1
2
3
4
5
6
7
8
9
---------------------------------------------------------
please enter TARGET version number:
请输入要构建的根文件系统版本:
[0] Exit Menu
[1] lite
[2] xfce
[3] xfce-full
---------------------------------------------------------
2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
drwxr-xr-x 23  270 3月  10 14:57 binary
-rw-rw-rw-  1 370M 3月  10 14:04 linaro-buster-xfce-alip-20230418.tar.gz
-rw-rw-r--  1 1.3G 3月  10 14:11 linaro-xfce-rootfs.img
-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

构建完成后,在debian目录下增加了binary目录。里面存放的是解压后的根文件系统, 我们将要覆盖或添加的文件复制进去,然后通过chroot命令进行修改。

12.6.3. 打包debian-lite根文件系统镜像

在脚本./mk-buster-rootfs.sh的最后,自动调用了 IMAGE_VERSION=$TARGET ./mk-image.sh 脚本来打包镜像, TARGET就是我们在运行脚本时选择的Debain版本。

脚本运行完成后,我们就得到了名为linaro-xfce-rootfs.img的根文件系统镜像文件。

12.7. 定制Debian根文件系统

由于镜像体积的限制,我们提供的定制Debian镜像预装了一部分常用软件, 但是在用户开发时可能还需要预装更多的软件,以及对根文件系统做进一步的定制。 以下部分将对根文件系统的修改做具体说明。

12.7.1. 添加预装软件包

对于预装软件的添加,我们建议放在mk-buster-rootfs.sh脚本中, 这样在我们做修改以后,只要重复添加Rockchip overlay层和打包img镜像的过程即可, 可以节约大量的开发时间。

比如我们想要预装git和vim到根文件系统中, 则可以在mk-buster-rootfs.sh添加以下内容

1
2
3
4
5
6
export APT_INSTALL="apt-get install -fy --allow-downgrades"
#添加的位置在 export APT_INSTALL 下一行

#添加的内容是
echo -e "\033[47;36m ---------- LubanCat -------- \033[0m"
\${APT_INSTALL} git vim

12.7.2. 添加外设firmware

如果我们使用无线网卡这样的外设,就需要向根文件系统中添加网卡的firmware, 这时直接将对应的firmware存放在overlay-firmware/目录下,按根文件系统中的路径保存。

12.7.3. 添加服务项及配置文件

我们希望对有些服务项的配置进行自定义,就可以在overlay/目录下添加对应的配置文件。 制作根文件系统的过程中,在添加Rockchip overlay层的时候,就会添加或替换根文件系统中原有的配置文件, 以实现对配置文件自定义的效果。

这里我们以Debain控制台登录时的banner配置为例,他的配置文件在根文件系统的/etc/update-motd.d目录下, 这里对应的是overlay/etc/update-motd.d/目录。

我们在overlay/etc/update-motd.d/中新建一个名为00-header的文件,在文件中添加以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/sh
#

[ -r /etc/lsb-release ] && . /etc/lsb-release

printf "\n"
echo "\e[1;34m
        OO                            OO
        OOOO                        OOOO
        OOOOO                     OOOOOO
        OOOOOOO                 .OOOOOOO
        OOOOOOOOO              OOOOOOOOO
        OOOOOOOOOOO          OOOOOOOOOOO
        OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
        OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
        OOOOO\    OOOOOOOOOOOO    /OOOOO
        OOOOOOOOO    OOOOOO     OOOOOOOO
        OOOOO/    OOOOOOOOOOOOO   \OOOOO
        OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
        OOOOOOOOOOOOOO\ ̄/OOOOOOOOOOOOOO
        OOOOOOOOOOOOOOO\/OOOOOOOOOOOOOOO
        OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
_            _                     ____        _
| |    _   _ | |__    ____  _____  / ___| ____ | |_
| |   | | | || '_ \  / _  ||  _  || |    / _  || __|
| |___| |_| || |_) || (_| || | | || |___| (_| || |_
|_____|\__._||_.__/  \__'_||_| |_| \____|\__'_| \__|
\e[0m"

if [ -z "$DISTRIB_DESCRIPTION" ] && [ -x /usr/bin/lsb_release ]; then
    # Fall back to using the very slow lsb_release utility
    DISTRIB_DESCRIPTION=$(lsb_release -s -d)
fi
printf "\n"
printf "Welcome to %s (%s %s %s)\n" "$DISTRIB_DESCRIPTION" "$(uname -o)" "$(uname -r)" "$(uname -m)"

这个脚本的作用是生成动态的banner。

在添加配置文件以后,我们重新构建镜像,再烧录到板卡启动,就可以达到我们想要的banner效果。

注意

如果添加的是shell脚本,需要在创建文件后修改文件权限为775,否则在根文件系统中可能无法执行。

12.7.4. 重新打包根文件系统镜像

在对根文件系统的构建脚本做出修改之后,我们要重新打包debian-xfce/lite-rootfs.img镜像。

  • 如果我们没有修改live build的配置文件,则不需要重复构建基础镜像部分。如果修改了配置文件,则需重新构建,要手动删除基础镜像压缩包,然后使用mk-base-debian.sh脚本构建。

1
2
3
4
5
# 删除基础镜像压缩包
rm linaro-*-alip-*.tar.gz

#构建基础镜像
mk-base-debian.sh
  • 如果修改了mk-buster-rootfs.sh、overlay、overlay-debug、overlay-firmware、packages的内容,则需要执行

1
2
#构建完整的根文件系统镜像
./mk-buster-rootfs.sh

12.8. 使用LubanCat-SDK一键构建

在完成 搭建构建环境 以后,我们也可以直接使用一键构建命令, 就可以构建我们提供的定制根文件系统镜像了, 还可以借助SDK的镜像打包功能,将U-boot、内核等部分也一并打包成一个完整的系统镜像。

12.8.1. SDK配置文件说明

LubanCat板卡的SDK配置文件在device/rockchip/.chips目录内按照处理器型号存放,以LubanCat_CPU型号_系统类型_系统版本_defconfig命名

由于LubanCat_Linux_Generic_SDK的配置系统,可以处理各模块和参数的依赖关系,此处存放的仅为最小配置文件, 完整的SDK配置文件在SDK构建时会自动生成,并保存在output/.config中

12.8.2. SDK配置文件说明(旧版)

LubanCat板卡的SDK配置文件存放在device/rockchip/rk356x/目录内,以BoardConfig-LubanCat-CPU型号-系统类型-系统版本.mk来命名

我们来看Debain根文件系统的配置文件,这里以BoardConfig-LubanCat-RK3568-debian-xfce.mk为例, 主要说明与Debain根文件相关的设置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# SOC
export RK_SOC=rk356x

# build.sh save 打包时名称
export RK_PKG_NAME=lubancat-${RK_UBOOT_DEFCONFIG}

# 定义默认rootfs为 debian
export RK_ROOTFS_SYSTEM=debian

# 设置 debian 版本 (10: buster)
export RK_DEBIAN_VERSION=10

# 定义默认rootfs是否为桌面版  xfce :桌面版       lite :控制台版 xfce-full :桌面版+推荐软件包
export RK_ROOTFS_TARGET=xfce

# 定义默认rootfs是否添加DEBUG工具  debug :添加  none :不添加
export RK_ROOTFS_DEBUG=debug
  • RK_SOC:定义SOC类型,在./mk-buster-rootfs.sh中使用

  • RK_PKG_NAME:定义镜像发布打包时的名称

  • RK_ROOTFS_SYSTEM:定义根文件系统类型

  • RK_DEBIAN_VERSION:定义Debian发行版,目前只支持buster

  • RK_ROOTFS_TARGET:定义根文件系统版本

  • RK_ROOTFS_DEBUG: 是否添加rockchip overlay_debug

12.8.3. build.sh中的自动构建脚本

Debain根文件系统的一键构建功能,主要由build.sh脚本中的以下函数实现

注意

以下内容中对function build_debian()的描述仅适用于旧版LubanCat-SDK

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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========="
    echo "RK_DEBIAN_VERSION: $RK_DEBIAN_VERSION"
    echo "RK_ROOTFS_TARGET: $RK_ROOTFS_TARGET"
    echo "RK_ROOTFS_DEBUG: $RK_ROOTFS_DEBUG"
    echo " "

    cd debian

    if [[ "$RK_DEBIAN_VERSION" == "stretch" || "$RK_DEBIAN_VERSION" == "9" ]]; then
        RELEASE='stretch'
    elif [[ "$RK_DEBIAN_VERSION" == "buster" || "$RK_DEBIAN_VERSION" == "10" ]]; then
        RELEASE='buster'
    elif [[ "$RK_DEBIAN_VERSION" == "bullseye" || "$RK_DEBIAN_VERSION" == "11" ]]; then
        RELEASE='bullseye'
    else
        echo -e "\033[36m please input the os type,stretch or buster...... \033[0m"
    fi

    if [ ! -e linaro-$RK_ROOTFS_TARGET-rootfs.img ]; then
        echo "[ No linaro-$RK_ROOTFS_TARGET-rootfs.img, Run Make Debian Scripts ]"
        if [ ! -e linaro-$RELEASE-$RK_ROOTFS_TARGET-alip-*.tar.gz ]; then
            echo "[ build linaro-$RELEASE-$RK_ROOTFS_TARGET-alip-*.tar.gz ]"
            RELEASE=$RELEASE TARGET=$RK_ROOTFS_TARGET ARCH=$ARCH ./mk-base-debian.sh
        fi

        RELEASE=$RELEASE TARGET=$RK_ROOTFS_TARGET VERSION=$RK_ROOTFS_DEBUG SOC=$RK_SOC ARCH=$ARCH ./mk-rootfs.sh
    else
        echo "[    Already Exists IMG,  Skip Make Debian Scripts    ]"
        echo "[ Delate linaro-$RK_ROOTFS_TARGET-rootfs.img To Rebuild Debian IMG ]"
    fi

    finish_build
}

其工作流程如下

  • 使用echo命令打印相关配置信息。

  • 判断linaro-$RK_ROOTFS_TARGET-rootfs.img是否存在( $RK_ROOTFS_TARGET 为配置文件中定义的是否为桌面版),存在则跳过构建过程,不存在则运行构建命令。根文件系统构建时间很长,不希望频繁构建根文件系统或使用已经构建好的根文件系统镜像。

  • 判断构建基础镜像是否存在,不存在则构建基础镜像,若存在则跳过基础镜像构建过程。除了首次构建外,我们一般不会去修改基础镜像。

  • 以基础镜像为基础,添加rockchip overlay。

  • 打包完整镜像。

12.8.4. 编译前的准备工作

在编译开始前,首先要确保SDK的配置文件与要编译的rootfs一致, 如果当前配置文件与要编译的rootfs不一致,需要先切换配置文件。

1
2
3
4
5
6
7
8
# 选择SDK配置文件-旧版SDK直接指定
./build.sh BoardConfig-xxx-debian-版本.mk

# 选择SDK配置文件-新版SDK直接指定
./build.sh LubanCat_xxx_debian_版本_defconfig

# 选择SDK配置文件-按序号选择
./build.sh lunch

在设置正确的配置文件后,我们就可以进行下一步的构建工作了

12.8.5. 单独构建rootfs并打包

我们使用以下命令构建Debian根文件系统,

1
2
# 构建Debian
./build.sh debian

编译生成的rootfs镜像为linaro-$RK_ROOTFS_TARGET-rootfs.img,同时被软链接到rockdev/rootfs.ext4。

注意

只有不存在linaro-$RK_ROOTFS_TARGET-rootfs.img时,才会重新构建Debian根文件系统。如果修改了Debian根文件系统的配置文件或构建脚本,要先将buntu/linaro-$RK_ROOTFS_TARGET-rootfs.img手动删除后再重新构建。

构建完成后就可以将独立的分区表、boot.img、uboot.img等分区镜像打包成一个完整的镜像了。

在执行以下操作前,请确保已经事先完成了U-Boot编译、Kernel编译、以及刚刚完成的单独构建rootfs的过程。

确保无误后,执行以下命令

1
2
3
4
5
# 固件打包
./mkfirmware.sh

# 生成update.img
./build.sh updateimg

打包完成后,生成的镜像为rockdev/update.img,我们可以使用烧录工具将update.img烧录到板卡eMMC中或SD卡中。

12.8.6. 一键构建完整镜像

在设置正确的配置文件后,执行以下命令就可以一键完成U-Boot、Kernel和rootfs的编译,并生成update.img镜像

1
2
# 一键编译
./build.sh

打包完成后,生成的镜像为rockdev/update.img,我们可以使用烧录工具将update.img烧录到板卡eMMC中或SD卡中。