Skip to content

介绍

深圳地瓜机器人有限公司官网:https://developer.d-robotics.cc

RDK X5 是一款全功能开发板,具有 10Tops 端侧推理算力与 8 核 ARM A55 处理能力,支持 2 路 MIPI Camera 接入,4 路 USB3.0 接口。通过搭配丰富的传感器和扩展组件,为开发者提供了灵活的硬件扩展和连接选项。

这里以 deepin 作为例子,讲解镜像的制作,到烧录镜像,运行系统。

技术扫盲

Linux系统是什么?

深入理解 Linux 系统的核心

Linux 系统与发行版的关系——从安卓到 deepin 的多样性

引导流程

U-Boot与GRUB引导机制对比

系统镜像类型:ISO vs IMG

ISO与IMG镜像的全面对比

安装基础工具链

bash
sudo apt update -y
sudo apt-get install -y qemu-user-static binfmt-support mmdebstrap arch-test usrmerge usr-is-merged fdisk dosfstools
sudo systemctl restart systemd-binfmt  # 重启 binfmt 服务加载ARM支持
点击查看解析

异架构模拟 (qemu-user-static + binfmt-support)

  • 核心原理
    • qemu-user-static 提供静态编译的跨架构模拟器(如 qemu-aarch64-static),允许在x86主机直接执行ARM程序。
    • binfmt-support 向内核注册二进制格式解释器,自动触发QEMU对ARM程序转译(无需手动指定)。
  • 验证方法
    bash
    # 查看已注册的架构支持
    ls /proc/sys/fs/binfmt_misc/
    
    # 测试ARM程序执行
    qemu-aarch64-static /path/to/arm64-binary

根文件系统构建

使用 mmdebstrap 创建基础系统

bash
mkdir -p rootfs
sudo mmdebstrap \
    --hook-dir=/usr/share/mmdebstrap/hooks/merged-usr \
    --include="ca-certificates,locales,sudo,apt,adduser,polkitd,systemd,network-manager,dbus-daemon,apt-utils,bash-completion,curl,vim,bash,deepin-keyring,init,ssh,net-tools,iputils-ping,lshw,iproute2,iptables,procps,wpasupplicant,dmidecode,ntpsec-ntpdate,linux-firmware" \
    --architectures=arm64 \
    beige \
    rootfs \
    "deb https://community-packages.deepin.com/beige/ beige main commercial community" \
    "deb https://proposed-packages.deepin.com/beige-testing/ unstable/25 main commercial community"
点击查看解析

深入理解 Linux 系统的核心

基本命令与权限

bash
sudo mmdebstrap
  • sudo: 以管理员权限运行,因为创建根文件系统需要操作底层文件。
  • mmdebstrap: 一个高效的 Debian/Ubuntu 根文件系统构建工具,支持多架构和自定义配置。

钩子目录(合并 /usr 结构)

bash
--hook-dir=/usr/share/mmdebstrap/hooks/merged-usr
  • --hook-dir: 指定一个钩子脚本目录,用于在构建过程中执行自定义操作。
  • merged-usr: 钩子脚本确保文件系统采用 /usr 合并结构(即 /bin/sbin/lib 等目录符号链接到 /usr 下的对应目录),这是现代 Linux 系统的常见实践。

3. 包含的软件包

bash
--include="ca-certificates,locales,sudo,apt,...,dmidecode,ntpsec-ntpdate,linux-firmware"
  • --include: 指定要安装的基础软件包列表,例如:
    • 系统工具: systemd(初始化系统)、polkitd(权限管理)、apt(包管理工具)。
    • 网络工具: network-manager(网络管理)、ssh(远程登录)、net-toolsiproute2wpasupplicant(无线网络)。
    • 调试工具: vim(文本编辑)、curl(网络请求)、iputils-ping(网络测试)、dmidecode(硬件信息)。
    • 驱动与固件: linux-firmware(硬件驱动固件)。
    • 本地化与安全: locales(语言支持)、ca-certificates(HTTPS 证书)。

目标架构

bash
--architectures=arm64
  • --architectures=arm64: 指定生成的根文件系统为 ARM64 架构(适用于树莓派、嵌入式设备等)。

