当前位置: 首页 > news >正文

基于Docker构建OrangePi5 SDK环境

官方推荐的是直接在Host机器上使用SDK构建相关镜像,但是使用Docker方便隔离各个编译环境。

测试通过的Host环境:
Ubuntu24.04主机。
WSL2

  1. 拉取Docker镜像
    官方推荐Ubuntu22.04版本。
    docker pull ubuntu:22.04
    
  2. 创建容器
    docker run --name dev-orangepi -it --privileged=true --net=host -v /lib/modules:/lib/modules -v /dev:/dev -v $HOME/workspace:$HOME/workspace ubuntu:22.04 /bin/bash
    
  3. 修改源
    官方推荐清华源,参考此文档:清华源
  4. 安装一些基本依赖工具
    这些工具不是全部必须的,只是因为我的初始Docker环境是用我其它环境的Dockerfile构建的,里面的工具我也不清楚哪些是必须的。可以先忽略此步骤,后面遇到缺什么装什么
    apt-get update
    apt-get upgrade -y
    apt-get install -y vim
    apt-get install -y libncurses5-dev build-essential bison flex libssl-dev git fdisk
    
  5. 拉取SDK
    cd ~/workspace
    git clone https://github.com/orangepi-xunlong/orangepi-build.git -b next
    
  6. 构建镜像
    直接图形化界面选择构建完整镜像。我构建的文件系统是无桌面Ubuntu20.04 Server版本。
    ./build.sh
    
  7. 各种问题

chroot报错

[ o.k. ] Installing base system [ Stage 2/2 ]
chroot: failed to run command '/bin/bash': No such file or directory
[ error ] ERROR in function create_rootfs_cache [ ./build.sh:305 -> scripts/main.sh:641 -> scripts/main.sh:610 -> scripts/debootstrap.sh:50 -> scripts/debootstrap.sh:236 -> scripts/general.sh:0 ]
[ error ] Debootstrap base system for current orangepi5plus focal   no second stage failed
[ o.k. ] Process terminated

Host构建没有问题,Host构建完后,再使用Docker构建,Docker内也能成功构建。
网上搜到一篇类似的文章,可能是解决方案:issues

挂载<path to>/binfmt_misc问题

mount: /proc/sys/fs/binfmt_misc: permission denied.
mount: /proc/sys/fs/binfmt_misc: permission denied.
update-binfmts: warning: Couldn't mount the binfmt_misc filesystem on /proc/sys/fs/binfmt_misc.
mount: /proc/sys/fs/binfmt_misc: permission denied.
update-binfmts: warning: Couldn't mount the binfmt_misc filesystem on /proc/sys/fs/binfmt_misc.

创建Docker容器需要--privileged选项。
使用如下的命令可测试创建的Docker是否能够成功挂载:

sudo apt-get update && sudo apt install -y qemu-user-binfmt
sudo update-binfmts --enable qemu-aarch64
update-binfmts --display| grep qemu-aarch64
# 状态为 enabled 即正常
qemu-aarch64 (enabled):

sfdisk工具未安装

[ error ] ERROR in function prepare_partitions [ ./build.sh:305 -> scripts/main.sh:641 -> scripts/main.sh:610 -> scripts/debootstrap.sh:93 -> scripts/debootstrap.sh:630 -> scripts/general.sh:0 ]
[ error ] Partition fail. Please check [ ~/workspace/orangepi-build/output/debug/install.log ]
[ o.k. ] Process terminated

需要查看对应的log文件才能知道具体报错信息:

# 查看log
vim ~/workspace/orangepi-build/output/debug/install.log# 最后的报错信息
~/workspace/orangepi-build/scripts/debootstrap.sh: line 629: sfdisk: command not found

安装工具:

sudo apt install fdisk

check_loop_device函数报错

[ error ] ERROR in function check_loop_device [ ./build.sh:305 -> scripts/main.sh:641 -> scripts/main.sh:610 -> scripts/debootstrap.sh:93 -> scripts/debootstrap.sh:666 -> scripts/image-helpers.sh:108 -> scripts/general.sh:0 ]
[ error ] Device node /dev/loop3p2 does not exist
[ o.k. ] Process terminated

