一、引言

作为一名嵌入式开发人员, 看到好多同僚 一直习惯于 在 windows 下安装一个虚拟机。虚拟机里面跑 ubuntu; 然后在里面搭建各种开发环境。里面各种操作,让我有点眼花缭乱。不能说他们的方式不好,只能说 我个人能力不足,驾驭不了这么复杂的工况。

嵌入式开发中不同的平台要求的编译环境可能都不一样。例如同样的 瑞芯微家的 rk3128 和 rk3399 他们编译所要求的环境也不一样。 如果每个平台都需要装一个虚拟机,是不是 磁盘空间首先就让人抓狂啊。而且由于虚拟机会消耗一部分cpu. 这样也加大了 cpu 的负载。

那有没有一种其他的思路呢? 答案肯定是有的。

  • 我们可以使用 docker, 来搭建我们的开发环境。
  • 首先声明一下,我这里不使用windows.
  • 目前我的 host os : ubuntu 24.04

二、docker 环境

1. docker 安装

docker 如何在 ubuntu 上安装, 网上有大量教程。请自行查阅,这里不再废话。

2. docker 换源

2.1 创建/编辑

  • /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker-0.unsee.tech",
    "https://docker.m.daocloud.io"
  ],
  "live-restore": true,
  "features": { "buildkit": true }
}

2.2 重置并重启

sudo systemctl daemon-reload
sudo systemctl restart docker

3. 编写docker 配置文件

  • Dockerfile.enhanced
FROM ubuntu:18.04

USER root

# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive \
    LANG=C.UTF-8 \
    LC_ALL=C.UTF-8 \
    TZ=Asia/Shanghai

# 设置构建时参数,允许在容器内创建硬链接
ARG DOCKER_BUILDKIT=1


# 使用国内镜像源加速下载
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
    sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

