使用Docker搭建基于Ubuntu22.04的milk-v duo开发环境

要快速构建一个基于Ubuntu22.04的Duo的开发环境,使用Docker是最方便的了。

Docker环境在Windows、macOS、Linux上都可以运行。要安装Docker,可以参考: Docker 安装 | 菜鸟教程

Duo官方的系统构建教程可查看: milk-v/duo-manifest (github.com)

在以下的步骤中:

  • 主机:表示实际的操作系统,也就是你正在使用的电脑的操作系统
  • docker环境:表示运行于docker里面的精简操作系统环境

一、建立Ubuntu22.04的基础docker环境:

  1. 先建立一个本地工作目录duo,方便在docker内外交换文件。
mkdir duo
cd duo
  1. 再拉取ubuntu22.04的docker官方镜像:
docker pull ubuntu:22.04
  1. 拉取完成后,就可以一步启动docker环境了:
docker run --name duo -it -v /dev:/dev --privileged -v $(pwd):/root/duo -w /root/duo ubuntu:22.04

注意:如果没有-v /dev:/dev --privileged,则在后续执行pack_sd_image打包镜像的时候会出错。

上述具体操作过程如下:

现在,基础的Ubuntu22.04环境,已经建立了,比真机和虚拟机安装Ubuntu,要快100万亿倍!!!

下面,就继续完成Duo开发环境的建立了,后续操作,都在docker环境内执行

  • 注意:如退出或者重启过docker服务,可通过如下方式重新进入:
# 进入对应docker的bash环境:
docker exec -it duo bash

# 如上一步执行没有进入,或者提示duo没有启动,那就执行下一步好了:
docker start duo -i

二、部署Duo开发环境

  1. 先更新系统,安装基础的工具包:
apt update
apt install dialog python3-dev make git bc gcc flex bison ninja-build libssl-dev \
      rsync pkg-config device-tree-compiler squashfs-tools parted dosfstools cpio unzip wget \
      curl sudo fdisk udev
  1. 检查cmake版本:
    官方安装指导中,需要手动下载cmake3.19版本安装,但上述环境启用后,直接使用apt install cmake即可,安装完检查版本即可,具体命令如下:
apt install cmake
cmake --version

  1. 安装pip,并设置系统默认python为python3
apt install python-is-python3 python3-pip
python -V
python3 -V
pip --version

注意:上面的1-3的安装软件包的步骤,其实可以一气呵成,一条命令安装:

apt install -y dialog python3-dev make git bc gcc flex bison ninja-build libssl-dev rsync pkg-config device-tree-compiler squashfs-tools parted dosfstools cpio unzip wget curl sudo fdisk udev cmake python-is-python3 python3-pip
  1. 安装最新版本的repo源码管理工具,并设置git信息:
# 安装repo
mkdir -p ~/.bin
PATH="${HOME}/.bin:${PATH}"
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
chmod a+rx ~/.bin/repo

# 设置git信息:
git config --global user.email "你的github邮箱名"
git config --global user.name "你的github用户名"
  1. 获取duo的sdk源码:
cd ~/duo
repo init -u https://github.com/milk-v/duo-manifest.git -b main -m milk-v_duo_cv180xb_sdk.xml
repo sync

在使用repo获取源码的时候,最可能遇到的一个问题就是需要使用代理,可以参考下面的命令来使用repo:

env https_proxy=192.168.1.100:8080 repo repo的其他参数

现在Duo的sdk已经拿回来了,可以进行编译了。

三、编译Duo系统

编译的详细指令如下:

source build/cvisetup.sh
defconfig cv1800b_sophpi_duo_sd
clean_all
build_all
pack_sd_image

然而,在build_all的过程中,我们会遇到著名的问题:error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
要解决这个问题,我们需要安装对应版本的lisbssl就可以了,参考 How install libssl1.1 on ubuntu 22.04 Ubuntu 22.04 源码安装 openssl 1.1 ,具体指令如下:

# 回到主机环境,执行下面的命令,进入duo的docker环境,相当于开了一个新的黑窗口
docker exec -it duo bash

# 在进入的docker环境执行
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.0g-2ubuntu4_amd64.deb
dpkg -i libssl1.1_1.1.0g-2ubuntu4_amd64.deb

wget https://www.openssl.org/source/openssl-1.1.1q.tar.gz
tar xzvf openssl-1.1.1q.tar.gz
cd openssl-1.1.1q
make
make install
echo "export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/local/lib" >> /etc/profile
exit

安装openssl完成后,回到之前的docker环境,再次进行编译:【一定要clean_all一次】

source /etc/profile
clean_all
build_all

最终结果如下,表示编译成功:

此时,再执行打包镜像命令即可:

pack_sd_image

打包成功后,输出如下:

具体的文件路径位于:~/duo/install/soc_cv1800b_sophpi_duo_sd/sophpi-duo-20230523-0723.img

四、获取编译后的镜像文件

上述最后一步,得到了打包后的镜像文件;此时,我们可以回到主机,查看对应的文件:


没有压缩的img文件很大,压缩后的img.tar.gz则很小。

这个镜像文件,就可以拿出来使用命令行的dd或者图形界面的balenaEtcher烧录到SD卡说用了。

2 Likes

感谢你的付出,这能帮到很多人。 :+1:

请把你的收件地址及论坛身份证明信息(可以是登陆后的截图)发送至邮箱:hoka@milkv.io

我会送你一个小礼品。可能会是未发售的扩展板或是一块特殊颜色的Duo。

Thanks for your dedication, this helps a lot of people.

Please send your recipient address and forum ID information (can be a screenshot after login)

Send it to hoka@milkv.io

I will send you a small gift.

顺带一提,我会将你的帖子翻译成英文,方便更多人检索到你的文章。
Incidentally, I will translate your post into English to make it easier for more people to retrieve your post.

Hi,

I found that mkimage had issues with libssl on some build systems and libc on others. U-Boot builds mkimage itself, so I found it more reliable to use the freshly built mkimage and not to use any precompiled executable. Let me know what you think and if you would like a PR for this.

Related commit on GitHub.

Thanks!

Good idea!

I have tested and the image file can be built normally.

1 Like

请问是用的mac intel芯片吗,我编译遇到了缺少riscv64-unknown-linux-musl-gcc的报错,而且从官网提供的host-tools中只有x86的gcc工具。