解决方案:

# 创建`Docker`时添加如下参数
-v /lib/modules:/lib/modules -v /dev:/dev

解决过程:

网上没有搜出来直接的解决方案,有说要先确保有loop驱动的存在:

docker挂载ISO/分区时报failed to setup loop device: No such file or directory - OSCHINA - 中文开源技术交流社区
尝试一下:

lsmod | grep loop

实际上这个命令什么也不会输出,说的是loop.ko必须以built-in的方式被内核加载,所以是看不到有驱动模块的。

https://askubuntu.com/questions/666880/loop-module-not-present-on-ubuntu-installation

modprobe loop
# 报错
modprobe: FATAL: Module loop not found in directory /lib/modules/6.11.0-26-generic

理论上这命令也是没用的,上面说了,loop并不是通过ko方式加载。但是却发现了这个命令在Host执行没问题,但在Docker执行会报错。

参考该文档,映射/lib/modules目录到Docker

https://stackoverflow.com/questions/62455239/making-building-a-kernel-module-inside-a-docker-container

执行完上面步骤后仍然不能解决问题,尝试将/dev目录也映射到Docker,成功解决问题。
成功生成镜像:

[ o.k. ] SHA256 calculating [ Orangepi5plus_1.2.0_ubuntu_focal_server_linux6.1.43.img ]
[ o.k. ] Done building [ ~/workspace/OrangePi5/orangepi-build/output/images/Orangepi5plus_1.2.0_ubuntu_focal_server_linux6.1.43/Orangepi5plus_1.2.0_ubuntu_focal_server_linux6.1.43.img ]
[ o.k. ] Runtime [ 20 min ]
[ o.k. ] Repeat Build Options [ sudo ./build.sh  BOARD=orangepi5plus BRANCH=current BUILD_OPT=image RELEASE=focal BUILD_MINIMAL=no BUILD_DESKTOP=no KERNEL_CONFIGURE=no COMPRESS_OUTPUTIMAGE=sha,gpg,img  ]
http://www.lryc.cn/news/580048.html

相关文章:

  • 使用mindie:2.0.RC2-800I-A2-py311-openeuler24.03-lts制作一个通用的模型推理性能测试的镜像
  • Windows 10/11 PC平台关闭禁用系统自动上传相关隐私数据手册
  • TDengine STMT2 API 使用指南
  • HarmonyOS-ArkUI 手势系列4--多层级手势
  • Spring Boot 中常用的工具类库及其使用示例(完整版)
  • 洛谷P1941 [NOIP 2014 提高组] 飞扬的小鸟
  • 行阶梯形矩阵和行最简形矩阵的区别
  • 【WRFDA教程第十期】混合数据同化(Hybrid Data Assimilation)
  • 【C++复习1】基础篇
  • 负载均衡--常见负载均衡算法
  • 大带宽服务器中冗余技术的功能
  • 【深度解析】Seedance 1.0:重新定义 AI 视频生成的工业级标准
  • 10.双端Diff算法
  • [代码学习] c++ 通过H矩阵快速生成图像对应的mask
  • 嵌入式C语言:指针
  • Jenkins-Email Extension 插件插件
  • ubuntu 18.04配置镜像源
  • ubuntu22桌面版中文输入法 fcitx5
  • 运维打铁:企业云服务解决方案
  • 金融系统中常用的FIX协议
  • 企业电商解决方案哪家好?ZKmall模块商城全渠道支持 + 定制化服务更省心
  • 文本分词 nltk
  • ODS 系统是什么?企业为什么需要搭建 ODS?
  • CentOS配置网络
  • 【Oracle APEX开发小技巧15】多级弹窗关闭子级保留父级
  • 建议大家都去频繁大量地记录自己:让目标在笔尖下生根发芽
  • 【银行测试】手机银行APP专项项目+测试点汇总(一)
  • 【烧脑算法】最小字典序:巧用单调栈,从栈底到最优解
  • Jmeter安装使用-测试Java接口
  • iOS IPA 混淆,如何对企业定制 App 做渠道差异化保护