最近在地平线的SDK X3上做开发,有高手做了一些编译方法的对比:
[X3容器应用开发探索-0]开篇:从裸机编译到交叉编译
X86 Qemu for Hobot X3 PI(AARCH64) vs Hobot X3 PI
这里想借助Docker编译提速,做个笔记:
目录
一、Docker 安装
docker安装(可指定版本)
运行下面命令,查看可安装版本
apt-cache madison docker-ce | awk '{ print $3 }'
目前可以看到最新版是5:24.0.7-1~ubuntu.20.04~focal
,地平线建议版本是19.03。
查看Docker版本:
sudo docker version
Ubuntu还需要设置权限(不然每次运行docker命令前面都加上sudo)
sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker
二、系统镜像载入
以地平线针对X3的镜像为例。 有两种:
-
RDK X3的系统镜像: aarch64架构的,板子上用的就是这个了。
-
地平线的Docker镜像:x86架构的,编译完不能直接放到X3上用。 这个镜像的目的是使用的地平线提供的深度网络模型部署工具链hb_mapper,该工具链不支持arm。因此建议选GPU Docker:
wget -c ftp://vrftp.horizon.ai/Open_Explorer_gcc_9.3.0/2.6.2b/docker_openexplorer_ubuntu_20_xj3_gpu_v2.6.2b.tar.gz
2.1 ISO系统镜像转Docker镜像
针对RDK X3的系统镜像,直接烧地平线Docker镜像的跳过2.1
没有找到直接将*.iso系统文件转为Docker镜像的,还是得先把RDK X3的系统镜像烧录到板子里,然后在板子上:
切换到根目录
打包系统
# 直接排除不想打包的目录就行(/proc、/sys、/run、/dev这几个目录都是系统启动时自动生成的,虽然也属于文件系统一部分,但是他们每次开机都会有变化,所以exclude掉)
sudo tar -cvpf /tmp/x3_arm64.tar --directory=/ --exclude=proc --exclude=sys --exclude=dev --exclude=run --exclude=boot .
将压缩好的系统文件x3_arm64.tar拷贝到装有Docker的PC上去。
ref:
将Linux的系统制作成Docker镜像
Ubuntu将实体机镜像转为docker镜像
2.2 Docker镜像载入
载入刚才IOS转的镜像:
docker import x3_arm64.tar sunrise:2.0
# sunrise:2.0 是自定义的镜像和tag名称
或者 地平线提供的docker镜像:
docker load -i docker_openexplorer_ubuntu_20_xj3_gpu_v2.6.2b.tar.gz
查看系统目前拥有的镜像
docker images
打开测试下:
docker run -it sunrise:2.0 bash
针对地平线提供的docker镜像 --docker_openexplorer_ubuntu_20_xj3_gpu_v2.6.2b.tar.gz
sudo apt update
sudo apt upgrade
修改 ~/.bashrc, 选择9.3.0 版本的 aarch64-linux-gnu-gcc
# cross compiler
export PATH=$PATH:/opt/gcc-ubuntu-9.3.0-2020.03-x86_64-aarch64-linux-gnu/bin
2.3 直接拉取Ubuntu20 arm64镜像
是的,前面两种方法都无法满足我的需求,这是第三种方法了…
Docker默认拉取的是amd的,需要先修改 docker的配置文件,在服务器上开启 dockerd 的实验属性:
为配置文件 /etc/docker/daemon.json,添加 “experimental”: true。
修改后的配置文件看起来和下面的比较像:
{
"experimental": true
}
修改完成后,使用以下命令重置服务:
systemctl daemon-reload
systemctl restart docker
另外因为是异构架构,需要装QEMU模拟器:
sudo apt-get install qemu-user-static
现在拉取镜像
sudo docker pull ubuntu:20.04 --platform linux/arm64
好了,现在我的镜像有四个了…
你可能也发现了,这个系统也太小了点!!!
运行
docker run -it --platform linux/arm64 -v /usr/bin/qemu-aarch64-static:/usr/bin/qemu-aarch64-static ubuntu:20.04
以下内容可参考第三部分用vscode完成
好了,现在我们开始从零开始装库:
apt update
# 必要的编辑器,gcc
apt install build-essential
apt-get install libboost-all-dev
apt-get install libssl-dev
apt-get install cmake
apt-get install vim # 一般我喜欢用gedit,但,貌似不允许了
apt-get install git
你可能发现好像少了点什么? 是的,我们已经默认在root,再也用不着sudo了! 你要是不习惯可自行搜索怎么创建用户,然后避免你一开始就有root权限。
现在看看各个库的版本:
装opencv
apt-get install libopencv-dev
看下版本
find / -iname "*opencv*"
也可以尝试用源码安装,然后pkg-config opencv --modversion
查看版本。
ref:
如何使用 docker pull 拉取特定架构amd64、arm64、aarch64的容器镜像
docker image ubuntu 20.04 arm64
exec user process caused: exec format error
Ubuntu下查看自己安装的opencv版本号和路径以及使用cmake链接自己路径下的指定opencv版本
ubuntu 安装opencv踩坑记录
在Ubuntu上安装Boost的五种方法(全网最全,建议收藏)
重要!!!
安装完成后一定记得保存,不然下次打开你还得重装一遍!
先查看正在运行的容器
docker ps
按照ID提交该容器,形成一个新的镜像
# 提交你刚才修改的镜像,新的镜像名称为demo,版本为v1.3。
docker commit 7db69157dfbb sunrise:20
ref:
Docker 如何保存对容器/镜像的修改
Docker如何重启后数据不丢失,教你挂载数据卷Volume
2.4 删除Docker镜像
查看镜像id
docker images
docker rmi -f <image_id>
比如删除刚才ISO镜像转的
docker rmi -f 48ef7609eede
ref:
“image is being used by stopped container” error
三、安装VSCode插件
主要是这两个:
装好Docker插件后,可以看到本地镜像:
看不到可能是权限不够,要先
sudo usermod -aG docker $USER
newgrp docker
code .
绿色的是正在运行的。
使用快捷键 Ctrl+Shift+P,打开VS Code的命令输入行,选择Dev Containers: Attach to Running Container…(此时要有运行中的容器才能选择)
选择想要打开的container就会弹出一个窗口
现在就与在本地开发无异了!
有个缺点是启动太慢了。
文件传输
本地文件传到docker里直接拖拽即可;
Docker内的文件下载到本地不能直接拖拽,可以右键点击下载到本地:
命令行的形式:
docker cp <容器名称或ID>:<容器内文件路径> <宿主机目标路径>
查看正在运行的容器ID:
docker ps
ref:
VsCode在Docker中进行开发
VS Code 连接访问本地主机上的Docker容器
通过VScode往docker镜像中传入和下载文件
docker 从容器里拷贝文件
四、Docker加速
现在你又会发现,Docker的编译速度好慢! 并没有比开发板快多少,甚至还能更慢!
五、错误解决
电脑重启后再运行docker发现出现问题:
暂时的解决办法(重启后失效):
sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
ref:
启动Docker遇到 cgroups: cgroup mountpoint does not exist: unknown 报错处理