HonestQiao · 11月30日 · 北京

【“星睿O6”AI PC开发套件评测】docker环境使用此芯SDK编译Orion O6系统镜像

在Radxa官方文档Orion O6此芯 SDK获取源代码页面,提示“SDK 在容器内运行时可能会遇到权限问题,建议使用实体机或虚拟机进行编译”。
但我平时喜欢用docker,为每个编译开发项目构建自己独立的SDK,避免对主系统产生影响和相互影响。
经过实际测试,是可以在docker环境中,使用此芯SDK编译Orion O6系统镜像。
我的主系统环境是Ubuntu 24.04:

cat /etc/issue
Ubuntu 24.04.3 LTS \n \l

下面是在此系统上,使用此芯SDK编译Orion O6系统镜像的具体过程。

一、repo安装

此芯SDK使用了repo来进行源码的管理,首先需要安装repo,使用如下命令即可:

# 主系统操作
mkdri ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

注意,因为使用到了storage.googleapis.com,最后设置代理,如:

# 主系统操作
export http_proxy=192.168.1.15:7890
export https_proxy=192.168.1.15:7890

二、获取此芯SDK源码

我在主系统下载此芯SDK源码,后面会挂载到docker中。
获取源码使用如下的指令操作:

# 主系统操作
mkdir -p ~/Projects/orion-o6/cix-sdk
cd ~/Projects/orion-o6/cix-sdk

repo init https://gitlab.com/cix-linux/linux_repo/cix-manifest.git
repo rsync

源码较大,需要较长时间。如果中途失败,还要重新执行。

后续如果要更新源码,直接使用repo sync即可。

三、建立专用docker容器

官方文档提示“此芯 SDK 仅支持在 Debian 11 / Ubuntu 22.04 系统上进行编译”,但是经过实测,可以在Debian 12上面正常编译。

首先,获取Debian 12的docker镜像:

# 主系统操作
docker pull docker.xuanyuan.me/library/debian:bookworm
docker images | grep debian

第二条命令,输出如下结果,表示获取正常:

docker.xuanyuan.me/library/debian                                        bookworm                               4ffc839c7aa5   2 months ago    117MB

然后,建立对应的docker容器,并使用前面获取的此芯SDK源码:

# 主系统操作
cd ~/Projects/orion-o6/cix-sdk
docker run --name orion_o6 -u root -it -v $(pwd):$(pwd) -w $(pwd) docker.xuanyuan.me/library/debian:bookworm /bin/bash

上面的命令,将把主机~/Projects/orion-o6/cix-sdk目录挂载到docker容器的~/Projects/orion-o6/cix-sdk,这样在内外,都可以用同样的目录操作,更加方便。

docker容器启动后,会进入容器的操作shell环境,可以直接exit退出。

要管理容器,可以用下面的命令:

# 主系统操作
# 停止专用容器
docker stop orion_o6

# 启动专用容器
docker start orion_o6

# 进入容器操作shell环境
docker exec -it orion_o6 bash

进入容器的操作shell环境,会有如下的提示符信息:

root@45bb20b58582:/home/honestqiao/Projects/orion-o6/cix-sdk

进入容器后的第一件事,就是切换apt源为国内源,以提高软件下载速度:

### 容器内操作
cat > /etc/apt/sources.list << EOF
deb http://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free
deb-src http://mirrors.ustc.edu.cn/debian/ bookworm main contrib non-free non-free-firmware

deb http://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb-src http://mirrors.ustc.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware

deb http://mirrors.ustc.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware
deb-src http://mirrors.ustc.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware

deb http://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware
deb-src http://mirrors.ustc.edu.cn/debian-security/ bookworm-security main contrib non-free non-free-firmware

deb http://archive.debian.org/debian/ stretch contrib main non-free
EOF

然后,更新系统,并安装必要的软件包:

### 容器内操作
apt update
apt install python3-full python-is-python3 p7zip meson apt-utils pip python3-mesonpy python3-ply
apt install -y debhelper build-essential devscripts fakeroot sudo
pip3 install --upgrade --force-reinstall 'meson==1.3.0' --break-system-packages

apt install bc bison cpio device-tree-compiler dosfstools doxygen dwarves fdisk flex gdisk golang android-sdk-libsparse-utils indent jigdo-file jq kmod libarchive-tools libffi-dev libglib2.0-dev-bin libncurses5 libssl-dev libtinfo5 libwayland-dev libxau-dev libxcb-present-dev libxcb-randr0 libxcb-randr0-dev mtools pigz pkg-config dh-python python3-mako python3-pyelftools rsync scons snapd u-boot-tools uuid-dev uuid-runtime wayland-protocols wget xorriso

再设置和检查python环境:

