当前位置: 首页 > 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.dtcms.com/a/266482.html

相关文章:

  • 408第三季part2 - 计算机网络 - 计算机网络基本概念
  • 闲庭信步使用SV搭建图像测试平台:第二十九课——绘制正弦波的图片
  • Android 实现底部弹窗
  • Datasophon的Ranger安装时数据库踩坑及问题解决
  • NeighborGeo:基于邻居的IP地理定位(三)
  • NeighborGeo:基于邻居的IP地理定位(二)
  • 【WEB】Polar靶场 6-10题 详细笔记
  • Jenkins-Email Extension 插件插件
  • 前端开发-前置知识
  • Android WebView 性能优化指南
  • Vue2中的keep-alive:组件状态缓存与性能优化实战指南
  • Android发展历程
  • Android 安装使用教程
  • [论文精读]StruQ: Defending Against Prompt Injection with Structured Queries
  • 前端捕获异常的全面场景及方法
  • 算法题目记录
  • OTC机器人焊机节气设备
  • EPLAN 电气制图:建立自己的部件库,添加部件-加SQL Server安装教程(三)上
  • web3钱包的运作原理
  • Type-C PD快充协议智能芯片S312L详解
  • GO 语言学习 之 结构体
  • mysql索引:索引应该选择哪种数据结构 B+树 MySQL中的页 页主体 页目录 索引分类
  • C++学习笔记一
  • Mac获取终端历史
  • Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
  • Java 与 MySQL 性能优化:MySQL全文检索查询优化实践
  • Rust+Blender:打造高性能游戏引擎
  • 宽表设计(Wide Table) 与 子表 + 类型 + 属性表设计(EAV 模型或“属性表”模型)
  • golang 中当 JSON 数据缺少结构体(struct)中定义的某些字段,会有异常吗
  • 【Modbus学习笔记】stm32实现Modbus