0%

嵌入式开发--开发环境搭建

嵌入式开发环境搭建——Docker+WSL2

Docker安装Ubuntu

  1. 官方https://www.docker.com/
  1. Docker基本命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    docker search Ubuntu 	#从Docker Hub上查找ubuntu镜像
    docker pull Ubuntu #从Docker Hub上下载ubuntu镜像
    docker images -a #列出本地所有的镜像
    docker rmi Ubuntu #从Docker中删除Ubuntu镜像

    docker commit -m "提交的描述信息" -a "作者" 容器ID 要创建的目标镜像名称:[标签名]提交容器使之成为一个新的镜像
    如:docker commit -m "新的tomcat" -a "lizq" f9e29e8455a5 mytomcat:1.2

    docker run [OPTIONS] IMAGE #根据镜像新建并启动容器。IMAGE是镜像ID或镜像名称
    OPTIONS说明:
      --name=“容器新名字”:为容器指定一个名称
      -d:后台运行容器,并返回容器ID,也即启动守护式容器
      -i:以交互模式运行容器,通常与-t同时使用
      -t:为容器重新分配一个伪输入终端,通常与-i同时使用
      -P:随机端口映射
      -p:指定端口映射,有以下四种格式:
    ip:hostPort:containerPort
    ip::containerPort
    hostPort:containerPort
    containerPort
    docker ps #列出当前所有正在运行的容器
    docker ps -a #列出所有的容器
    docker ps -l #列出最近创建的容器
    exit #退出并停止容器
    Ctrl+p+q #只退出容器,不停止容器
    docker start #容器ID或容器名称启动容器
    docker restart #容器ID或容器名称重新启动容器
    docker stop #容器ID或容器名称停止容器
    docker kill #容器ID或容器名称强制停止容器
    docker rm #容器ID或容器名称删除容器
    docker rm -f #容器ID或容器名称强制删除容器
    docker exec -it #容器ID进到容器内
  2. Docker运行Ubuntu

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    > docker pull ubuntu

    > docker run -it -p 22000:22 -v /D:/mnt ubuntu /bin/bash #把D盘映射到ubuntu /mnt 目录下并运行bash 端口映射

    root@4f25326b0866:~# cat /etc/*-release #查看下OS信息
    DISTRIB_ID=Ubuntu
    DISTRIB_RELEASE=20.04
    DISTRIB_CODENAME=focal
    DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
    NAME="Ubuntu"
    VERSION="20.04.3 LTS (Focal Fossa)"
    ID=ubuntu
    ID_LIKE=debian
    PRETTY_NAME="Ubuntu 20.04.3 LTS"
    VERSION_ID="20.04"
    HOME_URL="https://www.ubuntu.com/"
    SUPPORT_URL="https://help.ubuntu.com/"
    BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
    PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
    VERSION_CODENAME=focal
    UBUNTU_CODENAME=focal

    > apt-get update #更新软件源
    > apt-get install openssh-server openssh-client vim #安装ssh服务端和客户端 vim编辑器
    > service ssh start #启动ssh服务
    > vim /etc/ssh/sshd_config #编辑/etc/ssh/sshd_config 增加PermitRootLogin yes port 22 注释#UsePAM yes
    > service ssh restart #重启ssh服务
  3. TIPS 忘记映射端口如何新增

    1
    2
    3
    4
    5
    6
    7
    8
    9
    > docker stop 4f25326b0866 #停止ID
    > docker commit 4f25326b0866 ubuntu_dev #重新镜像一个image名称未Ubuntu_dev
    sha256:474bc763fada7a618d66b2ea57759792dd4689f0102f599e08a02509add3ceea
    > docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    ubuntu_dev latest 474bc763fada 21 seconds ago 271MB
    ubuntu latest fb52e22af1b0 4 weeks ago 72.8MB
    > docker run -it -p 22000:22 ubuntu_dev #映射端口22000 至docker的22

  4. Docker运行自动开启ssh服务

    参考:https://www.swack.cn/wiki/001557409799713ca16fa7271334e4cadbf9cc76fd0d933000/0015931471097505edb31370de542088d4520607b6370df000

    首先我们想到的可定使用 systemctl,一般我们如果不是用的docker 容器的话都这么干

    1
    sudo systemctl enable ssh

    但是在容器中是无法这么干的,因为docker容器并没有使用systemctl的权限

    这里可以用脚本解决

    1
    2
    vim /root/startup_run.sh 
    chmod +x /root/startup_run.sh

    startup_run.sh 脚本内容

    1
    2
    3
    4
    5
    6
    #!/bin/bash

    LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
    echo "[$LOGTIME] startup run..." >>/root/startup_run.log
    service ssh start >>/root/startup_run.log
    #service mysql start >>/root/startup_run.log

    将脚本加入到启动文件中

    1
    vim /root/.bashrc

    .bashrc末尾增加如下语句

    1
    2
    3
    4
    # startup run
    if [ -f /root/startup_run.sh ]; then
    . /root/startup_run.sh
    fi

    这样就能实现开机启动ssh了

    经多方调研,发现镜像启动时,自动执行的是~/.bashrc文件,所以,环境变量需要配置在该文件内,这样镜像启动时,可自动执行该文件,使环境变量生效。

  5. 安装CMake

    1
    apt-get install cmake
  6. 安装gcc g++

    1
    apt-get install build-essential
  7. 指定交叉编译器

    下载交叉编译器https://releases.linaro.org/components/toolchain/binaries/

    放入D:\ToolChain\gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf

    之前将D盘映射到了/mnt目录下 /mnt/ToolChain/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin

    配置环境变量

    1
    2
    3
    4
    5
    6
    7
    8
    1、打开编辑~/.bashrc 文件
    vim ~/.bashrc
    2、在最底部添加以下内容
    export PATH=$PATH:/mnt/ToolChain/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin
    3、使环境变量立即生效
    source ~/.bashrc
    4、验证有没生效
    arm-linux-gnueabihf-gcc -v