### 容器内操作
ln -s /usr/bin/python2.7 /usr/bin/python2

python -V
python2 -V
pip -V

最终的输出如下:

Python 3.11.2
Python 2.7.13
pip 23.0.1 from /usr/lib/python3/dist-packages/pip (python 3.11)

现在,docker环境,就建立好了,可以开始编译工作了。

四、此芯SDK编译

在编译之前,可以执行一下同步指令,以便将SDK更到新到新版本:

### 容器内操作
repo sync

如果是手册进行源码编译,需要先之下下面的命令:

### 容器内操作
. ./build-scripts/envtool.sh
newer_env

该命令会建立编译需要的基础环境。

然后,执行编译指令:

### 容器内操作
. ./build-scripts/envtool.sh
updateres
build radxa

如果出现git错误提示,可以执行下面的指令,设置权限:

### 容器内操作
git config --global --add safe.directory /home/honestqiao/Projects/orion-o6/cix-sdk/component/cix_opensource/gpu/gpu_kernel
git config --global --add safe.directory /home/honestqiao/Projects/orion-o6/cix-sdk/component/cix_opensource/gstreamer

如果执行build radxa出现如下的错误:

mount: /home/honestqiao/Projects/orion-o6/cix-sdk/output/cix_evb/debian_cc/mnt/ffmpeg: permission denied.

则,需要给容器设置权限。

使用exit退出现有的容器,然后执行:

# 主系统操作
docker commit orion_o6
docker stop orion_o6
docker rm orion_o6

# 用特权模式重新创建
docker run --name orion_o6 -u root -it --privileged -v $(pwd):$(pwd) -w $(pwd) docker.xuanyuan.me/library/debian:bookworm /bin/bash

如果执行build radxa出现如下的错误:

sh: 1: cannot create /dev/null: Permission denied
dh_auto_clean: error: redirect STDIN failed: Permission denied

则需要用proot来替代chroot执行:

### 容器内操作
sudo apt install proot
perl -pi -e 's#chroot "#proot -R "#g' build-scripts/build-*.sh
grep -rnE 'chroot|proot' build-scripts/

执行后输出:

build-scripts/build-ffmpeg.sh:58:    sudo proot -R "${PATH_DEBIAN_COMPILE_debian_cc}" "/build-ffmpeg.sh"
build-scripts/build-ffmpeg.sh:97:    sudo proot -R "${PATH_DEBIAN_COMPILE_debian_cc}" "/clean.sh"
build-scripts/build-debian.sh:123:# do not produce initrd in chroot environment
build-scripts/build-debian.sh:187:# do not trigger to produce initrd in chroot environment
build-scripts/build-debian.sh:299:        sudo proot -R "${PATH_DEBIAN}" "/systemd_target.sh"
build-scripts/build-debian.sh:785:        sudo proot -R "${PATH_DEBIAN}" "/install.sh"
build-scripts/build-debian.sh:910:    sudo chroot .
build-scripts/build-debian.sh:939:    sudo chroot .

处理完成后,再次进行编译:

### 主系统操作
docker exec -it orion_o6 bash

### 容器内操作
. ./build-scripts/envtool.sh
updateres
build radxa

编译完成后,最终的编译结果在output/cix_evb/images目录内:

  • output/cix_evb/images/linux-fs.sdcard:系统镜像
  • output/cix_evb/images/cix_debian.iso:修改后的 Debian 安装 ISO
  • output/cix_evb/images/cix_flash_all_O6.bin:BIOS 镜像

其中的cix_debian.iso,就可以用于系统安装了。

五、注意事项

编译系统镜像,是一个耗时耗力的工作,为了避免半途而废,一般要注意以下两点:

  1. 剩余空间足够,按照官方说的,至少提供100G的空间,以便编译工作能够顺利进行。
  2. 为了防止操作过程中,退出编译进程,建议在主机上使用screen,然后在继续操作:

    # 主系统操作
    screen -S cix-sdk
    docker exec -it orion_o6 bash
    
    # 已进入容器环境
    root@45bb20b58582:/home/honestqiao/Projects/orion-o6/cix-sdk

    然后,使用ctrl+a+d,来让screen进入后台,要再次进入之前的操作界面,使用如下的命令:

    # 主系统操作
    screen -S cix-sdk -r

    这样,原有的操作过程,就能完美的接续。

  3. 编译过程中,可以在主系统环境中安装btop,查看系统资源消耗的情况

    # 主系统操作
    sudo apt install btop
    btop

    编译需要消耗大量的CPU资源,可能直接把CPU干冒烟:
    image.png

推荐阅读
关注数
1
内容数
11
此芯AI PC开发套件瑞莎“星睿O6”评测
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息