发行版与输出目录

bash
beige
rootfs
  • beige: deepin 的版本代号。
  • rootfs: 生成的根文件系统将保存在当前目录的 rootfs 文件夹中。

软件源配置

bash
"deb https://community-packages.deepin.com/beige/ beige main commercial community"
"deb https://proposed-packages.deepin.com/beige-testing/ unstable/25 main commercial community"

磁盘镜像制作

创建空白镜像并分区

bash
dd if=/dev/zero of=deepin-rdk-x5.img bs=1M count=4096
sudo fdisk deepin-rdk-x5.img << EOF
n
p
1

+256M
t
c
n
p
2


w
EOF
点击查看解析
bash
sudo fdisk deepin-rdk-x5.img << EOF
n       # 新建分区
p       # 主分区
1       # 分区号1
        # 起始扇区默认(由 fdisk 自动选择,通常为 2048 或 8192,保证对齐)
+256M   # 大小256MB
t       # 更改分区类型
c       # 类型设为 FAT32 (LBA)(类型代码 `0c` 的简写)
n       # 新建第二个分区
p       # 主分区
2       # 分区号2
        # 起始扇区默认(自动紧接第一个分区结束位置)
        # 结束扇区默认(占用剩余空间)
w       # 写入分区表并退出
EOF
  • fdisk:经典磁盘分区工具,支持MBR分区表
  • << EOF:Here Document语法,将后续内容作为标准输入传递给命令

关键概念说明

🔹 fdisk的作用 磁盘分区编辑器,可创建/删除分区、修改分区类型。此处操作对象是镜像文件而非物理磁盘。

🔹 Here Document技巧<< EOFEOF之间的内容会作为标准输入传递给前序命令,实现自动化交互操作,避免手动输入。

🔹 分区类型选择c类型对应FAT32,这是启动分区的标准要求。第二个分区通常使用Linux原生类型(默认83),但此处未显式设置。


最终成果

生成包含两个分区的镜像文件:

deepin-rdk-x5.img
├─p1 : 300MiB FAT32 (启动分区)
└─p2 : 3.7GiB Linux分区

后续可通过 losetup 挂载镜像,进行文件系统格式化和系统文件写入。

格式化与挂载分区

bash
# 绑定到回环设备
LOOP=$(sudo losetup -Pf --show deepin-rdk-x5.img)
# 格式化引导分区
sudo mkfs.fat -F32 "${LOOP}p1"
# 修改 FAT 文件系统卷标为 CONFIG
sudo fatlabel "${LOOP}p1" CONFIG
# 格式化根分区
sudo mkfs.ext4 "${LOOP}p2"
# 将 ext4 分区的卷标(Label)设置为 root
sudo e2label "${LOOP}p2" root