VS Code ssh远程连接

  1. 安装VS Code

    https://code.visualstudio.com/

  2. 安装插件

    Remote-SSH

  3. Remote Explorer中新建ssh 连接到docker的Ubuntu

    ssh root@localhost -p 22000

  4. 安装插件

    CMake

    CMake Tools

    C/C++

GDB Server远程调试

  1. 拷贝可执行程序到开发板这里以生成的mqtt为例

    1
    2
    3
    4
    scp mqtt root@192.168.10.2:/tmp
    scp ../lib/libpaho-mqtt3a.so root@192.168.10.2:/tmp/libpaho-mqtt3a.so.1
    scp ../lib/libpaho-mqtt3c.so root@192.168.10.2:/tmp/libpaho-mqtt3c.so.1
    scp /mnt/ToolChain/gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf/bin/gdbserver root@192.168.10.2:/tmp
  2. ssh 连接至开发板

    1
    2
    3
    4
    ssh root@192.168.10.2
    cd /tmp
    export LD_LIBRARY_PATH=/tmp:$LD_LIBRARY_PATH #新增libpath
    ./mqtt
  3. gdbsever远程调试

    1
    gdbserver 192.168.10.4:1234 mqtt
  4. 问题

    gdb 提示没有libncurses5安装

    1
    2
    3
    4
    5
    https://stackoverflow.com/questions/17005654/error-while-loading-shared-libraries-libncurses-so-5

    find /usr/lib/ -name *ncurses*
    $ sudo ln -s /usr/lib/libncursesw.so.6.0 /usr/lib/libncurses.so.5
    $ sudo ln -s /usr/lib/libncursesw.so.6.0 /usr/lib/libtinfo.so.5

    提示没安装libpython2.7

    1
    apt-get install libpython2.7