• linux 在 docker 编译 arm 应用


    在 docker 编译 arm 应用

    正常情况下 docker 是不能启动与宿主机不同架构的服务,此时要启动 arm 架构的环境,就需要提供 qemu 虚拟机的服务支持。

    关于这个 qemu 能否使用可以自行查阅。

    这将极大的方便我们在 x86 机器直接进行编译和测试 arm 的程序,测试完成后再将其送入 V831 硬件。

    如何安装

    看这个 如何在x86架构下进行ARM镜像的构建与运行 使用 alpine 版。

    使用 alpine 的好处在于 apk 安装的软件版都可以迁移到 V831 上直接使用。

    alpine 常用方法

    • apk update
    • apk add xxx

    关于 Debian 可以用 Debian + QEMU + ARM64 (aarch64) 仓库。

    如何使用

    通过 run 创建容器名为 armv7 的镜像,则需要执行如下几条命令启动:

    • docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes
    • docker start armv7 (start/stop/restart/stats)
    • docker exec -it armv7 sh

    在容器中的编译和开发注意事项。

    • 如果发现运行某个程序报错,先用 ldd 查缺少的依赖函数,分析本地与目标的依赖库差异,最底层的两个基础库多为 libc.so 和 libc++.so 提供的函数差异。
    • 如何定位和分析程序缺少的依赖函数,我们可以通过 nm -D 查看缺少的函数被哪个 so 所提供,然后具体跟踪即可(注意 V831 上还未加入 nm 命令)。

    举个例子,V831 中的程序通常编译为 32 位版本,这就会缺少 time64 等一系列和 64位 时间有关的函数。

    所以在 docker armv7 编译的 micropython 要先设置为 -mbe32 ,并且补充缺少的 libffi.so 和更新相应的 ld-musl-armhf.so 依赖库,注意 V831 中 ld-musl-armhf.so 是一个文件链接,它最终链接到 libc.so 所以我们可以直接先 cp ld-musl-armhf.so ld-musl-armhf.so.bak 后再覆盖即可。

    此时 micropython 就可以启动了。

    容器导入导出

    关键词 docker save 和 import 。

    容器与宿主机的文件传输

    可以用 docker cp 传输文件 docker cp armv7:/usr/lib/ /home/test/

    也可以直接在 run 的时候 -v 指定目录的挂载,如下示例将宿主机的 data 目录挂载到容器根目录下。

    docker run --name armv7 -i -t -v /home/juwan:/data:rw forumi0721alpinearmhf/alpine-armhf-glibc

    容器与宿主机的网络配置

    可以通过 docker network 查看,默认情况下会自动完成网络配置,各端口互通。

  • 相关阅读:
    javascript数组查重方法总结
    html5的web存储
    掌握javascript中的最基础数据结构-----数组
    ES解决geoip的location不为geo_point格式
    elk默认分片只有1000导致索引没有创建
    Polysh批量管理服务器
    Git永久删除文件和历史记录
    windows下设置JupyterNotebook默认目录
    windwos安装RabbitMQ
    win7计划任务报该任务映像己损坏或己篡改
  • 原文地址:https://www.cnblogs.com/juwan/p/14177588.html
Copyright © 2020-2023  润新知