# 更新软件列表并安装所有必要的包(一次性安装,减少层数)
RUN apt-get update && apt-get install -y \
    git-core \
    gnupg \
    flex \
    bison \
    gperf \
    build-essential \
    zip \
    unzip \
    curl \
    zlib1g-dev \
    gcc-multilib \
    g++-multilib \
    libc6-dev-i386 \
    lib32ncurses5-dev \
    x11proto-core-dev \
    libx11-dev \
    lib32z-dev \
    ccache \
    libgl1-mesa-dev \
    libxml2-utils \
    xsltproc \
    tzdata \
    locales \
    sudo \
    gawk bc python libssl-dev time\
    git-core gnupg flex bison gperf build-essential zip \
    curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
    lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev \
    ccache libgl1-mesa-dev libxml2-utils xsltproc unzip \
    expect moreutils  coreutils expect-dev\
    wget cpio rsync patchelf \
    && rm -rf /var/lib/apt/lists/*

# 设置时区
RUN ln -fs /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Asia/Shanghai" > /etc/timezone && \
    dpkg-reconfigure -f noninteractive tzdata

# 配置 locale
RUN locale-gen en_US.UTF-8 && \
    update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

# 创建开发用户
RUN useradd -m -s /bin/bash developer && \
    echo 'developer:password' | chpasswd && \
    usermod -aG sudo developer && \
    echo 'developer ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

# 设置工作目录
WORKDIR /workspace

# 创建一些必要的目录并设置权限
RUN mkdir -p /workspace && \
    chown developer:developer /workspace

# 切换用户
USER developer

# 设置默认命令
CMD ["/bin/bash"]

4. 编译docker 镜像

docker build -f Dockerfile.enhanced -t hai_zhuo_rk3128_ubuntu18-dev .

# 进入该镜像
docker run -it --name hai_zhuo_rk3128 hai_zhuo_rk3128_ubuntu18-dev

5. 保存镜像为 tar 文件

# 查看现有镜像
docker images


# 或者使用更高效的压缩
docker save hai_zhuo_rk3128_ubuntu18-dev:latest | xz -z > rk3128-build-env.tar.xz

6. 打包发布

将 rk3128-build-env.tar.xz 和下面的命令 需要得人,就可以直接用。

# 创建运行脚本
cat > run.sh << 'EOF'
#!/bin/bash

echo "=== RK3128 开发环境 ==="

# 检查 Docker 是否安装
if ! command -v docker &> /dev/null; then
    echo "错误: 请先安装 Docker"
    echo "安装命令: curl -fsSL https://get.docker.com | sh"
    exit 1
fi

# 加载镜像
echo "正在加载开发环境镜像..."
docker load -i rk3128-build-env.tar.xz

# 创建项目目录
mkdir -p workspace

# 运行开发环境
echo "正在启动 RK3128 开发环境..."
echo "项目文件保存在 ./workspace 目录中"

cd workspace

docker run -it --privileged \
  --tmpfs /tmp:exec \
  --mount type=tmpfs,destination=/var/tmp \
  -v $(pwd):/workspace:rshared \
  -w /workspace \
  hai_zhuo_rk3128_ubuntu18-dev

echo "开发环境已退出"
EOF

7. 创建快捷进入 docker 脚本

#!/bin/bash
CONTAINER_NAME="my_rk3128_dev"

# 检查容器是否存在
if docker ps -a | grep -q $CONTAINER_NAME; then
    echo "进入已存在的开发环境..."
    docker start $CONTAINER_NAME
    docker exec -it $CONTAINER_NAME bash
else
    echo "创建新的开发环境..."
    docker run -it \
      --name $CONTAINER_NAME \
      --privileged \
      --tmpfs /tmp:exec \
      --mount type=tmpfs,destination=/var/tmp \
      -v $(pwd):/workspace:rshared \
      -w /workspace \
      hai_zhuo_rk3128_ubuntu18-dev
fi

运行:

chmod +x enter_dev.sh
./enter_dev.sh

8. 完整清理流程

docker 如果不想用,可以将其清掉

# 查看所有镜像
docker images

# 查看详细镜像信息
docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}\t{{.Size}}\t{{.CreatedSince}}"

# 查看镜像磁盘使用情况
docker system df

# 1. 停止所有容器
docker stop $(docker ps -aq) 2>/dev/null

# 2. 删除所有容器
docker rm $(docker ps -aq) 2>/dev/null

# 3. 删除所有悬空镜像
docker images -f "dangling=true" -q | xargs docker rmi -f 2>/dev/null

# 4. 删除所有镜像
docker rmi -f $(docker images -aq) 2>/dev/null

# 5. 清理构建缓存
docker builder prune -f

# 6. 清理所有未使用的资源
docker system prune -a -f --volumes

三、编译 / 烧录 rk3128

1. 编译打包镜像


# 进入 docker 环境
(base) leo@leo:~/sda_1.6TB/hai_zhuo/rk3128$ ./docker_env/init.sh 
进入已存在的开发环境...
my_rk3128_dev
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.



# 进入 源码目录
developer@c8aa26115a95:/workspace$ cd RK3128/



# 导入环境变量
developer@c8aa26115a95:/workspace/RK3128$ ./build.sh lunch
	processing option: lunch
	You're building on Linux
	Lunch menu...pick a combo:
	1. default BoardConfig.mk
	2. BoardConfig.mk
	3. BoardConfig_debian.mk
	4. BoardConfig_rp3128_buildroot.mk
	Which would you like? [0]: 3
	switching to board: /workspace/RK3128/device/rockchip/rk3128/BoardConfig_rp3128_buildroot.mk




# 开始编译
developer@c8aa26115a95:/workspace/RK3128$ ./build.sh
Make firmware OK!
------ OK ------
********RKImageMaker ver 1.66********
Generating new image, please wait...
Writing head info...
Writing boot file...
Writing firmware...
Generating MD5 data...
MD5 data generated successfully!
New image generated successfully!
Making update.img OK.
/workspace/RK3128
Make update image ok!



# 打包镜像
developer@c8aa26115a95:/workspace/RK3128$ ./build.sh  updateimg
processing option: updateimg
Make update.img
start to make update.img...
Android Firmware Package Tool v1.66
------ PACKAGE ------
Add file: ./package-file
Add file: ./package-file done,offset=0x800,size=0x28f,userspace=0x1
Add file: ./Image/MiniLoaderAll.bin
...
Add CRC...
Make firmware OK!
------ OK ------
********RKImageMaker ver 1.66********
Generating new image, please wait...
Writing head info...
Writing boot file...
Writing firmware...
Generating MD5 data...
MD5 data generated successfully!
New image generated successfully!
Making update.img OK.
/workspace/RK3128
Make update image ok!

2. 烧录

在这里插入图片描述

在这里插入图片描述

首先按住 MASKROM 升级按键 不松开, 按一下 复位按键 , 进入 MASKROM 模式。

lsusb

Bus 001 Device 011: ID 2207:310c Fuzhou Rockchip Electronics Company RK3126/RK3128 in Mask ROM mode
(base) leo@leo:~/sda_1.6TB/hai_zhuo/rk3128/RK3128$ sudo ./rkflash.sh 
[sudo] leo 的密码: 
flash all images as default
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
Loading loader...
Support Type:RK312A	Loader ver:2.56	Loader Time:2025-10-26 15:51:30
Upgrade loader ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
directlba=1,first4access=1,gpt=1
Write gpt...
Write gpt ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
directlba=1,first4access=1,gpt=1
Download uboot start...(0x00002000)
Download image ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
directlba=1,first4access=1,gpt=1
Download trust start...(0x00003000)
Download image ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
directlba=1,first4access=1,gpt=1
Download boot start...(0x00004800)
Download image ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
directlba=1,first4access=1,gpt=1
Download recovery start...(0x00008800)
Download image ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
directlba=1,first4access=1,gpt=1
Download misc start...(0x00004000)
Download image ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
directlba=1,first4access=1,gpt=1
Download oem start...(0x00012800)
Download image ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
directlba=1,first4access=1,gpt=1
Download userdata start...(0x0021c800)
Download image ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
directlba=1,first4access=1,gpt=1
Download rootfs start...(0x0001c800)
Download image ok.
Program Data in /home/leo/sda_1.6TB/hai_zhuo/rk3128/RK3128/tools/linux/Linux_Upgrade_Tool/Linux_Upgrade_Tool
Reset Device OK.
(base) leo@leo:~/sda_1.6TB/hai_zhuo/rk3128/RK3128$
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