mkdir tmp
# 挂载根分区
sudo mount "${LOOP}p2" tmp
# 复制根文件系统
sudo cp -a rootfs/* tmp
# 创建 config 目录
sudo mkdir tmp/boot/config

# 挂载 /dev 目录,允许在 chroot 环境中访问设备文件
sudo mount --bind /dev tmp/dev

# 挂载 proc 文件系统提供了一个接口来访问内核状态信息,如进程列表等
sudo mount -t proc chproc tmp/proc

# 挂载 sysfs 提供了访问内核模块、硬件设备和其他系统级别的信息
sudo mount -t sysfs chsys tmp/sys

# 挂载临时文件系统
sudo mount -t tmpfs -o "size=99%" tmpfs tmp/tmp
sudo mount -t tmpfs -o "size=99%" tmpfs tmp/var/tmp

# 挂载宿主机的 DNS 配置
sudo mount --bind /etc/resolv.conf tmp/etc/resolv.conf

# 挂载 devpts 文件系统负责为伪终端提供设备节点,支持文本用户界面和shell会话
sudo mount -t devpts devpts tmp/dev/pts

安装 RDK X5 官方提供的软件包

bash
sudo chroot tmp bash

(chroot) echo "deb [trusted=yes] http://archive.d-robotics.cc/ubuntu-rdk-x5 jammy main" | tee /etc/apt/sources.list.d/rdk-x5.list
(chroot) apt update
(chroot) apt install -y hobot-boot linux-base
# 这一段 linux-base 里面包含了 perf 命令,hobot-utils也包含了 perf 命令,这里使用 hobot-utils 提供的,下载 deb 用 dpkg 强制覆盖来安装。
(chroot) apt download --allow-unauthenticated hobot-utils && dpkg -i --force-overwrite ./*.deb && rm ./*.deb
# 内核、设备树、引导、驱动等额外软件包
(chroot) apt install -y \
            hobot-audio-config hobot-camera hobot-configs \
            hobot-display hobot-dnn hobot-dtb hobot-io hobot-io-samples \
            hobot-kernel-headers hobot-miniboot hobot-models-basic hobot-multimedia \
            hobot-multimedia-dev hobot-multimedia-samples hobot-sp-samples \
            hobot-spdev hobot-wifi
(chroot) rm /etc/apt/sources.list.d/rdk-x5.list
(chroot) exit

编辑分区表

bash
(chroot) tee /etc/fstab << EOF
LABEL=CONFIG  /boot/config  vfat    defaults,,x-systemd.automount          0       2
LABEL=root  /               ext4    defaults,rw,errors=remount-ro,x-systemd.growfs  0       1
EOF

设置启动分区

boot 标志是合法的,表示将该分区设为“活动分区”(用于 Legacy BIOS 引导)。

bash
sudo parted deepin-rdk-x5.img set 2 boot on

系统个性化配置

用户与本地化

bash
# 创建用户并设置密码
(chroot) useradd -m deepin && usermod -aG sudo deepin
(chroot) echo 'deepin:deepin' | chpasswd
(chroot) chsh -s /bin/bash deepin
bash
# 取消注释
(chroot) sed -i -E 's/#[[:space:]]*(en_US.UTF-8[[:space:]]+UTF-8)/\1/g' /etc/locale.gen
(chroot) sed -i -E 's/#[[:space:]]*(zh_CN.UTF-8[[:space:]]+UTF-8)/\1/g' /etc/locale.gen
# 生成语言设置
(chroot) locale-gen
bash
# 设置中文
(chroot) tee /etc/locale.conf << EOF
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN
EOF
bash
# 设置本地上海时区
(chroot) ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
bash
# 设置主机名
(chroot) echo "deepin-arm64" | tee /etc/hostname

清理与压缩

清理软件包缓存

bash
(chroot) apt clean && rm -rf /var/cache/apt/archives/*
(chroot) exit

卸载挂载点

bash
sudo umount -l tmp

强制文件系统检查

bash
sudo e2fsck -f "${LOOP}p2"

解除回环设备

bash
# 解除回环设备
sudo losetup -D $LOOP

烧录镜像

下载烧录工具

Windows

官网 https://etcher.download/download-etcher/ 下载 https://github.com/balena-io/etcher/releases/download/v1.18.11/balenaEtcher-Setup-1.18.11.exe

deepin

运行系统

将 TF 卡插入读卡器中。选择前面制作好的,deepin-rdk-x5.img 镜像,选择读卡器,点击烧录。

等待烧录成功。

这里如果没有安装图形界面,HDMI 连接屏幕也无法调试。需要用串调试

参考:https://developer.d-robotics.cc/rdk_doc/Quick_start/remote_login

远程工具

Windows

MobaXterm 工具

当串口USB转接板首次插入电脑时,需要安装串口驱动。驱动程序可从资源中心的工具子栏目获取。驱动安装完成后,设备管理器可正常识别串口板端口,如下图:

deepin

从应用商店搜索 WindTerm 或者命令行安装。或者 cutecom、putty 也可以。

bash
sudo apt install io.github.kingtoolbox

串口通信这里在 deepin 上需要内核模块支持。

开发板串口线跟电脑正确连接。deepin 上需要加载内核模块 ch341,这里通过命令行查看,出现以下信息说明加载成功。

bash
╰─❯ lsmod | grep ch341                                                                                    ─╯
ch341                  24576  1

如果没有用命令行加载

bash
sudo modprobe ch341

通过串口连接工具上选择串口,ttyUSB0,根据实际的选择。

设置串口配置参数,如下:

配置项参数值
波特率(Baud rate)RDK X3 (921600),RDK X5 (115200)
数据位(Data bits)8
奇偶校验(Parity)None
停止位(Stop bits)1
流控(Flow Control)

上电,串口工具能看到输出,等待加载。

看到login信息可以进行登录,成功进入系统了。

bash
bluesky-PC login: deepin
密码: 
Linux bluesky-PC 6.1.83 #1 SMP PREEMPT Tue Feb 11 00:25:16 CST 2025 aarch64
Welcome to deepin 25 GNU/Linux

    * Homepage: https://www.deepin.org/

    * Bugreport: https://bbs.deepin.org/


deepin@bluesky-PC:~$

安装桌面环境

命令行界面配置网络,连接WIFI,如果通过网线连接可以忽略。

bash
export TERM=linux
sudo nmtui

选择启用连接,选择需要连接的 WIFI 输入密码,Esc 键退出。

bash
# 联网成功后同步下时间服务器
sudo ntpdate pool.ntp.org

安装桌面环境相关的包,以下安装的软件包也可以在制作根文件系统阶段安装。另外 img 镜像需要设置更大的空间。

bash
export DEBIAN_FRONTEND=noninteractive
sudo apt update
# DDE 桌面环境相关的包
sudo apt install deepin-desktop-environment-{base,cli,core,extras}
# 这里安装完系统lightdm是被禁用自启动,允许自启动重启
sudo systemctl enable lightdm
# 玲珑环境
sudo apt install deepin-desktop-environment-ll
# UOS AI 、火狐浏览器
sudo apt install uos-ai firefox

# 如果需要使用 treeland 窗管
sudo apt install treeland ddm
# 禁用 lightdm 自启动,允许 ddm 自启动
sudo systemctl disable lightdm && sudo systemctl enable ddm
# 停止 lightdm,启动 ddm
sudo systemctl stop lightdm && sudo systemctl enable ddm

制作镜像脚本

bash
tee build.sh <<EOF
#!/bin/bash

set -xe

DISKIMG="deepin-rdk-x5.img"
BUILD_TYPE="$1"
ROOTFS="rootfs"
IMAGE_SIZE=$( [ "$BUILD_TYPE" == "desktop" ] && echo 12288 || echo 4096 )

function run_command_in_chroot()
{
    rootfs="$1"
    command="$2"
    sudo chroot "$rootfs" /usr/bin/env bash -e -o pipefail -c "export DEBIAN_FRONTEND=noninteractive && $command"
}

function setup_chroot_environment() {
    local TMP="$1"
    sudo mount --bind /dev "$TMP/dev"
    sudo mount -t proc chproc "$TMP/proc"
    sudo mount -t sysfs chsys "$TMP/sys"
    sudo mount -t tmpfs -o "size=99%" tmpfs "$TMP/tmp"
    sudo mount -t tmpfs -o "size=99%" tmpfs "$TMP/var/tmp"
    sudo mount --bind /etc/resolv.conf "$TMP/etc/resolv.conf"
    sudo mount -t devpts devpts "$TMP/dev/pts"
}

sudo apt update -y
sudo apt-get install -y qemu-user-static binfmt-support mmdebstrap arch-test usrmerge usr-is-merged fdisk dosfstools
sudo systemctl restart systemd-binfmt

if [ ! -d "$ROOTFS" ]; then
    mkdir -p $ROOTFS
    sudo mmdebstrap \
        --hook-dir=/usr/share/mmdebstrap/hooks/merged-usr \
        --skip=check/empty \
        --include="ca-certificates,locales,sudo,apt,adduser,polkitd,systemd,network-manager,dbus-daemon,apt-utils,bash-completion,curl,vim,bash,deepin-keyring,init,ssh,net-tools,iputils-ping,lshw,iproute2,iptables,procps,wpasupplicant,dmidecode,ntpsec-ntpdate,linux-firmware" \
        --components="main,commercial,community" \
        --architectures=arm64 \
        beige \
        $ROOTFS \
	"deb https://community-packages.deepin.com/beige/ beige main commercial community" \
        "deb https://proposed-packages.deepin.com/beige-testing/ unstable/25 main commercial community"

    if [[ "$BUILD_TYPE" == "desktop" ]];
    then
        setup_chroot_environment $ROOTFS
        run_command_in_chroot $ROOTFS "apt update -y && apt install -y \
            deepin-desktop-environment-core \
            deepin-desktop-environment-base \
            deepin-desktop-environment-cli \
            deepin-desktop-environment-extras \
            firefox \
            ddm \
            treeland"
        run_command_in_chroot $ROOTFS "
        systemctl disable lightdm
        systemctl enable ddm"
        umount -l $ROOTFS
    fi
fi

dd if=/dev/zero of=$DISKIMG bs=1M count=$IMAGE_SIZE
sudo fdisk $DISKIMG << EOF
n
p
1

+256M
t
c
n
p
2


w
EOF

LOOP=$(sudo losetup -Pf --show $DISKIMG)
sudo mkfs.fat -F32 "${LOOP}p1"
sudo fatlabel "${LOOP}p1" CONFIG
sudo mkfs.ext4 "${LOOP}p2"
sudo e2label "${LOOP}p2" root

TMP=tmp
mkdir -p $TMP
sudo mount "${LOOP}p2" $TMP
sudo cp -a $ROOTFS/* $TMP

setup_chroot_environment $TMP

run_command_in_chroot $TMP "echo \"deb [trusted=yes] http://archive.d-robotics.cc/ubuntu-rdk-x5 jammy main\" | tee /etc/apt/sources.list.d/rdk-x5.list"
run_command_in_chroot $TMP "apt update"
run_command_in_chroot $TMP "apt install -y hobot-boot linux-base"
run_command_in_chroot $TMP "apt download --allow-unauthenticated hobot-utils && dpkg -i --force-overwrite ./*.deb && rm ./*.deb"
run_command_in_chroot $TMP " apt install -y \
            hobot-audio-config hobot-camera hobot-configs \
            hobot-display hobot-dnn hobot-dtb hobot-io hobot-io-samples \
            hobot-kernel-headers hobot-miniboot hobot-models-basic hobot-multimedia \
            hobot-multimedia-dev hobot-multimedia-samples hobot-sp-samples \
            hobot-spdev hobot-wifi"
run_command_in_chroot $TMP "rm /etc/apt/sources.list.d/rdk-x5.list"

sudo tee $TMP/etc/fstab << EOF
LABEL=CONFIG  /boot/config  vfat    defaults,,x-systemd.automount          0       2
LABEL=root  /               ext4    defaults,rw,errors=remount-ro,x-systemd.growfs  0       1
EOF

sudo parted $DISKIMG set 2 boot on

run_command_in_chroot $TMP "useradd -m deepin && usermod -aG sudo deepin"
run_command_in_chroot $TMP "echo 'deepin:deepin' | chpasswd"
run_command_in_chroot $TMP "chsh -s /bin/bash deepin"

run_command_in_chroot $TMP "sed -i -E 's/#[[:space:]]*(zh_CN.UTF-8[[:space:]]+UTF-8)/\1/g' /etc/locale.gen"
run_command_in_chroot $TMP "sed -i -E 's/#[[:space:]]*(en_US.UTF-8[[:space:]]+UTF-8)/\1/g' /etc/locale.gen"
run_command_in_chroot $TMP "locale-gen"

sudo tee $TMP/etc/locale.conf << EOF
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN
EOF

run_command_in_chroot $TMP "ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime"
echo "deepin-arm64" | sudo tee $TMP/etc/hostname

run_command_in_chroot $TMP "apt clean && rm -rf /var/cache/apt/archives/*"
sudo umount -l $TMP
sudo e2fsck -f "${LOOP}p2"
sudo losetup -D $LOOP
EOF
bash
chmod +x build.sh

构建不包含桌面环境的镜像

bash
./build.sh
bash
./build.sh desktop