在 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 查看,默認情況下會自動完成網絡配置,各端口互通。