在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,就可以用于系统安装了。
五、注意事项
编译系统镜像,是一个耗时耗力的工作,为了避免半途而废,一般要注意以下两点:
- 剩余空间足够,按照官方说的,至少提供100G的空间,以便编译工作能够顺利进行。
为了防止操作过程中,退出编译进程,建议在主机上使用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这样,原有的操作过程,就能完美的接续。
编译过程中,可以在主系统环境中安装btop,查看系统资源消耗的情况
# 主系统操作 sudo apt install btop btop编译需要消耗大量的CPU资源,可能直接把CPU干冒烟: