【翻车了】全程图文,mac M系列芯片基于容器开发搭建小安派开发环境

[复制链接]
查看2061 | 回复11 | 2023-11-18 01:04:07 | 显示全部楼层 |阅读模式
本帖最后由 linyuuki 于 2023-11-18 09:23 编辑

# 概要

mac Vscode中使用官方dev container在容器中部署linux环境进行开发。

# 优点

代码保存在本地,链接工具依赖包等都在容器中,不会污染本地环境。

# vscode

安装VSCODE,这个自己应该要会的。跳过不讲。

# dev container

vscode左边的扩展面板上搜索,安装就可以了。

# 安装容器

可以安装docker,也可以是其他的。
我推荐使用orbstack,不启动APP也可以操作,比较接近linux下的操作方式。
我使用homebrew安装。
先安装docker
  1. brew install --cask docker
复制代码


再安装orbstack
  1. brew install orbstack  
复制代码


# 选取镜像

dockerhub搜索ubuntu,按下图找到最新版本的实际版本号。
不建议直接用lastest,直接固定版本号下载。

SCR-20231118-baew.png

找到当前适合arm平台的最新版本哈希值,搜索一下,可以看到版本号为 jammy-20231004,右边有命令,可以直接复制。

SCR-20231118-bhna.png

SCR-20231118-bhsk.png

# 下载镜像

打开终端,输入下面的命令
启动orbstack
  1. orb
复制代码


告诉orb我想要arm架构的镜像,速度快
  1. export DOCKER_DEFAULT_PLATFORM=linux/arm64
复制代码


拉取镜像
  1. docker pull ubuntu:jammy-20231004
复制代码


等一会就OK了
SCR-20231118-bmpy.png

# 拉取代码

访达,进入工作区文件夹,按Option键,下方会出现文件夹路径,右键文件夹,选择在终端打开(找不到就算了,到时候移动文件夹也行)
我是日文系统,无视即可。
SCR-20231118-bfwr.png

输入命令,直接把代码拉取到文件夹dev_container_ubuntu22_Ai-Thinker-Open-Kits中。
  1. git clone https://github.com/Ai-Thinker-Open/AiPi-Open-Kits.git dev_container_ubuntu22_Ai-Thinker-Open-Kits
复制代码


dev_container_ubuntu22_Ai-Thinker-Open-Kits 表示在容器中开发,使用ubuntu22,代码是Ai-Thinker-Open-Kits。

这样操作和命名真的太优雅了。

# 创建容器开发

使用VSCODE打开这个文件夹,创建新的开发容器。
SCR-20231118-bred.png

输入关键字ubuntu查找
SCR-20231118-brsv.png

选择jammy
SCR-20231118-bsaw.png
其他功能不要,直接确定
SCR-20231118-bsfw.png

自动生成文件夹和文件
SCR-20231118-btms.png

修改一下.devcontainer/devcontainer.json
  1. // See https://containers.dev/implementors/json_reference/ for configuration reference
  2. {
  3. "name": "ubuntu22_Ai-Thinker-Open-Kits",
  4. "build": {
  5. "dockerfile": "Dockerfile"
  6. },
  7. "shutdownAction": "stopContainer",
  8. "remoteUser": "root"
  9. }
复制代码


再创建一个文件Dockerfile
  1. FROM ubuntu:jammy-20231004
复制代码


两个文件是这样的
SCR-20231118-bvey.png

# 启动容器

SCR-20231118-bwat.png

从下面三处可以看出,现在是在容器中。

SCR-20231118-bxem.png

刚才拉取的文件都在。

# 编译测试

安装基本工具
  1. apt-get install -y make gcc vim cmake git ninja-build
复制代码


初始化子模块
  1. git submodule init
复制代码

拉取子模块
  1. git submodule update
复制代码


文件挺大的,花了点时间
进入文件夹后执行
  1. cd aithinker_Ai-M6X_SDK
复制代码


直接执行提示没给权限,可以用chmod给权限也可以不给
  1. . install.sh
复制代码


这里又开始拉取代码,这次是工具链
最后输出
  1. .  export.sh
复制代码


# 翻车了

SCR-20231118-ceez.png

提示说没有找到/lib64/ld-linux-x86-64.so.2,因为我在arm上打算执行x86程序。。。。

# 解决错误

上图最下面给出了一个URL,关于交叉编译的说明。
  1. https://docs.orbstack.dev/machines/#multi-architecture
复制代码


这个镜像不支持sudo,已经是root用户,所以把sudo去除。
  1. dpkg --add-architecture amd64

  2. echo 'deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports lunar main restricted universe multiverse
  3. deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports lunar-updates main restricted universe multiverse
  4. deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports lunar-security main restricted universe multiverse
  5. deb [arch=amd64] http://archive.ubuntu.com/ubuntu lunar main restricted universe multiverse
  6. deb [arch=amd64] http://archive.ubuntu.com/ubuntu lunar-updates main restricted universe multiverse
  7. deb [arch=amd64] http://archive.ubuntu.com/ubuntu lunar-security main restricted universe multiverse' | tee /etc/apt/sources.list

  8. apt update
  9. apt install libc6:amd64
复制代码


安装很快。

重新执行输出,没有显示错误,输出正常

SCR-20231118-cgdt.png

# 试编译

进入示例目录,并编译
  1. cd examples/helloworld/
复制代码


# 编译失败

SCR-20231118-cirt.png

满眼错误。。。

王德发,看来用arm镜像是跑不动工具链,需要用x86镜像。

# 更改镜像

指定架构信息,重新编译。

Dockerfile如下,把基本工具的安装也集成进去。

  1. FROM --platform=linux/amd64 ubuntu:jammy-20231004

  2. RUN apt-get update &&
  3. apt-get install -y make gcc vim cmake git ninja-build
复制代码


SCR-20231118-cyzb-2.png
SCR-20231118-czlc-2.png

虽然换了一个镜像,但是刚才说了,数据都在本地,而且更换为X86架构,也不需要理会交叉编译,所以不需要重头来过。
只需要进入目录,直接编译就可以了。
  1. cd aithinker_Ai-M6X_SDK
复制代码
  1. cd examples/helloworld/
复制代码
  1. make
复制代码


进入示例目录
SCR-20231118-cqun.png
重新编译,完美结束。
SCR-20231118-crlf.png

其他系统下使用容器开发也是一样的步骤。



翻车是不可能翻车的,这辈子都不可能翻车的。


翻车的不是我,是论坛的编辑器,我点发布时图片全丢了。。。
还好我设置了截图自动保存,重新找出来,打上标记,累死我了。

那这不得发几个模块是安慰下我(笑)

本帖被以下淘专辑推荐:

回复

使用道具 举报

干簧管 | 2023-11-18 09:21:57 | 显示全部楼层
打卡
回复

使用道具 举报

lsrly | 2023-11-18 10:58:16 | 显示全部楼层
看着好复杂呀!
回复 支持 反对

使用道具 举报

qwe2079282957 | 2023-11-18 11:49:17 | 显示全部楼层
直接VBOX里面安装和docker安装有什么不同之处,是系统之间文件互通吗?
回复 支持 反对

使用道具 举报

linyuuki | 2023-11-18 14:08:02 | 显示全部楼层
qwe2079282957 发表于 2023-11-18 11:49
直接VBOX里面安装和docker安装有什么不同之处,是系统之间文件互通吗?

VBOX或者WSL或者VMware或者MacOS的rosetta,都相当于虚拟机。
Docker是装在虚拟机的linux里面的,使用的是linux的特性。

虚拟机或实体机,实现的功能是一样的。
安装了软件或者工具,那么再装其他版本,会有冲突,或者是依赖包会冲突之类的。

docker是个容器,可以想像为一个更小的虚拟系统,可以满足软件的执行。
随时可以更新容器,删除,重新创建,不会对外面的实体机或者运行它的linux造成影响。

用容器开发时,配置环境的操作,基本上只需要一次,创建的人做好之后,其他人只需要有容器环境,具体的配置就不需要管了。

如上,.devcontainer文件夹已经包含了所有需要的信息,包括linux系统版本,镜像选择,工具链的下载安装等。

换一台机器,也不需要管环境,只要启动vscode就行了。
回复 支持 反对

使用道具 举报

qwe2079282957 | 2023-11-18 15:38:59 | 显示全部楼层
WSL可以访问虚拟机以外的文件,VMWARE/VBOX好像不行,rosetta在macOS能直接访问macOS内的文件吗?我 没有买过这个app。至于docker好像比虚拟机还小的容器里,类似超精简Ubuntu,精简到只剩下基础环境。
回复 支持 反对

使用道具 举报

linyuuki | 2023-11-19 14:53:30 来自手机 | 显示全部楼层
qwe2079282957 发表于 2023-11-18 15:38
WSL可以访问虚拟机以外的文件,VMWARE/VBOX好像不行,rosetta在macOS能直接访问macOS内的文件吗?我 没有买 ...

rosetta是苹果开发的应对inter程序在arm架构下执行问题的服务,是转译。m系列上跑的是rosetta2。

原先针对x86编译的程序可以直接在m系列上执行,严格来说不是虚拟机,依赖它可以创建x86在arm上运行的虚拟机。

它是实时转译,没有隔离,所以能读写文件和其他一切功能。
回复 支持 反对

使用道具 举报

qwe2079282957 | 2023-11-19 15:01:26 | 显示全部楼层
linyuuki 发表于 2023-11-19 14:53
rosetta是苹果开发的应对inter程序在arm架构下执行问题的服务,是转译。m系列上跑的是rosetta2。

原先针 ...

懂了
回复 支持 反对

使用道具 举报

oxromantic | 2023-11-20 22:02:07 | 显示全部楼层
mac m1自己编译个toolchain就好了,烧录的啥的macosx版本的都有的
回复 支持 反对

使用道具 举报

linyuuki | 2023-11-21 21:17:41 | 显示全部楼层
oxromantic 发表于 2023-11-20 22:02
mac m1自己编译个toolchain就好了,烧录的啥的macosx版本的都有的

前两天折腾了,docker下没成功。工具链里有mac版的,但是不能直接用,错误太多,懒得弄。
这个活还是交给官方吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则